CHARLORÉ / AQUATIC MEMORY

Charloré

MIT6.006 notes(1)

2024 字
10 分钟
MIT6.006 notes(1)
  1. 1MIT6.006 notes(1)本文
  2. 2MIT6.006 notes(2)
  3. 3MIT6.006 notes(3)

MIT 6.006 课程笔记#

Lec01 算法介绍#

1. 算法关注三个核心#

解决计算问题(Solve)#

例如:给定一个数组,找到某个数字的位置,判断一群人是否有相同生日,给定地图,寻找最短路径等,这些都是计算问题。

证明正确性(Correctness)#

为什么这个算法一定正确?

测试不能证明所有情况,算法理论要求对任意规模、任意输入,都能证明它正确。

分析效率(Efficiency)#

同一个问题可能有很多算法,算法研究关心哪一个更高效。

2. 什么是计算问题#

计算问题不是给出一个具体答案,而是定义输入空间和输出空间之间的二元关系。

Problem⊆Inputs×Outputs\text{Problem} \subseteq \text{Inputs} \times \text{Outputs}

一个输入可能对应多个正确输出。

通常通过一个谓词(Predicate) 来定义,即给定一个输入和输出,能验证该输出是否正确。

MIT 6.006 主要研究通用且可扩展的计算问题:它们不只针对某个固定大小的输入(如固定300人的班级),而是能够描述任意规模(nn)的数据。

3. 什么是算法#

算法是把输入转换成正确输出的有限步骤过程。对于确定性算法,每个输入都会被映射到一个确定的输出,并且该输出必须满足计算问题规定的关系。

数学意义上,它相当于一个函数,接收输入并映射到一个正确输出。

f(input)=outputf(input)=output

以生日重复检测算法为例,一个合格的算法描述应当如下:

建立一个记录表
对于每个学生:
查询生日是否已经存在
如果存在:
返回重复
否则:
加入记录
最后:
返回没有重复

4. 如何证明算法的正确性#

由于输入规模 (n) 可以任意增大,不能依靠穷举测试证明算法对所有输入都正确,因此需要使用数学证明。对于递归算法、迭代过程以及按输入规模递推的算法,数学归纳法是一种常见的正确性证明方法。

数学归纳法#

归纳法(Induction)是一种证明方法,用来证明一个命题对于无限多个自然数情况都成立。

数学归纳法的本质可以浓缩为:

证明按自然数编号的一系列命题,只需证明起点成立,并证明任意一步可以推出下一步。\boxed{ \text{证明按自然数编号的一系列命题,只需证明起点成立,并证明任意一步可以推出下一步。} }

它深刻依赖自然数的递推性与良序性,是数学、算法设计、计算机科学中证明递归结构和无限过程的工具之一。

1. 数学归纳法的基本形式

假设有一个关于自然数 nn 的命题 P(n)P(n)。例如我们要证明等差数列求和公式:

1+2+3+⋯+n=n(n+1)21+2+3+\cdots+n = \frac{n(n+1)}{2}

目标是证明:对于所有 n≥1n \geq 1,命题 P(n)P(n) 都成立。

数学归纳法要求完成以下两个核心步骤:

第一步:归纳基础(Base Case)

证明命题在第一个自然数处成立。先令 n=1n=1:

左边: 11

右边: 1(1+1)2=1\frac{1(1+1)}{2} = 1

左边 = 右边,因此 P(1)P(1) 成立。

第二步:归纳假设与递推(Inductive Step)

假设命题对某个具体的自然数 kk 成立,即假设 P(k)P(k) 成立:

1+2+⋯+k=k(k+1)21+2+\cdots+k = \frac{k(k+1)}{2}

然后利用这个假设,去证明 P(k+1)P(k+1) 也成立。即证明:

1+2+⋯+k+(k+1)=(k+1)(k+2)21+2+\cdots+k+(k+1) = \frac{(k+1)(k+2)}{2}

推导过程如下: 左边前 kk 项可以利用归纳假设进行替换:

1+2+⋯+k⏟替换为 k(k+1)2+(k+1)\underbrace{1+2+\cdots+k}_{\text{替换为 } \frac{k(k+1)}{2}} + (k+1)=k(k+1)2+(k+1)= \frac{k(k+1)}{2} + (k+1)

提取公因式 (k+1)(k+1):

=(k+1)(k2+1)= (k+1)\left(\frac{k}{2} + 1\right)

通分整理:

=(k+1)(k+2)2= \frac{(k+1)(k+2)}{2}

推导出的结果正好是 P(k+1)P(k+1) 的右边式子。因此,P(k+1)P(k+1) 成立。

2. 归纳法的完整逻辑

数学归纳法实际上证明了 P(1)P(1) 成立,并且 P(k)⇒P(k+1)P(k) \Rightarrow P(k+1) 成立,从而得出结论:对于所有正整数 nn,P(n)P(n) 都成立。

写成严谨的数理逻辑形式如下:

