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

9.1 KiB
Raw Blame History

tags, create time
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. 回溯法的基本框架

参考答案:

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!)
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. 图的着色问题(回溯法)

使用至多四种不同颜色对地图进行涂色,要求相邻区域颜色互不相同。

参考答案:

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天

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];
        }
    }
}
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"]

关联笔记