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

293 lines
9.0 KiB
Markdown
Raw Normal View History

2026-06-10 11:08:40 +08:00
---
tags:
- 算法设计与分析
- 试题
- 武汉科技大学
create time: 2026-06-10 10:00
---
# 试题 3 — 武汉科技大学《算法设计与分析》
## 概述
- **课程**:算法设计与分析
- **学校**:武汉科技大学(2012级计算机学院)
- **题型**:单项选择题、判断题、简答题、程序填空题、算法设计与编程题
- **知识点**:递归复杂度、排序算法、图搜索(BFS/DFS)、动态规划、回溯法
> [!tip] 学习建议
> 本试题覆盖了算法设计的核心方法论,特别关注 **BFS与DFS的对比** 和 **动态规划的基本思想**。建议结合代码填空题加深对递归框架的理解。
## 正文
### 一、单项选择题(每题2分,共10题,20分)
**从备选的答案中选出合适的答案,并把答案标号写在答题纸中。**
1. 下列哪些不是算法的 3 要素( )。
- A. 操作
- B. 控制结构
- C. 数据结构
- D. 输入输出
2. 冒泡排序的时间复杂度为( )。
- A. O(n)
- B. O(n²)
- C. O(n³)
- D. O(nlogn)
3. 下列算法中错误的是( )。
- A. 算法的每一步骤必须有确切的含义
- B. 算法的时间复杂度与实现语言无关
- C. 对于特殊的输入,算法的时间复杂度可以是不固定的
- D. 算法的运行时间与编写程序的语言无关
4. 求 n 个数中的最小数,时间复杂度为( )。
- A. O(1)
- B. O(n)
- C. O(n²)
- D. O(nlogn)
5. 调用函数 `int fib(int n) { return (n>1 ? fib(n-1)+fib(n-2) : n); }` 时间复杂度是( )。
- A. O(n)
- B. O(n²)
- C. O(2ⁿ)
- D. 无递归调用
6. 栈是一种基于什么机制实现的数据结构?( )
- A. 先进先出
- B. 先进后出
- C. 随机存取
- D. 索引存取
7. 流程图是描述算法的常用工具,下列哪种符号表示判断( )。
- A. 圆形
- B. 椭圆形
- C. 菱形
- D. 平行四边形
8. 深度优先遍历在搜索空间树上的搜索方式为( )。
- A. 广度优先
- B. 深度优先
- C. 最小耗费优先
- D. 综合优先
9. 下述算法中正确的是( )。
- A. 广度优先遍历算法只适合于无向图
- B. 广度优先遍历算法只适合于有向图
- C. 遍历一个无向图可能需要多次调用DFS或BFS
- D. 只需一次调用DFS或BFS即可遍历一个无向图
10. 以下关于迭代法的描述中,正确的是( )。
- A. 迭代算法在逻辑上总是可以转换为与它等价的递归算法
- B. 每个递归算法在逻辑上总是可以转换为与它等价的循环结构算法
- C. 迭代算法的可靠性比递归算法好
- D. 迭代算法的执行效率一定比递归算法好
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|------|---|---|---|---|---|---|---|---|---|---|
| 答案 | D | B | C | B | C | B | C | B | C | A |
> [!warning] 易错点
> 第1题:算法三要素是**操作、控制结构、数据结构**,输入输出是算法的四个特性之一,不是三要素之一。第5题:斐波那契递归的时间复杂度是 O(2ⁿ)。第9题:无向图的连通分量可能需要多次调用BFS/DFS。
---
### 二、判断题(每题2分,共10题,20分)
**正确的在括号内填 √,错误的填 ×。**
1. 算法中的状态和步骤具有有穷性。( )
2. 一个算法应该适用于解决某类问题。( )
3. O(n²) 和 O(3n²+3) 的两个算法的时间复杂度相同。( )
4. 经验空间复杂度是指算法在执行过程中临时占用存储空间的大小。( )
5. 回溯法就是穷举法,所不同的是对一般问题回溯法比穷举法效率低。( )
6. 一个算法一般适用于一个特定类型的问题。( )
7. 动态规划适合求解具有重叠子问题性质的问题。( )
8. 贪心算法和动态规划法都用于求解最优问题,且在每一步只做一次决策。( )
**参考答案:**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|------|---|---|---|---|---|---|---|---|
| 答案 | × | √ | √ | × | × | √ | √ | × |
> [!note] 知识点辨析
> 第1题:算法的有穷性是指算法必须在有限步骤内结束,而不是"状态和步骤具有有穷性"。第5题:回溯法通过剪枝函数避免了穷举法的盲目搜索,效率通常更高。
---
### 三、简答题(每题6分,共4题,24分)
#### 1. 层优先遍历
在该树中,如果按照层优先化 M 的编排,即节点 1 开始,依次遍历其儿子节点 2, 3, …,请依次给出遍历到的第五个节点和第八个节点的编号。
**参考答案:**
按照层优先(广度优先)遍历,第五个节点编号为 **5**,第八个节点编号为 **8**。
```mermaid
flowchart TD
A["1"] --> B["2"]
A --> C["3"]
B --> D["4"]
B --> E["5"]
C --> F["6"]
C --> G["7"]
D --> H["8"]
```
> [!tip] 答题技巧
> 层优先遍历即 BFS,使用**队列**数据结构。按层级从左到右依次访问节点,第 n 层的节点在第 n+1 层之前全部被访问。
#### 2. 背包问题的贪心步骤
用贪心算法解决背包问题的基本步骤。
**参考答案:**
1. 计算每个物品的**性价比**(价值/重量)
2. 按性价比从高到低排序
3. 依次装入背包,直到背包装满或物品用完
> [!warning] 易错点
> 贪心法只能得到分数背包问题的最优解,对于 **0-1背包问题**(每个物品只能选或不选),贪心法不能保证最优解,需要用动态规划。
#### 3. 兔子问题(斐波那契数列)
一对初生的兔子满第三个月开始生小兔子,每对兔子生完一对小兔子后……小兔子长到第三个月也会生小兔子。假设不考虑兔子死亡,请问一年中共有多少对兔子?写出递推公式。
**参考答案:**
设第 n 个月的兔子对数为 f(n):
- f(1) = 1,f(2) = 1
- f(n) = f(n-1) + f(n-2),n ≥ 3
一年后(第12个月):**f(12) = 144 对**
#### 4. 动态规划与分治法的异同
简要说明动态规划法与分治法的相似性和区别。
**参考答案:**
| 特性 | 分治法 | 动态规划 |
|------|--------|----------|
| 子问题 | 相互独立,不重叠 | 有重叠子问题 |
| 存储 | 不存储中间结果 | 表格存储中间结果 |
| 求解方向 | 自顶向下递归 | 自底向上递推或记忆化搜索 |
| 适用条件 | 可分解可合并 | 最优子结构 + 重叠子问题 |
---
### 四、程序填空题(每空2分,2×10=20分)
#### 1. 递归回溯框架
```c
try(int i) {
if (i <= 20) { // (1) 判断是否到达目标
if (check1(i) && check2(i))
output(i); // 输出结果
else
try(i+1); // 递归
}
}
check1(int x) {
for (int j = 2; j <= x-1; j++)
if (x % j == 0) return 0; // (2) 判断是否为素数
return 1;
}
```
**(1)** `i <= 20`  **(2)** `x % j == 0`
#### 2. 迷宫搜索
```c
search(int i, int j) {
for (int di = -1; di <= 1; di++)
for (int dj = -1; dj <= 1; dj++) {
if (maze[i+di][j+dj] == 1) { // (3) 可通行
maze[i+di][j+dj] = 2; // 标记已访问
search(i+di, j+dj);
}
}
maze[i][j] = 0; // 回溯
}
```
**(3)** `1`
> [!note] 教学提示
> 迷宫搜索是回溯法的典型应用。用标记数组或修改原数组来记录已访问的位置,回溯时恢复原值。
---
### 五、算法设计与编程题(每题15分,共2题,30分)
#### 1. 图的着色问题(回溯法)
图1是一个正在构造的四色地图,使用至多四种不同颜色对地图进行涂色,相同区域相邻颜色不同。
**参考答案:**
**算法策略:回溯法**,依次为每个区域着色(1-4),检查相邻区域是否同色。
```c
int data[6][6] = {0}; // 邻接矩阵
int color[6] = {0};
void tryColor(int s) {
if (s > 6) { output(); return; }
for (int i = 1; i <= 4; i++) {
color[s] = i;
if (colorSame(s) == 0) tryColor(s + 1);
color[s] = 0;
}
}
int colorSame(int s) {
for (int i = 1; i <= s-1; i++)
if (data[i][s]==1 && color[i]==color[s]) return 1;
return 0;
}
```
**时间复杂度**:O(4ⁿ)
#### 2. 流水作业调度(Johnson算法)
某厂有 m 个加工任务,在印刷车间和装订车间所需时间如下表。如何安排使加工时间最短。
| 任务 | J1 | J2 | J3 | J4 | J5 | J6 |
|------|----|----|----|----|----|-----|
| 印刷 | 3 | 12 | 5 | 2 | 9 | 11 |
| 装订 | 8 | 10 | 9 | 6 | 3 | 1 |
**参考答案:**
**Johnson算法**:找最小加工时间,若在印刷车间则排最前,若在装订车间则排最后。
最优顺序:**J4→J1→J3→J2→J5→J6**,最短加工时间:**43天**
```mermaid
flowchart LR
A["Build Time Matrix"] --> B{"Find Minimum"}
B -->|"In Row 1"| C["Place at Front"]
B -->|"In Row 2"| D["Place at End"]
C --> E["Remove & Repeat"]
D --> E
E --> B
```
---
## 关联笔记
- [[算法设计与分析/试题册/试题1]]
- [[算法设计与分析/试题册/试题2]]