阅读 · 推演 · 自测 · 理解
WEEK 02 · STUDY NOTES

COMP3121 Week02 学习笔记

Foundations 续篇 · 证明与稳定匹配;Greedy Lecture · 活动选择与基站覆盖

主课件:week2/1-foundations.pdf · 77页对照:week1/1-foundations.pdf · 47页教授课堂 transcript · 无时间戳主课件:PPT/From lecture/week2/2-greedy.pdf · PDF实际154页;录音对应 p4–13、p16–31、p33–35,并进入 p36 证明讨论课堂 transcript:PPT/From lecture/week2/COMP3121_COMP9101 Le-transcript_副本.txt · 无时间戳
来源: 主课件:week2/1-foundations.pdf · 77页, 对照:week1/1-foundations.pdf · 47页, 教授课堂 transcript · 无时间戳, 主课件:PPT/From lecture/week2/2-greedy.pdf · PDF实际154页;录音对应 p4–13、p16–31、p33–35,并进入 p36 证明讨论, 课堂 transcript:PPT/From lecture/week2/COMP3121_COMP9101 Le-transcript_副本.txt · 无时间戳
Module

01 · 本周地图:从“算法想法”到“可信的论证”

算法 / 主题:综合方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“set out what your proof targets are”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:第二周究竟新增了什么,应该带着什么目标读?本周重点是把算法说清楚后,证明它对所有合法输入都成立,并兑现声称的运行时间。学习顺序:写清命题 → 选择证明工具 → 找到关键性质 → 推出终态 → 单独核算成本。

范围本笔记的处理学习目标
p42–47:二分答案、递归、归约成本本节课堂回顾与续讲;精简衔接第一周调用已知算法不等于整体高效
p49–58:逻辑与五种证明方法本周核心说清全称命题、反例、反证、不变式、单调量、归纳
p59–62:归并排序综合示例局部不变式 + 全局强归纳 + 逐层计费
p63–76:稳定匹配课堂概览 + 课件完整证明延伸分开证明终止、完美匹配、稳定性

← 回到第一周学习笔记 · 先学证明框架,再读树直径与稳定匹配的详细论证。

Module

02 · 衔接:递归与归约也要付成本

算法 / 主题:递归
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“I just need to nibble forward enough” / “It matters how many”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:已经会解决一个子问题,为什么还不能直接宣称新问题高效?归约要付转换输入、调用子程序以及处理结果的成本;递归则把大实例变成更小的同类实例,直到基本情况。

Palindrome(s, l, r):
if l >= r: return true          // 空串或单字符:基本情况
if s[l] != s[r]: return false   // 首尾不等:不可能是回文
return Palindrome(s, l + 1, r - 1)

执行流程:以0起始下标调用 Palindrome(s,0,n−1) → 检查基本情况 → 比较首尾 → 递归到内部区间 → 把真假结果原样传回。n是字符数;l、r是当前左右下标。例子 abba:比较a/a,再比较b/b,进入l>r的空区间并返回真。abc在首尾a/c处即返回假。

正确性是等价关系:一个长度至少2的串是回文,当且仅当首尾相同且内部是回文。规模每次减2,因此会到长度0或1。使用下标时每层O(1),总O(n);若每层复制内部子串,最坏复制量是(n−2)+(n−4)+…,可达O(n²)。这是实现成本补充,不能只数比较次数。

递归回文:把问题缩小

复用第一周实验;下标从0开始。

可单步、回退、重置;修改输入会重新开始。演示不替代对所有输入的证明。

模型成本如何组合具体代入与解释
一般子程序组合总成本 = 预处理 + 各次调用成本之和 + 收尾调用5次,每次最多处理100项,再转换20项:约500+20单位工作;不能只报100。各次规模不同时逐项求和。
彩色路径归约构造图 O(|V|+|E|) + BFS O(|V|+|E′|)V是顶点集合,E是原边集合,E′是留下的异色边。若10个顶点15条原边只留9条,先检查15条,再在10点9边图上BFS;总O(|V|+|E|)。
二分答案若候选答案数为K、单次判定成本T(n),则判定阶段O(T(n)log K)K=16时约4次折半,若每次扫描100项,则约400项量级;精确次数取决于边界写法。预处理另算。
固定端点的Hamiltonian Path枚举n=|V|,中间点排列数(n−2)!;逐条验证O(n)n=6时有4!=24种顺序,每条检查5条相邻边,共至多120次边查询;边查询O(1)时总O(n(n−2)!),预处理另算。
Module

03 · 先把证明目标写成一句精确的话

算法 / 主题:证明方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“for all inputs” / “there exists some input”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:证明“算法正确”和证明“算法错误”分别需要什么证据?对所有合法输入的声明是全称命题;一个合法反例足以推翻它,而任意有限个通过的测试通常不能证明它。

