视频加载失败

课程

3240 字
约 10 分钟

算法设计与分析重点总结

算法设计与分析notes·更新于 2026-09-15

算法设计与分析重点总结

Note

本文档根据授课顺序整理,汇总了课堂上反复强调的核心知识点。内容仅供参考,欢迎同学们共同完善与分享。

“考试复习重点看 PPT” —— 教师寄语。若 PPT 中未包含以下知识,请查阅教材。


考试题型分布

题型分值总分
选择题2 分×102\text{ 分} \times 1020 分20\text{ 分}
填空题2 分×102\text{ 分} \times 1020 分20\text{ 分}
简答题3 分×43\text{ 分} \times 412 分12\text{ 分}
程序分析填空题4 分×44\text{ 分} \times 416 分16\text{ 分}
综合题(代码)8 分×48\text{ 分} \times 432 分32\text{ 分}

一、 基础知识

  • 算法的定义:指解决问题的一种方法或一个过程。
  • 算法的特征
    • 输入:有零个或多个外部输入。
    • 输出:至少产生一个输出。
    • 确定性:算法的每一步指令都必须是清晰、无歧义的。
    • 有限性:算法必须在有穷步内结束,不能陷入无限循环。
  • 算法复杂度分析
    • 时间复杂度:评估算法执行时间随问题规模增长的趋势。
    • 空间复杂度:评估算法执行过程中所消耗的额外存储空间。
    • 循环次数:重点掌握 归并排序快速排序贪心算法 的复杂度及循环次数。

二、 递归与分治策略

  • 递归算法
    • 重点掌握递归的思想,能够根据算法写出对应的递归表达式(递推方程)。
    • 熟练掌握简单的递归算法实现,吃透 PPT 中的典型例子。
  • 合并排序 (Merge Sort)
    • 掌握合并(归并)排序的执行过程。
    • 时间复杂度为 O(nlogn)O(n \log n),空间复杂度为 O(n)O(n)
  • 快速排序 (Quick Sort)
    • 掌握划分与递归排序的过程。
    • 最坏时间复杂度为 O(n2)O(n^2),平均时间复杂度为 O(nlogn)O(n \log n),空间复杂度为 O(logn)O(\log n)(递归调用栈空间)。

三、 贪心策略

  • 贪心算法的两个基本要素
    • 贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择(贪心选择)来达到。
    • 最优子结构性质:一个问题的最优解包含其子问题的最优解。
  • 背包问题 (Fractional Knapsack)
    • 区别于 0-1 背包问题,物品可以部分装入。
    • 程序代码:必须能熟练手写背包问题的贪心算法程序。
  • 最优装载问题
    • 理解采用什么算法解决(利用贪心算法,按重量从小到大装载)。
  • 典型贪心问题(重点掌握算法思想,代码了解即可)
    • 哈夫曼编码 (Huffman Coding)
    • 最小生成树 (Minimum Spanning Tree) —— Prim 算法与 Kruskal 算法。
    • 单源最短路径 (Single Source Shortest Path) —— Dijkstra 算法。
    • 旅行商问题 (TSP) —— 重点掌握填表分析过程。
    • 活动安排问题 (Activity Selection) —— 重点掌握填表分析过程。

四、 动态规划

  • 动态规划的基本要素
    • 最优子结构性质:一个问题的最优解包含其子问题的最优解。
    • 子问题重叠性质:在用递归算法自顶向下求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。
  • 0-1 背包问题
    • 可以使用多种算法求解,需理清各算法的区别:
      • 动态规划:无需排序,以自底向上的方式填表求解。
      • 回溯法分支限界法:需要对物品按单位重量价值进行降序排序。
    • 重点掌握动态规划求解 0-1 背包问题的填表法(PPT 第 59 页的表格必须会填)。
  • 最长公共子序列 (LCS)
    • 递推公式(PPT 第 30 页):

      c[i][j]={0i=0 或 j=0c[i1][j1]+1i,j>0;xi=yjmax(c[i][j1],c[i1][j])i,j>0;xiyjc[i][j] = \begin{cases} 0 & i = 0 \text{ 或 } j = 0 \\ c[i-1][j-1] + 1 & i, j > 0; x_i = y_j \\ \max(c[i][j-1], c[i-1][j]) & i, j > 0; x_i \neq y_j \end{cases}
    • 程序代码:必须掌握其动态规划实现代码。

  • 流水作业调度
    • 了解 Johnson 算法的基本思想与调度原则。

五、 回溯法

  • 回溯法与分支限界法对比
    • 回溯法是一种带有系统性与跳跃性的深度优先搜索(DFS)算法。
  • 剪枝函数 (Pruning Functions)
    • 约束函数 (Constraint Function):在左子树剪去不满足约束条件的子树(如 N 皇后中判断放置位置是否冲突)。
    • 限界函数 (Bound Function):在右子树剪去不可能产生比当前最优解更好的解的子树(如 0-1 背包中判断当前价值 + 剩余物品的最大价值估算是否小于当前已找到的最优价值 bestp)。
  • 装载问题
    • 熟练掌握装载问题的回溯法代码。
  • 图的 m着色问题
    • 掌握如何画出解空间树,并进行约束剪枝。
  • n 后问题 (N-Queens)
    • 掌握回溯法放置皇后的过程与冲突判定。
  • 0-1 背包问题
    • 能够手绘回溯法求解 0-1 背包问题的解空间树(子集树)。

六、 分支限界法

  • 回溯法与分支限界法多维度对比 (PPT 25-26 页)
对比维度回溯法分支限界法
求解目标找出解空间中满足约束条件的所有解找出满足约束条件的一个解,或在满足约束条件的解中找出最优解
搜索方式深度优先搜索 (DFS)广度优先 (BFS) 或 最小耗费/最大效益优先
扩展方式扩展结点一次只生成一个子结点,向深度方向推进扩展结点一次生成所有的孩子结点(分支)
存储空间较小,为 O(n)O(n) 级别的递归调用栈空间较大,需要维护一个存放所有活结点的表(队列或堆)
  • 队列式 (FIFO) 分支限界法
    • 按照队列先进先出原则选取下一个结点作为当前扩展结点。
  • 优先队列式分支限界法
    • 按照优先队列中规定的优先级(如最大效益、最小费用)选取优先级最高的结点作为当前扩展结点。
  • 典型问题(重点掌握思想与分支限界搜索过程)
    • 单源最短路径问题
    • 装载问题
    • 0-1 背包问题
Profile Image of the Author
Sonder
好想要技术
这是公告标题
这只是一个公告
分类
标签
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录