297 lines
9.1 KiB
Markdown
297 lines
9.1 KiB
Markdown
|
|
---
|
|||
|
|
tags:
|
|||
|
|
- 算法设计与分析
|
|||
|
|
- 试题
|
|||
|
|
- 武汉科技大学
|
|||
|
|
create time: 2026-06-10 10:00
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 试题 4 — 武汉科技大学《算法设计与分析》
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
- **课程**:算法设计与分析
|
|||
|
|
- **学校**:武汉科技大学(2015级计算机学院)
|
|||
|
|
- **题型**:单项选择题、判断题、简答题、算法设计与编程题
|
|||
|
|
- **知识点**:递归复杂度、排序算法、AlphaGo与AI、图搜索、回溯法、动态规划、贪心法
|
|||
|
|
|
|||
|
|
> [!tip] 学习建议
|
|||
|
|
> 本试题涉及 AlphaGo 等前沿话题,建议关注算法在实际应用中的体现。重点掌握 **回溯法框架** 和 **两台机器流水作业调度(Johnson算法)**。
|
|||
|
|
|
|||
|
|
## 正文
|
|||
|
|
|
|||
|
|
### 一、单项选择题(每题2分,共15题,30分)
|
|||
|
|
|
|||
|
|
**从备选的答案中选出合适的答案,并把答案标号写在答题纸中。**
|
|||
|
|
|
|||
|
|
1. 求某个问题的递归算法如下:`f(1)=1; f(n)=Max{f(n-1), f(n-2)+1} (n>1)`,则该算法的时间复杂度 T(n) 为( )。
|
|||
|
|
- A. T(n) = T(n-1) + 1
|
|||
|
|
- B. T(n) = T(n-2) + T(n-1) + 1
|
|||
|
|
- C. T(n) = T(n-2) + 2T(n-1) + 1
|
|||
|
|
- D. T(n) = 2T(n-1) + 2T(n-2) + 1
|
|||
|
|
|
|||
|
|
2. 下列哪个问题的类型适合用贪心法( )。
|
|||
|
|
- A. 汉诺塔问题
|
|||
|
|
- B. 矩阵连乘
|
|||
|
|
- C. 八皇后
|
|||
|
|
- D. 最长公共子序列
|
|||
|
|
|
|||
|
|
3. 下列关于动态规划法的描述中,正确的是( )。
|
|||
|
|
- A. 递归算法的时间复杂度一定优于动态规划法
|
|||
|
|
- B. 动态规划的子问题可以不独立
|
|||
|
|
- C. 动态规划法的每一步的决策结果取决于之前所有的决策
|
|||
|
|
- D. 动态规划适用于具有最优子结构和重叠子问题性质的问题
|
|||
|
|
|
|||
|
|
4. 对长度为 n 的线性表排序,在最坏情况下,比较次数不是 n(n-1)/2 的排序方法是( )。
|
|||
|
|
- A. 快速排序
|
|||
|
|
- B. 冒泡排序
|
|||
|
|
- C. 直接插入排序
|
|||
|
|
- D. 简单选择排序
|
|||
|
|
|
|||
|
|
5. AlphaGo 主要使用的算法是( )。
|
|||
|
|
- A. Deep Learning
|
|||
|
|
- B. Deep Mind
|
|||
|
|
- C. Java++
|
|||
|
|
- D. C++
|
|||
|
|
|
|||
|
|
6. 函数 `int func(int n) { int r=0; while(n--) r++; return r; }` 的时间复杂度是( )。
|
|||
|
|
- A. O(1)
|
|||
|
|
- B. O(n)
|
|||
|
|
- C. O(n²)
|
|||
|
|
- D. 无递归调用
|
|||
|
|
|
|||
|
|
7. 栈是一种基于什么机制实现的数据结构?( )
|
|||
|
|
- A. 先进先出
|
|||
|
|
- B. 先进后出
|
|||
|
|
- C. 随机存取
|
|||
|
|
- D. 索引存取
|
|||
|
|
|
|||
|
|
8. 流程图中表示判断的符号是( )。
|
|||
|
|
- A. 圆形
|
|||
|
|
- B. 椭圆形
|
|||
|
|
- C. 菱形
|
|||
|
|
- D. 平行四边形
|
|||
|
|
|
|||
|
|
9. 深度优先遍历在搜索空间树上的搜索方式为( )。
|
|||
|
|
- A. 广度优先
|
|||
|
|
- B. 深度优先
|
|||
|
|
- C. 最小耗费优先
|
|||
|
|
- D. 综合优先
|
|||
|
|
|
|||
|
|
10. 下述算法中正确的是( )。
|
|||
|
|
- A. 广度优先遍历算法只适合于无向图
|
|||
|
|
- B. 广度优先遍历算法只适合于有向图
|
|||
|
|
- C. 遍历一个无向图可能需要多次调用DFS或BFS
|
|||
|
|
- D. 只需一次调用DFS或BFS即可遍历一个无向图
|
|||
|
|
|
|||
|
|
11. 以下关于迭代法的描述中,正确的是( )。
|
|||
|
|
- A. 迭代算法在逻辑上总是可以转换为与它等价的递归算法
|
|||
|
|
- B. 每个递归算法在逻辑上总是可以转换为与它等价的循环结构算法
|
|||
|
|
- C. 迭代算法的可靠性比递归算法好
|
|||
|
|
- D. 迭代算法的执行效率一定比递归算法好
|
|||
|
|
|
|||
|
|
12. ( )阶段是优化决策解决问题的过程。
|
|||
|
|
- A. 贪心算法
|
|||
|
|
- B. 动态规划
|
|||
|
|
- C. 分支限界
|
|||
|
|
- D. 迭代算法
|
|||
|
|
|
|||
|
|
13. 在算法的广度优先搜索策略中,一般采用的数据结构是( )。
|
|||
|
|
|
|||
|
|
14. 联欢晚会报数问题,凡是报3的人出列,编号为( )可以胜出。
|
|||
|
|
- A. 27
|
|||
|
|
- B. 33
|
|||
|
|
- C. 48
|
|||
|
|
- D. 144
|
|||
|
|
|
|||
|
|
15. 人工智能(AI)的英文全称是( )。
|
|||
|
|
- A. Automatic Intelligence
|
|||
|
|
- B. Automatic Information
|
|||
|
|
- C. Artificial Intelligence
|
|||
|
|
- D. Artificial Information
|
|||
|
|
|
|||
|
|
**参考答案:**
|
|||
|
|
|
|||
|
|
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|
|||
|
|
|------|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|||
|
|
| 答案 | B | A | D | C | A | B | B | C | B | C | A | B | B | A | C |
|
|||
|
|
|
|||
|
|
> [!warning] 易错点
|
|||
|
|
> 第3题:动态规划的两个关键性质是**最优子结构**和**重叠子问题**,选D。第4题:快速排序最坏情况比较次数为 O(n²),但不是恰好 n(n-1)/2。第15题:AI = Artificial Intelligence(人工智能)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 二、判断题(每题2分,共10题,20分)
|
|||
|
|
|
|||
|
|
**正确的在括号内填 √,错误的填 ×。**
|
|||
|
|
|
|||
|
|
1. 递归算法中的递归调用不能超过一定次数。( )
|
|||
|
|
2. 如果有 n 阶台阶,可以一次上1阶,也可以一次上2阶,设计算法计算共有多少种上法。( )
|
|||
|
|
3. 简述动态规划的基本思想步骤。( )
|
|||
|
|
4. 递归算法在规模为 n 时需要递归调用自身。( )
|
|||
|
|
5. 深度优先搜索算法使用队列数据结构。( )
|
|||
|
|
6. 用图的顶点表示活动,用边表示活动之间的优先关系,称为 AOE 网。( )
|
|||
|
|
7. 回溯法的解空间一定是树结构。( )
|
|||
|
|
8. 回溯法通常使用深度优先搜索策略。( )
|
|||
|
|
|
|||
|
|
**参考答案:**
|
|||
|
|
|
|||
|
|
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|
|||
|
|
|------|---|---|---|---|---|---|---|---|
|
|||
|
|
| 答案 | × | √ | × | √ | × | × | √ | √ |
|
|||
|
|
|
|||
|
|
> [!note] 知识点辨析
|
|||
|
|
> 第5题:DFS使用**栈**(或递归调用栈),BFS使用**队列**。第6题:AOE网(Activity On Edge)用**边**表示活动,顶点表示事件;AOV网(Activity On Vertex)用顶点表示活动。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 三、简答题(每题10分,共2题,20分)
|
|||
|
|
|
|||
|
|
#### 1. 回溯法的基本框架
|
|||
|
|
|
|||
|
|
**参考答案:**
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
void backtrack(int t) {
|
|||
|
|
if (t > n) {
|
|||
|
|
updateSolution(); // 到达叶节点,记录最优解
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
for (int i = 0; i < numChoices(t); i++) {
|
|||
|
|
x[t] = choice(t, i); // 做选择
|
|||
|
|
if (constraint(t)) { // 剪枝判断
|
|||
|
|
backtrack(t + 1); // 递归
|
|||
|
|
}
|
|||
|
|
// 撤销选择(回溯)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- **解空间**:子集树或排列树
|
|||
|
|
- **搜索策略**:深度优先搜索(DFS)
|
|||
|
|
- **剪枝函数**:约束函数 + 限界函数
|
|||
|
|
- **时间复杂度**:最坏 O(2ⁿ) 或 O(n!)
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
flowchart TD
|
|||
|
|
A["backtrack(t)"] --> B{"t > n?"}
|
|||
|
|
B -->|"Yes"| C["Record Solution"]
|
|||
|
|
B -->|"No"| D["For each choice i"]
|
|||
|
|
D --> E["x[t] = choice(i)"]
|
|||
|
|
E --> F{"constraint OK?"}
|
|||
|
|
F -->|"Yes"| G["backtrack(t+1)"]
|
|||
|
|
F -->|"No"| H["Prune"]
|
|||
|
|
G --> D
|
|||
|
|
H --> D
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 假币问题(分治法)
|
|||
|
|
|
|||
|
|
有 n 个银币,其中有一个假币(重量较轻),用天平称量找出假币。设计算法找出至少需要称多少次。
|
|||
|
|
|
|||
|
|
**参考答案:**
|
|||
|
|
|
|||
|
|
**算法策略:分治法**
|
|||
|
|
|
|||
|
|
将银币分为三组(尽量均分),用天平称量两组:
|
|||
|
|
- 若等重 → 假币在第三组
|
|||
|
|
- 若不等重 → 假币在较轻的一组
|
|||
|
|
|
|||
|
|
递归处理,直到只剩1个银币。
|
|||
|
|
|
|||
|
|
**最少称量次数**:⌈log₃n⌉ 次
|
|||
|
|
|
|||
|
|
> [!tip] 关键理解
|
|||
|
|
> 每次称量可以将搜索范围缩小为原来的 1/3,因此需要 ⌈log₃n⌉ 次。这是分治法的经典应用——每次将问题规模缩小。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 四、算法设计与编程题(每题15分,共2题,30分)
|
|||
|
|
|
|||
|
|
#### 1. 图的着色问题(回溯法)
|
|||
|
|
|
|||
|
|
使用至多四种不同颜色对地图进行涂色,要求相邻区域颜色互不相同。
|
|||
|
|
|
|||
|
|
**参考答案:**
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
int n = 4; // 4种颜色
|
|||
|
|
int color[100] = {0};
|
|||
|
|
int graph[100][100] = {0};
|
|||
|
|
|
|||
|
|
void tryColor(int t) {
|
|||
|
|
if (t > 6) { output(); return; }
|
|||
|
|
for (int i = 1; i <= n; i++) {
|
|||
|
|
color[t] = i;
|
|||
|
|
if (colorSame(t) == 0) tryColor(t + 1);
|
|||
|
|
color[t] = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int colorSame(int s) {
|
|||
|
|
for (int i = 1; i <= s-1; i++)
|
|||
|
|
if (graph[i][s]==1 && color[i]==color[s]) return 1;
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**时间复杂度**:O(4ⁿ)
|
|||
|
|
|
|||
|
|
> [!note] 教学提示
|
|||
|
|
> 图着色问题是NP-hard问题,对于小规模地图可以用回溯法暴力搜索。实际应用中常用近似算法或启发式算法。
|
|||
|
|
|
|||
|
|
#### 2. 两台机器流水作业调度(Johnson算法)
|
|||
|
|
|
|||
|
|
设有 n 个作业需要在两台机器上加工,每个作业先在机器1上加工,然后在机器2上加工。
|
|||
|
|
|
|||
|
|
**参考答案:**
|
|||
|
|
|
|||
|
|
**Johnson算法步骤:**
|
|||
|
|
1. 在加工时间矩阵中找最小元素
|
|||
|
|
2. 若在机器1(上行)→ 排在最前面
|
|||
|
|
3. 若在机器2(下行)→ 排在最后面
|
|||
|
|
4. 划掉已排定的作业,重复
|
|||
|
|
|
|||
|
|
**最优顺序**:J4→J1→J3→J2→J5→J6,总加工时间:**43天**
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
int job[6][2] = {{3,8},{12,10},{5,9},{2,6},{9,3},{11,1}};
|
|||
|
|
int x[6], bestx[6], bestf = 32767;
|
|||
|
|
int f1 = 0, f2[7] = {0};
|
|||
|
|
|
|||
|
|
void tryJob(int i) {
|
|||
|
|
if (i == 6) {
|
|||
|
|
for (int j = 0; j < 6; j++) bestx[j] = x[j];
|
|||
|
|
bestf = f2[i];
|
|||
|
|
} else {
|
|||
|
|
for (int j = i; j < 6; j++) {
|
|||
|
|
f1 += job[x[j]][0];
|
|||
|
|
f2[i] = (f2[i-1] > f1 ? f2[i-1] : f1) + job[x[j]][1];
|
|||
|
|
if (f2[i] < bestf) {
|
|||
|
|
swap(x[i], x[j]);
|
|||
|
|
tryJob(i + 1);
|
|||
|
|
swap(x[i], x[j]); // 回溯
|
|||
|
|
}
|
|||
|
|
f1 -= job[x[j]][0];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
flowchart LR
|
|||
|
|
A["Time Matrix"] --> B{"Find Min Element"}
|
|||
|
|
B -->|"Row 1 (Machine 1)"| C["Place at Front"]
|
|||
|
|
B -->|"Row 2 (Machine 2)"| D["Place at End"]
|
|||
|
|
C --> E["Remove & Repeat"]
|
|||
|
|
D --> E
|
|||
|
|
E -->|"All Scheduled"| F["Optimal Sequence"]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 关联笔记
|
|||
|
|
|
|||
|
|
- [[算法设计与分析/试题册/试题1]]
|
|||
|
|
- [[算法设计与分析/试题册/试题2]]
|