符号含义怎么用于算法
¬P否定:P不成立不是“我暂时没证明P”
P ∧ Q同时满足P和Q连通,并且边数比点数少1
P ∨ Q至少一个成立,允许两个都真结果来自左侧或右侧
P ⇒ Q若P真,则Q真由输入前提推出算法后置条件;不能倒推
P ⇔ Q两方向都成立归约中“原问题有解”和“新问题有解”等价
∀x P(x)每一个合法x都满足P所有合法输入均输出正确结果
∃x P(x)至少有一个合法x满足P找出一个失败输入即可否定“总是正确”

量词取反:¬(∀x P(x)) ⇔ ∃x ¬P(x);¬(∃x P(x)) ⇔ ∀x ¬P(x)。x表示待考虑的输入,P(x)表示所声称的性质。例子:宣称“每个长度3数组都被算法排好序”;若输入[3,1,2]输出[1,3,2],这一个x就足以推翻全称声明。

  1. 写明合法输入与假设:例如无向、无权、连通的树。
  2. 写明输出要求:例如返回直径长度,而非任意长路径。
  3. 把正确性拆成需要的引理:先得到合法对象,再证明完整性或最优性。
  4. 把效率单独分析:重复次数、每次成本、初始化与输出成本。
Module

04 · 直接证明:把操作成本逐项结清

算法 / 主题:复杂度分析
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“an accounting exercise”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:什么时候沿着已知事实向前推就够了?如果每个操作的次数与成本已知,直接证明(Direct proof)通常最清楚。课件用堆排序说明成本核算。

  1. 把n个元素放进min-heap。可以线性建堆;若逐一插入,O(n log n)也足以得到本例总体上界。
  2. 重复n次:访问堆顶的最小元素,删除它,再追加到输出。堆顶读取、追加为O(1),删除需要最坏O(log n)来恢复堆性质。
  3. 合计O(n+n·log n)=O(n log n)。这里n是元素数,log的固定底数不改变渐近界。
Module

05 · 反证法:把“算法失败”变成可操作的假设

算法 / 主题:证明方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“some diameter starts at vertex V”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:两次BFS为何就能求树的直径?这不是“走得远看起来就对”,关键是证明第一次找到的最远点v必为某条直径的端点。以下展开课件与课堂的最低公共祖先论证;不等式是为填补课堂口头略写而补出的细节。

  1. 目标是:对每棵合法树、每个起点u、每个可选的最远点v,算法输出D。
  2. 若v是某条直径的端点,则第二次BFS取到最大d(v,w),必等于D。因此核心引理是“存在以v为端点的直径”。
  3. 反设v不是任何直径的端点。取一条直径x→y,则d(x,y)严格大于从v出发的任意路径,特别大于d(v,x)与d(v,y)。这是要推翻的具体不等式。

将树以u为根。令h(z)=d(u,z)为顶点z的深度,L为x、y、v三者的最低公共祖先(LCA)。v是最远点,所以h(v)≥h(x)、h(v)≥h(y)。至少有一条v→x或v→y经过L:若二者都避开L,三点就全在L的同一个孩子子树中,与L“最低”矛盾。

不妨设v→x经过L。树上路径长度公式为d(a,b)=h(a)+h(b)−2h(LCA(a,b)):两条从根走下来的路,公共前缀被重复计数,必须减两次。于是d(v,x)=h(v)+h(x)−2h(L)。而x、y的LCA不会高于L,因此d(x,y)≤h(x)+h(y)−2h(L)≤h(x)+h(v)−2h(L)=d(v,x)。这与假设d(x,y)>d(v,x)矛盾。若经过L的是v→y,则对称地比较d(x,y)与d(v,y)。

u · 根L · 最低公共祖先xyv · 最深根到各点的距离 = 深度 h
自编结构示意,长线表示可含多个中间顶点的路径,不按比例绘制。此图画了三支情形;若x、y在同一支,它们的路径更短,正文不等式仍适用。
做法时间为什么
每个起点都BFSO(|V|(|V|+|E|)),树上O(|V|²)每次BFS一次得到到所有终点的距离,无需为每对点重新运行
只做两次BFSO(|V|+|E|),树上O(|V|)树满足|E|=|V|−1;例如8点7边,成本是常数次扫描8点7边
Module

06 · 循环不变式:到底什么始终没变?

算法 / 主题:证明方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“the prefix is sorted”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:数组不断变化,为什么还能说某个性质“不变”?Loop invariant是不随迭代失效的逻辑性质,不是数组值不改变。明确性质在“每轮开始”还是“每轮结束”成立,才能对齐下标。

步骤要说明的事实例[4,2,3,1]
初始化i=2时左侧只有一个元素,已排序[4] | 2,3,1
保持暂存A[i],右移比它大的前缀元素,将它放入空位;前缀扩大1且不丢元素[2,4] | 3,1 → [2,3,4] | 1
结束时推出目标处理完i=n后,已排序前缀覆盖全部输入[1,2,3,4],全部元素恰好保留

插入排序:有序前缀逐步扩大

不变式在外层迭代开始时成立;移动中的中间状态还需把手中的key计入,不能误认为元素被删除。

可单步、回退、重置;修改输入会重新开始。演示不替代对所有输入的证明。

Module

07 · 单调量:不只是下降,还必须不能无限下降

