Files
final-exam/算法设计与分析/试题册/试题4.md
T

297 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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]]