vault backup: 2026-06-10 11:08:40

This commit is contained in:
2026-06-10 11:08:40 +08:00
parent 9957dcbcfa
commit 89e183aaaa
23 changed files with 4920 additions and 0 deletions
+296
View File
@@ -0,0 +1,296 @@
---
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]]