算法 / 主题:综合方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“corrects exactly one inversion”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:如何证明一个过程不可能永远执行?Monovariant选一个有界的整数进度量,每个计入的步骤严格推进。对非负整数Q,若每步Q至少减少1,则从Q₀开始至多执行Q₀步。只说非负实数递减不够,例如1,1/2,1/4,…可以永远降下去。

冒泡排序取逆序对数I(A)=|{(i,j):1≤i<j≤n 且 A[i]>A[j]}|。A是数组,n是长度;I统计位置对而非元素个数。因为最多有n(n−1)/2个位置对,所以0≤I≤n(n−1)/2。相等元素不是逆序对。

冒泡排序:比较与逆序对计数

观察不交换的比较:比较计数增加,I保持不变。

可单步、回退、重置;修改输入会重新开始。演示不替代对所有输入的证明。

Module

08 · 归纳法:允许相信的“小问题”有多大?

算法 / 主题:证明方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“we don't split K + 1 into two lots of K”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:归纳假设是不是在偷用待证结论?不是。只能假设更小规模的同一个命题;必须证明最小规模,并证明更小规模如何推出当前规模。不要只背n=1、n=k、n=k+1的格式。

方法假设允许使用什么适合的结构
普通归纳P(k) ⇒ P(k+1),并先证P(1)问题从k+1恰好缩到k,如选择排序取出一个最小值
强归纳P(1)∧…∧P(k) ⇒ P(k+1),并先证基本情况子问题可小于k,如归并排序分成约一半
  1. 基本情况:n=1,一个元素已经有序,未丢失元素。
  2. 归纳假设:任意长度k的数组均能被正确排序。
  3. 归纳步:取任意长度k+1的A,把全局最小值交换到A[1],所以A[1]≤其余每个值;剩余A[2..k+1]长度恰为k,应用归纳假设得到有序后缀。
  4. 最小值在前 + 后缀有序,得到整个数组有序;交换与后缀排序保留全部元素。由归纳法覆盖所有正整数长度。
Module

09 · 归并排序:两个证明层次,不能跳过中间一步

算法 / 主题:归并排序
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“correctness of the merge”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:两个递归调用加一个merge,怎样组合成完整证明?先证明“两个已排序数组能被正确合并”这个局部引理,再用强归纳证明每个递归调用确实产生已排序数组。

课件采用闭区间A[ℓ..r]、中点m=⌊(ℓ+r)/2⌋。ℓ、r是左右下标,m属于左半段。例ℓ=1、r=6时m=3,得到[1..3]与[4..6],长度3+3=6,没有遗漏或重叠。当前元素数N=r−ℓ+1。下方自学伪代码也使用闭区间。

MergeSort(A, l, r):
if l >= r: return                 // 基本情况:至多一个元素
m = floor((l + r) / 2)
MergeSort(A, l, m)                 // 递归排序左半段
MergeSort(A, m + 1, r)             // 递归排序右半段
Merge(A, l, m, r)

Merge(A, l, m, r):
B = empty array
i = l; j = m + 1                   // 各段最小的未取元素
while i <= m and j <= r:
if A[i] <= A[j]:
append A[i] to B; i = i + 1
else:
append A[j] to B; j = j + 1
while i <= m:
append A[i] to B; i = i + 1
while j <= r:
append A[j] to B; j = j + 1
overwrite A[l..r] with B

执行流程:外层MergeSort先分区 → 左右递归各自返回 → Merge比较两段首个未取值 → 较小者进入B,对应指针前移 → 一段耗尽后补入另一段剩余值 → 将B写回原区间。辅助数组占线性额外空间;教授明确说本例无需为原地合并增加复杂度。

  1. 初始化:B为空,包含最小的0个元素,命题成立。
  2. 保持:因为两段内部已有序,每段的所有未取元素都不小于本段头部。两段头部的较小值因此是全体剩余元素的最小值。取它恰好扩展一个元素,并保持B有序。
  3. 一段耗尽:另一段本就有序,且其余值均不小于B末尾,按原顺序追加不会破坏性质。
  4. 终止:所有元素恰好进入B一次,因此B就是整个输入区间的有序重排;写回不改变这个结论。

全局强归纳:基本情况N≤1成立;假设所有更小规模都能被MergeSort正确排序。对N≥2,两半都非空且严格小于N,归纳假设给出“左右各自有序”;随后使用已证明的merge引理得到整个区间有序。子问题规模不断缩小也保证递归终止。

归并排序:递归与合并

复用既有实验;演示用0起始半开区间[l,r),正文课件用闭区间[ℓ,r]。已合并一行对应证明中的B。

可单步、回退、重置;修改输入会重新开始。演示不替代对所有输入的证明。

Module

10 · 归并的成本:每层总量,而非每个结点都算n

算法 / 主题:归并排序
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“we are massively overestimating”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:递归调用很多,为何总时间只有O(n log n)?关键是按同一层所有子问题的总规模计费。n是原数组长度;某个merge处理的N可能远小于n。

