第02章 入门 — 章节汇总
章节概览
第2章”入门”是《算法导论》正式进入算法设计与分析的第一章,由三节组成。2.1 插入排序以扑克牌整理为类比,完整展示了 INSERTION-SORT 伪代码,并通过循环不变式方法严格证明了算法正确性,同时系统阐述了全书使用的伪代码约定;2.2 算法分析引入 RAM 计算模型,以插入排序为例演示了逐行成本分析方法,推导出最好情况 、最坏情况 和平均情况 的运行时间,并介绍了增长量级与 记号的非形式化定义;2.3 分治法系统介绍了分治算法设计范式,以归并排序为完整案例,展示了 MERGE 过程、递归关系式的建立与求解,以及递归树方法推导 时间复杂度的全过程。全章建立了”算法设计—正确性证明—效率分析”三位一体的基本方法论,为后续深入学习奠定坚实基础。
2.1 插入排序 — 要点汇总
INSERTION-SORT 伪代码
- 核心思想:增量方法(incremental method),维护已排序子数组,每次将新元素插入正确位置
- 扑克牌类比:左手持已排序牌,右手逐一取牌插入正确位置
- 排序问题定义:输入 个数的序列,输出满足非递减顺序的排列
- 关键字与卫星数据:被排序的数称为关键字(key),关联的其他数据称为卫星数据(satellite data),排序时记录随关键字一起移动
INSERTION-SORT(A, n)
1 for i = 2 to n
2 key = A[i]
3 // 将 A[i] 插入到已排序子数组 A[1 : i-1] 中
4 j = i - 1
5 while j > 0 and A[j] > key
6 A[j + 1] = A[j]
7 j = j - 1
8 A[j + 1] = key
循环不变式证明
循环不变式:在每次外层 for 循环迭代开始时,子数组 由原来在 中的元素组成,且已排好序。
| 性质 | 内容 |
|---|---|
| 初始化 | 时, 只含单个元素,天然有序 |
| 保持 | 循环体将 key 插入正确位置, 变为有序,下次迭代 递增后不变式成立 |
| 终止 | 时, 即整个数组已排序,算法正确 |
循环不变式与数学归纳法高度相似:初始化对应基础步,保持对应归纳步,终止利用终止条件得出最终结论。
伪代码约定
- 缩进表示块结构(无花括号)
- 循环计数器退出后保留值(
for i = 2 to n退出后 ) - 1 起始下标(1-origin indexing), 表示子数组
- 对象属性用点号访问(如
x.f),支持级联 - 标量按值传参,数组和对象传递指针
and/or为短路运算符NIL表示空指针,error表示立即终止
2.2 算法分析 — 要点汇总
RAM 模型
- 随机访问机(Random-Access Machine):单处理器、串行执行
- 每条指令和数据访问均花费常数时间
- 数据类型:整数、浮点数、字符;布尔值用 0/非 0 表示
- 字长限制:整数通常为 位
- 不包含内存层次结构(缓存、虚拟内存等)
- 灰色区域:指数运算 一般不是常数时间操作
运行时间分析
- 输入规模:排序问题用元素数量 ;图问题用顶点数和边数
- 运行时间 :所有语句的”成本 次数”之和
- 以插入排序为例,设 为 while 循环对每个 的测试次数:
最坏情况、最好情况与平均情况
| 情况 | 条件 | 值 | 运行时间 |
|---|---|---|---|
| 最好情况 | 数组已排序 | ||
| 最坏情况 | 数组逆序 | ||
| 平均情况 | 随机排列 |
通常关注最坏情况的三个原因:(1) 保证运行时间上界;(2) 最坏情况经常发生;(3) 平均情况通常与最坏情况同量级。
增长量级与 记号
- 增长量级:只保留最高阶项,忽略常数系数(如 )
- 记号: 意味着”当 较大时,大致正比于 “(严格定义见第 3 章)
- 增长量级层次:
2.3 分治法 — 要点汇总
分治法范式
分治法是一种递归式算法设计范式,每步执行三个操作:
| 步骤 | 英文 | 含义 |
|---|---|---|
| 分解 | Divide | 将问题划分为更小的子问题 |
| 解决 | Conquer | 递归求解子问题(规模足够小时直接求解 = 基准情况) |
| 合并 | Combine | 将子问题的解合并为原问题的解 |
MERGE-SORT 与 MERGE 过程
- MERGE-SORT:计算中点 ,递归排序左右两半,调用 MERGE 合并
- 基准情况: 时(至多一个元素),直接返回
- MERGE:将两个有序子数组 和 合并为有序的 ,时间
- MERGE 使用临时数组 和 ,通过三路 while 循环实现线性时间合并
递归关系式
归并排序的递归关系式:
其中 是递归求解两个规模为 的子问题的代价, 是分解和合并的代价。
递归树方法
- 树的每一层代价均为 (节点数翻倍但每节点代价减半,恰好抵消)
- 总层数:
- 总代价:
- 归并排序用 因子替换了插入排序的 因子,对大规模输入优势显著
跨章关联
| 关联章节 | 关联内容 | 关联说明 |
|---|---|---|
| 第1章 | 插入排序与循环不变式的首次引入 | 第1章以插入排序为范例介绍算法概念,第2章深入展开其伪代码、正确性证明与复杂度分析 |
| 3.1 渐近记号 | 记号的严格定义 | 2.2 节非形式化引入 记号,第3章将给出 、、 的严格数学定义 |