算法导论:6.006
麻省理工学院
讲师:Erik Demaine、Jason Ku 和 Justin Solomon

讲座 1:导论

本课程的目标是教会你如何解决计算问题,并说明你的解决方案是正确高效的。

问题

算法

正确性

效率

输入规模 常数 对数 线性 对数线性 二次 多项式 指数
n Θ(1) Θ(log n) Θ(n) Θ(n log n) Θ(n²) Θ(n^c) 2^Θ(n^c)
1000 1 ≈ 10 1000 ≈ 10,000 1,000,000 1000^c 2^1000 ≈ 10^301
Time 1 ns 10 ns 1 µs 10 µs 1 ms 10^(3c−9) s 10^281 millenia

计算模型

数据结构

示例代码:生日匹配

def birthday_match(students): ''' 找到一对同生日的学生 输入:由 (name, bday) 元组构成的元组 输出:学生姓名组成的元组或 None ''' n = len(students) # O(1) record = StaticArray(n) # O(n) for k in range(n): # n (name1, bday1) = students[k] # O(1) # 若生日已在记录中,返回这对学生 for i in range(k): # k (name2, bday2) = record.get_at(i) # O(1) if bday1 == bday2: # O(1) return (name1, name2) # O(1) record.set_at(k, (name1, bday1)) # O(1) return None # O(1)

示例:运行时间分析

如何解决算法问题

1. 转化为你已知的问题(使用数据结构或算法)

搜索问题(数据结构) 排序算法 最短路径算法
Static Array (L01) Insertion Sort (L03) BFS (L09)
Linked List (L02) Selection Sort (L03) DAG Relax (L11)
Dynamic Array (L02) Merge Sort (L03) DFS (L10)
Sorted Array (L03) Counting Sort (L05) Topo Sort (L10)
Direct-Access Array (L04) Radix Sort (L05) Bellman-Ford (L12)
Hash Table (L04) AVL Sort (L07) Dijkstra (L13)
Balanced BST (L06-L07) Heap Sort (L08) Johnson (L14)
Binary Heap (L08) Floyd-Warshall (L18)

2. 自行设计(递归)算法