单次merge的N=r−ℓ+1个元素各复制进B一次,再各写回A一次,都是常数成本,因此总O(N);双段比较至多N−1次。例两段长度3和2,N=5,最多4次头部比较,随后补齐余项,并写回5项。比较次数不是所有指令的总数。

n=8的合并层(自顶向下看规模)该层合并任务总处理长度
最上层1个长度8的merge1×8=8
下一层2个长度4的merge2×4=8
再下一层4个长度2的merge4×2=8
叶子8个长度1的基本情况总O(8),无需merge

当n为2的幂时,第j层有2ʲ个长度n/2ʲ的子问题,总合并量2ʲ·(n/2ʲ)=n;有log₂n个合并层,所以T(n)=O(n log n)。j从0开始,代表层号。例n=8有3层,合并长度之和8+8+8=24;实际时间还乘上复制、比较的常数。一般n使用向上/向下取整,层高至多⌈log₂n⌉,每层总量仍O(n)。

Module

11 · 稳定匹配:到底要让谁满意?

算法 / 主题:稳定匹配
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“not everyone can get their first preference”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:双方都提交偏好,却不可能人人拿到第一选择,应该保证什么?输入是n个开发者、n个客户;每个人严格排列对方全部n人,无并列、无缺项。目标是完美匹配且没有双方都想私下改配的阻塞对。

术语定义不能误认为
Matching 匹配每个人至多在一个配对中不保证人人有配偶
Perfect matching 完美匹配全部2n人恰好形成n对不保证偏好满足或稳定
Blocking pair 阻塞对未相配的d、c各自都严格更喜欢对方,而非当前搭档只有一方喜欢对方还不够
Stable matching 稳定匹配本课模型中的完美匹配,且不存在阻塞对不等于每人第一志愿,也不自动最大化总满意度

记M(d)为d的现客户、M(c)为c的现开发者,c ≻d M(d)表示d更喜欢c。阻塞条件是[c ≻d M(d)] ∧ [d ≻c M(c)]。例David想换Cynthia,但Cynthia更喜欢现搭档Daphne,则第二条件不成立,不构成阻塞。

课件例1:偏好箭头与两种配对。Daphne和Cynthia必须配在一起,否则互为阻塞对。
Week02 PDF p66 · 课件例1:偏好箭头与两种配对。Daphne和Cynthia必须配在一起,否则互为阻塞对。
课件例2:双方第一志愿不同;两种完美匹配均稳定。
Week02 PDF p67 · 课件例2:双方第一志愿不同;两种完美匹配均稳定。

不考虑偏好,共有n!=n·(n−1)·…·1种完美匹配:依次给每个客户分配未使用的开发者。例n=4是24种,n=10是3,628,800种。枚举全部匹配再检查稳定性会很慢。课件写n!≈(n/e)ⁿ是展示主增长尺度的简写,e≈2.718;精确比值趋近1的Stirling近似应为n!≈√(2πn)(n/e)ⁿ(背景补充),n=4时约23.5接近24,而省略平方根的式子约4.69,不能拿来准确计算数量。

Module

12 · Gale–Shapley:先理解状态如何变化

算法 / 主题:稳定匹配
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“have you for now”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:为什么客户可以先接受、再换人?这里的接受是暂时的。开发者按照自己的偏好从高到低提案;客户始终保留到目前为止自己最喜欢的提案者,其他人继续尝试下一位。

  1. 初始化:所有开发者和客户都未配对,每个开发者记录下一位尚未提案的客户。
  2. 选择任一尚未配对、且还有客户未提案的开发者d。让d向名单上最喜欢的未尝试客户c提案,之后永不重复这一对提案。
  3. 若c没有搭档,暂时接受d。
  4. 若c已有搭档d′,比较偏好:更喜欢d就换成d,d′重新空闲;否则拒绝d。
  5. 重复,直到没有符合条件的开发者。随后仍需证明:这个停止条件确实意味着人人有配对。
状态变化方向为什么对证明有用
开发者已尝试名单只增不减,每一对最多提案一次限制总轮数;较喜欢的客户一定先被尝试
客户是否已配对一旦收到首次提案,此后始终有搭档完美性反证的关键
客户现搭档的偏好只能保持或变好一旦拒绝d,最终搭档必然优于d

暂时接受:提案、拒绝与替换

偏好从左到右递减。为突出状态,小型演示扫描选人;O(1)一轮的算法实现见下一节,不能用演示开销替代理论分析。

可单步、回退、重置;修改输入会重新开始。演示不替代对所有输入的证明。

Module

13 · 稳定匹配:三个命题与O(1)一轮的实现

算法 / 主题:稳定匹配
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“very easy to skip over one of these claims”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:算法停止后为何一定得到稳定的完美匹配,以及n²轮为何真能变成O(n²)时间?

证明依赖链:不重复提案 → 会终止;客户一旦配对不再空闲 + 停止条件 → 完美匹配;开发者按序提案 + 客户搭档只改善 → 无阻塞对。不要从算法描述直接跳到“显然完美且稳定”。