[P(1)∧∀k(P(k)→P(k+1))]⇒∀n∈N+,P(n)\Big[ P(1) \land \forall k \big( P(k) \rightarrow P(k+1) \big) \Big] \Rightarrow \forall n \in \mathbb{N}^+, P(n)

为什么这能证明无限多个情况?关键在于形成了一个无限传递链:

  1. 因为 P(1)P(1) 成立,且 P(1)→P(2)P(1) \rightarrow P(2),所以 P(2)P(2) 成立。
  2. 因为 P(2)P(2) 成立,且 P(2)→P(3)P(2) \rightarrow P(3),所以 P(3)P(3) 成立。
  3. 继续传递:P(3)→P(4)P(3) \rightarrow P(4),于是 P(4)P(4) 成立……

最终,虽然我们无法用穷举法去逐个证明无限多个情况,但归纳步骤自动覆盖了 P(1),P(2),P(3),…,P(n)P(1), P(2), P(3), \dots, P(n) 乃至无穷远。

3. 数学归纳法的两个基本性质

性质 1:递推性

归纳法依赖于 P(k)→P(k+1)P(k) \rightarrow P(k+1),也就是说:当前情况成立,可以推出下一情况成立。 它描述的是命题之间连续递进的逻辑关系。

性质 2:完备性

自然数集合 N={1,2,3,… }\mathbb{N} = \{1, 2, 3, \dots\} 具有一个重要性质:

自然数的良序原理(Well-ordering Principle):任意非空自然数集合都有最小元素。


归纳法证明生日算法的步骤:

  1. 归纳基础(Base Case) :面试0个学生时,不可能有匹配,算法正确返回空值(谓词自然成立)。

  2. 归纳假设(Inductive Hypothesis) :假设在面试前 kk 个学生后,如果其中有匹配项,算法已经正确返回,如果没有,记录本包含了这 kk 个人的生日。

  3. 归纳递推(Inductive Step) :考虑第 k+1k+1 个学生。分三种情况讨论:

    1. 前 kk 个人中已有匹配(根据假设,算法已正确返回)。

    2. 前 kk 个人无匹配,但第 k+1k+1 个人与前面的人有匹配(算法通过比对记录本会找到并返回)。

    3. 若均无匹配,将第 k+1k+1 个人加入记录,假设对 k+1k+1 依然成立。

5. 如何分析算法效率#

不把实际时间作为理论分析的唯一标准:实际计时可以用于实验评测,但结果会受到硬件、实现方式和具体数据集的影响,难以直接比较算法本身的增长趋势。

理论分析通常使用渐近分析(Asymptotic Analysis):用算法执行基本操作的次数相对于输入规模(通常记为 nn)的函数来衡量。

渐近记号:大 OO 表示渐近上界,Ω\Omega 表示渐近下界,Θ\Theta 表示渐近紧确界。最坏情况、平均情况和期望情况描述的是所分析的运行时间类型,与这些渐近记号不是同一个概念。

记号名称直观含义
O(g(n))O(g(n))大 O增长速度“不超过” g(n)g(n) 的量级
Ω(g(n))\Omega(g(n))大 Omega增长速度“不低于” g(n)g(n) 的量级
Θ(g(n))\Theta(g(n))大 Theta增长速度“就是” g(n)g(n) 这个量级
o(g(n))o(g(n))小 o增长速度“严格慢于” g(n)g(n)
ω(g(n))\omega(g(n))小 omega增长速度“严格快于” g(n)g(n)

常见的运行时间增长量级(由慢到快):

  • Θ(1)\Theta(1):常数时间
  • Θ(log⁡n)\Theta(\log n):对数时间
  • Θ(n)\Theta(n):线性时间
  • Θ(nlog⁡n)\Theta(n \log n):线性对数时间
  • Θ(n2)\Theta(n^2):二次时间
  • Θ(nc)\Theta(n^c):更高次的多项式时间,其中 c>2c>2 是固定常数
  • Θ(2n)\Theta(2^n):指数时间

在本课程中,相对于输入规模能在多项式时间内返回结果的算法通常被视为高效算法。

6. 字 RAM 模型(Word-RAM Model)#

为了分析算法,需要先规定计算模型。本课程采用 Word-RAM(字随机存取机器)模型。

内存结构:内存被视为一串可通过地址随机访问的机器字(machine word)。

字长与寻址:一个机器字由 ww 个比特组成。若要寻址 nn 个内存位置,字长至少应满足 w≥⌈log⁡2n⌉w \geq \lceil \log_2 n \rceil;现实机器中常见的字长为32位或64位。

常数时间假设:在这个模型下,对 O(1)O(1) 个机器字进行读取、写入、整数运算、逻辑运算或比较,都视为常数时间操作,即 O(1)O(1)。

局限性:一次基本操作只能访问或处理 O(1)O(1) 个机器字。因此,如果必须读取或处理全部 nn 个机器字,至少需要 Ω(n)\Omega(n) 次操作。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

MIT6.006 notes(1)
https://charlore.cn/posts/mit6.006-notes-1/
作者
路人蛃
发布于
2026-09-17
许可协议
CC BY-NC-SA 4.0

评论区