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

293 lines
9.0 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
---
# 试题 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]]