分治法
1. 将一个问题划分为若干个子问题。
2. 递归的解决每一个子问题。
3. 将子问题的解合并成为整个大问题的解。
归并排序
1. 将一个数组分为两个子数组。
2. 递归的对每一个子数组进行排序。
3. 合并两个有序子数组。
- 运行时间
递归函数为T(n)=2T(n/2)+Θ(n)。
使用主方法,为case2 ,所以T(n)= Θ(nlgn)。
二分查找
在有序数组中查找数X。
1. 把数X与数组中间元素比较,得到X所在的子数组。
2. 递归的在这个子数组查找X。
3. 无。
- 运行时间:
递归函数为T(n)=T(n/2)+Θ(1)。
使用递归树法T(n)= Θ(lgn)。
乘方问题:
有实数X和正整数n计算X^n。
当n为偶数时,X^n=X^(n/2)·X^(n/2),当n为奇数时,X^n=X^((n-1)/2)·X^((n-1)/2)·X。
- 运行时间:
递归函数为T(n)=T(n/2)+Θ(1)。
使用递归树法T(n)= Θ(lgn)。
斐波那契数列
基本公式法:
Fn=0 (n=0)
Fn=1 (n=1)
Fn=F(n-1)+F(n-2)(n>=2)
运行时间:
Ω(φ^n) φ=(1+5^(1/2))/2。
自下而上递归法:
依次计算F0,F1,F2 …… Fn。
运行时间:Θ(n)。
朴素平方递归式:
Fn=φ^n/5^(1/2)结果取最接近的整数。
运行时间:Θ(lgn)。
此算法中的值需用浮点数表示受计算机位数限制。
无法用计算机编码实现。
平方递归式:
(F(n+1) Fn) = (1 1)n
(Fn F(n-1)) (1 0)
运行时间:Θ(lgn)
证明方法可采用归纳法:
1. (F2 F1) = (1 1)1
(F1 F0) (1 0)
2. (F(n+1) Fn) = (Fn F(n-1)) (1 1)
(Fn F(n-1)) (F(n-1) F(n-2)) (1 0)
由定义可知上式成立。
矩阵乘法
- 输入:两个矩阵A[aij]和B[bij] 1<=i<=n 1<=j<=n
- 输出:矩阵C[cij]=A[aij]·B[bij]
- 基本算法:
for i ← 1 to n
do for j ← 1 to n
cij=0
do for k ← 1 to n
do cij ← cij+aik·bkj
运行时间为Θ(n^3)
- 矩阵分块法:

- 斯特拉森(Strassen)算法:
目前最快的理论算法运行时间大约在O(n^2.376)(这个目前指的是网课授课的日期)。
超大规模集成电路(VLSI)布局
假设有一个完全二叉树,在网格上将其放到芯片布局上,有n个叶节点,要在网格上占据最小空间。
- 朴素算法:

- 改进算法:
Area为Θ(n)。