数据结构(实现补充)用途复杂度
prefs[d][k] 与 next[d]直接取得d下一位要提案的客户,再将指针加1每轮O(1)
rank[c][d]客户c给开发者d的名次,越小越喜欢;比较两个名次即可建表O(n²),比较O(1)
partnerD、partnerC数组常数时间查询与更新双方当前搭档每轮O(1)
空闲开发者栈或队列取出一个空闲者,被拒绝/替换者按需放回每轮O(1),避免每轮扫描所有人

例如客户c偏好[d₂,d₀,d₁],预处理为rank[c][d₂]=0、rank[c][d₀]=1、rank[c][d₁]=2。已有d₀时收到d₂,比较0<1就替换,无需扫描整张名单。输入共有2n张长度n的偏好表,即2n²项;n=3时18项。预处理O(n²)+最多n²轮×每轮O(1)=O(n²),包括偏好表的空间O(n²)。若每轮扫描偏好表或扫描全部开发者找空闲者,可能把实现上界拖到O(n³)。

Module

14 · 本周通用解题方法:看到什么信号,用什么骨架

算法 / 主题:综合方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“set out what your proof targets are”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:下次遇到陌生题,如何选择证明路线?先把算法的输入、状态、每步动作、结束条件、目标写清楚,再选择最贴近它结构的工具;同一道题完全可以组合多种方法。

识别信号可复用骨架本周例子与边界
由已知操作构成,次数清楚总成本=各部分成本之和;每部分=次数×单次成本Heapsort:不能漏删除后的维护
声称“绝不存在坏情况”假设一个具体坏对象存在 → 推出不可能稳定匹配:假设阻塞对;需先证完美性
声称选出的对象已经最优假设有严格更优的对象 → 比较两者树直径:找x,y,使d(x,y)严格更长;相等不是反例
循环逐渐处理前缀或输出定义已完成部分 + 尚未处理部分 → 初始化、保持、结束Merge:B不仅有序,而且是全体最小的已取元素
担心循环永远运行找有界整数Q;每个计入步骤至少推进1逆序对、未使用提案数;另算无变化的比较步骤
问题缩成相同类型的小实例定义P(n) → 基本情况 → 更小规模假设 → 组合回当前规模选择排序普通归纳;归并排序强归纳
主算法调用一个复杂子程序先证子程序引理,再在主证明中引用Merge不变式先证,再证明MergeSort
Module

15 · 自测:先写理由,再展开答案

算法 / 主题:综合方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:课堂问答与本笔记自编检查题。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这些自测按本周知识点编写,不是官方测验题。答案默认隐藏,文本只保留在当前页面;每道题可单独清空。

1. 一个算法通过了1000个随机测试,可以证明它对所有合法输入正确吗?

查看答案与推理

通常不可以。全称正确性需要覆盖所有合法输入的论证;一个合法反例就能否定它。若输入空间有限且确已穷尽全部输入,才是另一回事。

2. “对每棵树、每个起点,两次BFS都返回直径”的否定是什么?

查看答案与推理

存在一棵合法树、一个起点以及算法允许的最远点选择,使返回长度不是直径。不能说“所有树都失败”,也不能只说“没找到证明”。

3. 树直径反证中,发现d(x,y)=d(v,x),算不算反例?

查看答案与推理

不算。反设要求x→y严格长于所有从v开始的路径;相等已足以推翻该严格假设,v仍可为另一条并列直径的端点。

4. merge的不变式只写“B已排序”缺了什么?

查看答案与推理

缺少B恰好含两段全体输入中最小的|B|个元素、未取指针的位置,以及元素重数被保留。否则输出空数组也有序。

5. 非负数Q每轮严格下降,就一定终止吗?

查看答案与推理

不一定。非负实数1,1/2,1/4,…可无限下降。这里需要非负整数严格下降,或每次至少下降固定正数等足以排除无限步骤的条件。

6. 数组[2,2,1]有几个逆序对?第一次交换右侧相邻2与1后还剩几个?

查看答案与推理

有2个:两个不同位置的2各自与1构成一对;两个2之间不构成。交换后[2,1,2]剩1对,相邻逆序交换恰好减少1。

7. I(A)=0意味着冒泡排序无需任何操作吗?

查看答案与推理

不意味着。标准实现仍需一轮比较来确认没有交换。单调量界定交换次数,不自动界定每一次比较。

8. 证明长度9的归并排序,只假设长度8排序正确够吗?

查看答案与推理

不能直接支持两个递归调用,它们长度为5和4。用强归纳假设所有长度≤8正确,再分别引用。

9. n=16时各合并层的总长度是多少?为什么不是每个merge都用16计费?

查看答案与推理

四个合并层分别是16、2×8、4×4、8×2,均为16,总64个元素长度单位。小merge只处理自己的区间,不能都按根规模收费。

10. 一个开发者更喜欢别人的客户,是否说明当前匹配不稳定?

查看答案与推理

还不够。那个客户也必须更喜欢该开发者而非自己的现搭档,两者同时成立才是阻塞对。

11. Gale–Shapley停止时有开发者没工作,为什么能推出所有客户已配对?

