一、渐进符号
1、O
f(n)=O(g(n)) 表示存在适当的常数c和n0使得f(n)小于或等于c*g(n),对于充分大的n成立
0<=f(n)<=c*g(n) (c>0,n0>0,n>=n0)
例:2n^2 = O(n^3)
粗略的说就是去掉首项系数和低阶项,剩下的小于或等于n^3
O粗略的说就是小于或等于,这里的等号不对称
f(n)是属于g(n)构成的函数集,可以定义O(g(n))为一个函数集
O(g(n))={f(n): 存在常数 c>0 n0>0 使得0<=f(n)<=c*g(n) 对于所有n>=n0}
即可以理解为2n^2 属于O(n^3)
例:f(n)=n^3+O(n^2)
即存在某个函数h(n)在O(n^2)中使得f(n)=n^3+h(n),总的来说有低阶项以某个常数乘以n^2为上界,对于足够大的n成立
如果O符号在左边的话.等号为"是"的意思
n^2+O(n) = O(n^2)
对于任何f(n)属于O(n),总有一个函数h(n)属于O(n^2),使得n^2+f(n)=h(n)
对于任何在左边宏展开的表达式,都能在右边找到一个对应的展开,使左右相等
2、Ω
Ω(g(n))={f(n):存在一个常数c>0,n0>0使得0<=c*g(n)<=f(n)对于任何n>=n0}
例: 根号n=Ω(lgn)
根号n至少是lgn的常数倍
Ω对应大于或者等于
3、θ
θ(g(n))=O(g(n))∩Ω(g(n)) 故θ代表等于即n^2=θ(n^2)
4、o、w o相当于小于,w相当于大于,任意常数c都存在一个任意常数n0,不等式必须对于所有的c成立
例:2n^2=o(n^3) n0=2/c 不管c多小,依然成立
二、解递归式
1.代换法
1.1. 猜答案 大致知道形式即可
1.2. 用数学归纳法证明
1.3. 寻找常数系数,查找什么系数可以成立
例:T(n)=4T(n/2)+n
T(1)=θ(1)
试猜想T=O(n^3)
T(k) = c k^3 k<n
T(n) = 4T(n/2)+n<=4c(n/2)^3+n
=1/2*c*n^3+n=cn^3-(1/2*c*n^3-n)
<=cn^3
(1/2*c*n^3-n)>=0 c>=1,n>=1
证明紧界 T=O(n^2)
T(k) = c k^2 k<n
T(n) = 4T(n/2)+n<=4c(n/2)^2+n
=cn^2+n=cn^2-(-n)
<=cn^2
-n>=0 n>=0 n!=0 故不成立
改进数学归纳 增加低阶项
T(k) = c1 k^2-c2*k
T(n)= 4T(n/2)+n = 4(c1 (n/2)^2-c2*n/2)+n
=c1 n^2 - 2c2 * n + n
=c1 n^2 - c2*n - (c2-1)*n
<=c1 n^2 - c2 * n
c2-1>=0 即 c2>=1
对于特殊情况
T(1)<=c1-c2
T(1)=θ(1)
故c1需要足够大
2.递归树法
例:T(n) = T(n/4)+T(n/2)+n^2
3.主方法
只能运用到特定的递归式上,符合T(n)=aT(n/b)+f(n),每个子问题的规模应该相等
a>=1 b>1 f(n) 渐进趋正(对于足够大的n,f(n)是正的,存在某个特定n0,当n>=n0时,f(n)>0)
简单思路:比较非递归函数f(n)和n^logba(logba是递归树中叶结点的数量)
3.1.1 f(n)较小
f(n)=O(n^(logba-ε))(ε>0) => T(n) = θ(n^(logba))
3.1.2 f(n)相等
f(n) = θ(n^logba*(lgn)^k)(k>=0)
T(n) = θ(n^logba*(lgn)^(k+1))
3.1.3 f(n)增长较快
f(n) = Ω(n^(logba+ε))(ε>0)
同时对f(n)有一个假设,考虑f(n)如何增长
af(n/b)<=(1-ε′)*f(n) 存在 ε′>0 =>T(n)=θ(f(n))