顺序算法分析的基本方法
原始文件: /田浩然上传的资料/0A002算法分析与设计/lecture9.pdf
文件大小: 395.85 KB
页数: 10页PPT
处理日期: 2026-08-31
处理方式: PDF文本提取
核心内容
这是一份北京大学算法分析与设计课程的教学幻灯片,系统介绍了算法分析的四大基本原则和方法论。
一、算法分析的四项基本原则
| 原则 | 含义 |
|---|---|
| 正确性 | 在给定有效输入后,算法经过有限时间计算产生正确答案 |
| 工作量(时间复杂度) | 对于给定问题,算法执行的基本运算次数 W(n)(最坏情况)或 A(n)(平均情况) |
| 占用空间(空间复杂度) | 存储中间结果所需的额外空间 |
| 简单性 | 算法和程序结构简单,便于验证正确性和调试 |
关键认识:简单的算法效率不一定高,要在保证一定效率的前提下力求简单。
二、最优性概念
- 最坏情况下最优:不存在其他算法在最坏情况下的时间复杂度比它更低
- 平均情况下最优:不存在其他算法在平均情况下的时间复杂度比它更低
寻找最优算法的途径:
- 设计算法 A,求 W(n)(给出上界)
- 寻找函数 F(n),证明任何算法在最坏情况下至少要做 F(n) 次基本运算(下界)
- 若 W(n) = F(n),则 A 是最优的
三、下界证明的三种方法
方法1:判定树法
- 判定树:算法类的模型,每个结点对应一次比较
- 树深代表最坏情况工作量,平均路径长度代表平均工作量
- 应用:证明二分搜索最坏情况复杂度下界为 ⌊log n⌋ + 1
关键引理:
- 深度为 d 的二叉树至多有 2^(d+1) - 1 个结点
- n 个结点的二叉树深度至少为 ⌊log n⌋
- 对任何搜索算法,存在规模为 n 的输入使其至少做 ⌊log n⌋ + 1 次比较
结论:二分搜索在最坏情况下是最优算法。
方法2:构造最坏输入
- 将算法操作序列分为两类:决定性操作(提供有效信息)和非决定性操作(冗余)
- 构造输入实例,使冗余操作尽可能多
- 给出冗余操作 + 必要操作的计数公式
方法3:归约
- 已知问题 Q 的最坏情况时间复杂度下界为 F(n)
- 设计解 Q 的算法 A,调用任意解 P 的算法 B(复杂度 p(n))
- 若转换时间为 t₁(n) + t₂(n) = O(p(n)),则 T(n) = Θ(p(n)) = Ω(F(n))
- 结论:P 至少与 Q 一样难
四、典型算法实例分析
搜索有序表
| 算法 | 最坏复杂度 | 平均复杂度 |
|---|---|---|
| 顺序搜索 | W(n) = n | A(n) ≈ 3n/4 |
| 二分搜索 | W(n) = ⌊log n⌋ + 1 | A(n) ≈ ⌊log n⌋ - 1 |
顺序搜索改进:在表尾添加哨兵 x,可免去每步循环的边界检查,速度提高约 25%。
排序算法复杂度对比
| 算法 | 最坏情况 | 平均情况 |
|---|---|---|
| 快速排序 | O(n²) | O(n log n) |
| 二分归并排序 | O(n log n) | O(n log n) |
| 堆排序 | O(n log n) | O(n log n) |
堆排序详细分析
- 堆定义:完全二叉树,每个结点元素不小于其子结点元素
- HEAPIFY(A, i):维持堆性质,复杂度 Θ(log n)(子堆大小至多为原树的 2/3)
- BUILD-HEAP(A):自底向上建堆,复杂度 O(n)
- 堆排序:反复删除最大元素并重建堆,复杂度 O(n log n)
关键结论
- 二分搜索是最优搜索算法:通过判定树法证明任何基于比较的搜索算法都需要至少 ⌊log n⌋ + 1 次比较
- 堆排序稳定达到 O(n log n):相比快速排序,堆排序在最坏情况下仍能保持对数级别复杂度
- 下界证明是验证最优性的核心工具:三种方法(判定树、构造最坏输入、归约)各有适用场景
与其他知识关联
- GOF设计模式 - 算法思想与软件设计模式的交叉
- Head First设计模式 - 更直观的设计模式入门
- 操作系统基础-进程管理 - 时间复杂度分析是操作系统调度算法的基础
- PKU操作系统课程讲义 - 算法分析是理解系统性能优化的前提