查看答案与推理

停止条件让该开发者必须已提案给所有客户;任何收到过提案的客户此后一直有搭档,所以所有客户都已配对。这再与人数相同、一人至多一对矛盾。

12. 总共最多n²次提案,所以任何实现都一定O(n²)吗?

查看答案与推理

不是。还必须每轮O(1),并加上O(n²)预处理。用rank逆排名表、next指针、双方搭档数组和空闲栈可做到;每轮扫描长度n的列表可能变成O(n³)。

Module

16 · 复习清单与术语表

算法 / 主题:综合方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:本周知识回顾。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

  • 我能把“总是正确”的否定写成一个存在性命题,并保留合法输入限制。
  • 我能解释递归的规模为什么变小,并核算转换和调用次数。
  • 我能写出树直径证明中的LCA与深度不等式,而不只说“v很远”。
  • 我能区分不变式、单调量与归纳假设,并说清各自证明哪件事。
  • 我能给merge写出强于“B有序”的不变式,区分局部引理与全局归纳。
  • 我能按每层总规模解释O(n log n),并处理非2次幂。
  • 我能区分匹配、完美匹配、稳定匹配,并把Gale–Shapley的三个命题按依赖顺序说明。
  • 我能解释rank表与空闲栈为什么使一轮O(1)。
English term中文含义与本周用途
Proposition / Quantifier命题 / 量词;写清主张与范围
Implication / Equivalence蕴含 / 等价;单方向推理与双向对应
Counterexample / Contradiction反例 / 矛盾;前者推翻全称主张,后者否定反设
Lemma引理;主证明可以复用的小结论
Loop invariant循环不变式;每个指定检查点成立的性质
Monovariant / Variant单调量;沿一个方向推进、有界的量
Inversion逆序对;i<j但A[i]>A[j]
Induction / Strong induction归纳 / 强归纳;利用较小规模的结论
Diameter / LCA直径 / 最低公共祖先;树路径证明的概念
Blocking pair阻塞对;未配对的双方都更喜欢彼此
Gale–Shapley / Deferred acceptanceGale–Shapley / 延迟接受;暂时配对、允许更优提案替换
Module

17 · Greedy Lecture 地图:录音到底讲到哪

算法 / 主题:贪心方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“we’re going to start on greedy algorithms” / “longest prefix of houses”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:整份154页 PDF 含有后续内容,这一段课堂录音对应哪些页?按话题顺序和独有例子交叉定位:从 Frozen Yoghurt I(实际 p4)进入贪心,讲到 Cell Towers 的 greedy stays ahead 指标讨论(对应实际 p36 主题)时,录音在一句未说完的话中结束。p1–3 是封面与目录;p36 正式命题是否已展示无法由录音确认;p37–38 是紧接着的完整证明,但没有出现在本份 transcript 中。

PDF 实际页课堂内容处理方式
p4–13分数/0-1 背包对比、贪心定义与两种证明法本次课堂主体
p16–31活动选择、反例、交换证明、复杂度与目标变体本次课堂主体
p33–35,进入 p36基站覆盖算法、边界、成本,开始讨论 stays ahead 指标录音在证明思路中途截断;未确认 p36 正式命题已讲
p37–38基站覆盖归纳证明与最终最优性课件自学补全;明确区别于录音
p41–154磁带存储、最晚完成、Huffman、SCC、Dijkstra、MST 等本次录音没有讲到,不并入 Week 2 本节
Module

18 · 贪心选择为什么有时可行,有时会锁死后路

算法 / 主题:贪心方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“value per unit of weight” / “lock ourselves out” / “exchange argument”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:局部看起来最划算,为什么未必能推出整体最优?Greedy algorithm 在每一步只保留眼前最好的一个方向,省去枚举,但必须证明被排除的选择不会在后续反超。登山例子说明局部最高峰未必是全局最高峰。

版本允许的选择比值规则关键原因
Frozen Yoghurt I / Fractional Knapsack每件可取 0 到 1 的任意份额按 vᵢ/wᵢ 降序装入,最后一件可取一部分可交换任意小份额,先取高比值不会损失可行性
Frozen Yoghurt II / 0-1 Knapsack每件只能整取或不取同一规则可能失败高比值小件可能留下无法填满的空间

记第 i 件重量 wᵢ>0、价值 vᵢ,背包容量 W,xᵢ 是所取比例。分数版最大化 Σvᵢxᵢ,约束 Σwᵢxᵢ≤W 且 0≤xᵢ≤1。若某方案在仍可取高比值物品 i 时却取了低比值物品 j 的一小段重量 δ,把这 δ 重量从 j 移给 i,价值变化 δ(vᵢ/wᵢ−vⱼ/wⱼ)≥0。反复调整便得到按比值排序的方案;排序 O(n log n),扫描 O(n)。这里 δ 是可转移重量,不是物品件数。 数值代入:若高比值为6、低比值为5,可移动δ=0.5 kg,则价值增加0.5×(6−5)=$0.5;δ不能大于低比值物品已取重量或高比值物品剩余容量。不要把δ当作0.5件物品的价值。

