--- 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]]