证明路线要构造的比较最终必须推出
Exchange argument(交换论证)从任意最优解出发,把首个不同选择换成贪心选择,维持可行且目标不差逐次消除分歧,存在与贪心完全一致的最优解
Greedy stays ahead(贪心始终领先)指定可比较的进度量,证明第 k 步不落后于任意可行方案由每一步的领先关系推出最终目标最优
Module

19 · 活动选择:认识目标,再击破错误准则

算法 / 主题:活动选择
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“shortest activity” / “fewest conflicts” / “earliest finish time”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:如何选择最多个互不重叠活动?活动 i 的开始与结束时刻是 sᵢ、fᵢ。采用半开区间 [sᵢ,fᵢ),这样前一个活动在 t 结束、后一个在 t 开始视为兼容。目标是最大化活动数量,而不是总时长。

候选规则为什么看似合理结论/反例
先选最短时长占用时间少失败:A=[0,5)、B=[4,6)、C=[5,10),B 仅2单位却与 A、C 都冲突;A+C 可选2项
先选冲突最少似乎给后续留下空间失败:课件 p18 把多组短活动加入两侧,抬高好选择的冲突数;中间活动只冲突两项而被先选,结果仅3项,另一方案可选4项
先选最早结束给后续留下最早可用时刻正确;按结束时刻排序后扫描

算法:按 fᵢ 升序排序;lastFinish 初始为负无穷;顺序扫描,若 sᵢ≥lastFinish 就选取 i 并令 lastFinish=fᵢ。例 A=[0,5)、B=[4,6)、C=[5,10):先选 A,跳过 B,选 C,得到2项。排序 O(n log n),每项只检查一次是 O(n),总 O(n log n)。n 是活动数。

活动选择:最早结束与错误准则

自编小例:A=[0,5)、B=[4,6)、C=[5,10)。最短时长先选B只能取1项;最早结束可取A、C两项。

可单步、回退、重置;修改输入会重新开始。演示不替代对所有输入的证明。

Module

20 · 活动选择的交换证明:每换一次都保住最优

算法 / 主题:活动选择
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“first point of disagreement” / “same number of activities”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:为什么“最早结束”不是一次碰巧有效?设贪心结果 G=(g₁,…,gᵣ),任取一份合法方案 A=(a₁,…,aₛ),均按结束时刻排序。若前 k−1 项相同而第 k 项不同,gₖ 是在共同前缀之后最早结束的可选活动,所以 f(gₖ)≤f(aₖ)。

  1. 把 A 的第 k 项 aₖ 换成 gₖ,构成 A′=(g₁,…,gₖ,aₖ₊₁,…,aₛ)。
  2. 合法性:gₖ 与共同前缀兼容;原方案中 aₖ 结束后才开始的后继也不会与更早结束的 gₖ 冲突。
  3. 数量:只替换一项,没有减少活动;gₖ 不会与后继是同一活动,因为后继从 aₖ 结束之后才开始。
  4. 反复替换,分歧位置严格往后移,且始终保留一份与原方案同样多项的合法方案。若贪心先耗尽而替换方案仍有下一项,那么这项与贪心全部前缀兼容,贪心本应继续选择,矛盾。
Module

21 · 基站覆盖:算法、边界与课堂的领先指标

算法 / 主题:基站覆盖
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“place a tower 5 kilometres to the east” / “longest prefix of houses”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:在一条长度为 L 的道路上,如何用最少半径 R=5 km 的基站覆盖所有房屋?先将房屋位置 x₁≤…≤xₙ 排序。取最左未覆盖房屋 h,把新基站中心放在 min(h+R,L),再跳过它覆盖的所有房屋,如此重复。若 h+R 超过终点,截到 L 即可,且仍覆盖 h。

扫描时只需保存最近一座塔中心 c:若当前房屋 x≤c+R,已有覆盖;否则创建新塔。因为房屋与塔中心都按从左到右处理,更早基站的右端不可能比最近基站更远。排序前提下扫描 O(n),未排序时 O(n log n)。

基站覆盖:从最左未覆盖房屋推进

自编反例:半径5,房屋在0、8、9、10、11、12、13、21。最多房屋优先先选10.5后仍需两侧各一座;从左向右只需两座。

可单步、回退、重置;修改输入会重新开始。演示不替代对所有输入的证明。

课堂进入 greedy stays ahead 时指出:不能拿“每步覆盖房屋总数”作领先量。一个向中间偏的塔可能先覆盖更多房屋,却遗漏最左房屋,最后反而要用更多塔。课堂正在尝试的量是“前 k 座塔之后,从最左边起连续已覆盖到第几间房”。录音就在讨论这个最长前缀时截断。

Module

22 · 课件后续自学补全:基站为什么最优

算法 / 主题:基站覆盖
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:录音在 p36 的 “longest prefix of houses” 之后截断。课件 p37–38 完整证明是录音终点后的自学补全;p36 的正式命题是否在课堂展示也无法由录音确认。

这个部分回答什么问题:若要把课堂提出的 stays ahead 指标写成完整证明,应如何收尾?以下根据课件 p37–38 自学补全,不属于本份 transcript 已确认的讲授范围。设贪心的第 k 座塔位置 gₖ,任一合法方案按位置排序后的第 k 座塔位置 aₖ。 课件正式证明比较的是第 k 座塔的位置,不直接比较已覆盖房屋总数;它和课堂讨论的连续前缀都表达从西向东推进,但不能未经论证就把两个指标视为完全等价。

aₖ₋₁ + R < h = gₖ − R < aₖ − R替代方案(假设第 k 座放得比贪心更东)第 k−1 座覆盖到 aₖ₋₁+R第 k 座从 aₖ−R 才开始覆盖房子 h贪心第 k 座:左边界正好覆盖 h左边界 h = gₖ−Rgₖ
示意图按同一尺度画出各塔的覆盖半径。贪心塔覆盖到 h;若替代方案把第 k 座塔放得更东,其覆盖左边界就越过 h,而前一座的覆盖右边界又停在 h 以西,于是 h 会漏掉。
  1. 基础:最左房屋 h 必须被第一座塔覆盖,故任意方案 a₁≤h+R;贪心 g₁=h+R(若受道路终点限制则取 L)。
  2. 归纳:假设 aₖ₋₁≤gₖ₋₁。令 h 是贪心第 k 座塔要照顾的第一间房,则 h>gₖ₋₁+R,gₖ=min(h+R,L)。若 aₖ>gₖ,则前 k−1 座塔的最右覆盖端不超过 gₖ₋₁+R<h;第 k 座塔又在 h+R 右侧(未截断情形),也盖不到 h,矛盾。受道路终点截断时 aₖ≤L=gₖ 自动成立。
  3. 所以对每个 k,aₖ≤gₖ,等价于贪心塔的位置始终不比任意合法方案更靠西。最后一座贪心塔所对应的未覆盖房屋 h 无法被任意少一座塔的方案覆盖,否则与上面的领先关系矛盾,因此塔数最少。
Module

23 · Greedy Lecture 复习与自测入口

算法 / 主题:贪心方法
✎ 我的笔记未填写

输入时自动保存到当前浏览器。

本节来源 · PDF实际页码

Transcript定位:“why were the possibilities you considered no worse?”。英文短语可在原TXT中搜索;自编自测、数值例子与补全推理不冒充教授原话。

这个部分回答什么问题:做新题时怎样把课堂方法用起来?先确认目标和合法输入,再尝试局部规则,主动找反例;若规则还站得住,给出交换后的可行与不变差,或定义可归纳的领先量,最后单独核算排序与扫描成本。

  • 分数背包能交换任意小份额;0-1 背包的离散性会破坏相同比值规则。
  • 活动选择的目标是最大数量;最早结束的交换证明须保住合法性和项数。
  • 基站覆盖的比较量是从最左房屋开始的连续覆盖前缀,不是总覆盖数。
  • 同一个贪心想法在改动目标、输入条件或边界后,需要重新证明。

13. W=5,A=(1,6)、B=(2,10)、C=(3,12)。按比值贪心选整件能保证价值22吗?

查看答案与推理

不能。A比值6最高,先拿A后最多拿A+C价值18;最优B+C价值22。整件限制使分数背包的交换论证失效。

14. 为什么活动选择的交换证明必须说明替换后项数不变?

查看答案与推理

因为目标是最大活动数量。仅证明替换后合法,不排除丢掉活动后得到更少项;保持项数才说明一份最优解可以逐步改成贪心前缀。

15. 若目标变为最大总活动时长,最早结束的原证明还能直接用吗?

查看答案与推理

不能。交换时即使活动项数不变,替换进来的活动时长可能变短,目标值下降。只有等长活动时,最大总时长才等价于最大项数。

16. 基站问题为什么“已覆盖房屋总数”不适合作 stays ahead 指标?

查看答案与推理

某塔能先覆盖许多中间房屋却遗漏最左房屋,之后还要向两侧补塔。应比较从最左房屋起连续覆盖到的前缀。

17. 本份 transcript 是否讲完 PDF p37–38 的基站归纳证明?

查看答案与推理

没有。录音在 p36 的最长已覆盖前缀讨论中途截断;p37–38 是课件后续内容,笔记已标为自学补全。

18. 基站证明中,为什么有 gₖ₋₁+R < h = gₖ−R?

查看答案与推理

h 是前一座贪心塔覆盖范围之外的第一间未覆盖房屋,所以 gₖ₋₁+R<h;贪心把第 k 座塔放在 h 东边 R 处,即 gₖ=h+R,因此 h=gₖ−R。前者来自“尚未覆盖”,后者来自“放置规则”,不是由同一个等式推出来的。

术语含义
fractional knapsack / 0-1 knapsack可拆分物品 / 只能整取物品
exchange argument逐步把某个最优解变成贪心解且目标不变差
greedy stays ahead构造每一步都不落后的进度量
compatible activities时间区间不重叠的活动
longest covered prefix从最左房屋开始连续被覆盖的最长前缀