1. 算法复杂度记号
Θ \Theta Θ 记号:紧渐进界记号
Θ ( g ( n ) ) \Theta (g(n)) Θ(g(n))= { f ( n ) : 存 在 正 常 量 c 1 , c 2 和 n 0 , 使 得 对 所 有 n ≥ n 0 有 : c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) } \{ f(n) : 存在正常量c_1, c_2和n_0,使得对所有n\geq n_0有:c_1g(n)\leq f(n)\leq c_2g(n)\} {f(n):存在正常量c1,c2和n0,使得对所有n≥n0有:c1g(n)≤f(n)≤c2g(n)}
若存在正常量 c 1 , c 2 c_1,c_2 c1,c2 使得对于足够大的 n n n ,函数 f ( n ) f(n) f(n) 能够 “ 夹入 ” c 1 g ( n ) c_1g(n) c1g(n) 与 c 2 g ( n ) c_2g(n) c2g(n) 之间,则 f ( n ) f(n) f(n) 属于集合 Θ ( g ( n ) ) \Theta(g(n)) Θ(g(n))
上界记号:
- O O O 记号:渐近上界记号
O ( g ( n ) ) O (g(n)) O(g(n))= { f ( n ) : 存 在 正 常 量 c 和 n 0 , 使 得 对 所 有 n ≥ n 0 有 : 0 ≤ f ( n ) ≤ c g ( n ) } \{ f(n) : 存在正常量c和n_0,使得对所有n\geq n_0有:0\leq f(n)\leq cg(n)\} {f(n):存在正常量c和n0,使得对所有n≥n0有:0≤f(n)≤cg(n)}
- o o o 记号:非渐进紧确上界记号
o ( g ( n ) ) o(g(n)) o(g(n))= { f ( n ) : 对 任 意 正 常 量 c > 0 , 存 在 常 量 n 0 > 0 , 使 得 对 所 有 n ≥ n 0 有 : 0 ≤ f ( n ) < c g ( n ) } \{ f(n) : 对任意正常量 c>0,存在常量n_0>0,使得对所有n\geq n_0有:0\leq f(n)< cg(n)\} {f(n):对任意正常量c>0,存在常量n0>0,使得对所有n≥n0有:0≤f(n)<cg(n)}
-
区别:在 f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n)=O(g(n)) 中, 0 ≤ f ( n ) ≤ c g ( n ) 0\leq f(n)\leq cg(n) 0≤f(n)≤cg(n) 对某个常量 c > 0 c>0 c>0 成立;
在 f ( n ) = o ( g ( n ) ) f(n)=o(g(n)) f(n)=o(g(n)) 中, 0 ≤ f ( n ) < c g ( n ) 0\leq f(n)<cg(n) 0≤f(n)<cg(n) 对于所有常量 c > 0 c>0 c>0 成立.
下界记号:
- Ω \Omega Ω 记号:渐进下界记号
Ω ( g ( n ) ) \Omega (g(n)) Ω(g(n))= { f ( n ) : 存 在 正 常 量 c 和 n 0 , 使 得 对 所 有 n ≥ n 0 有 : 0 ≤ c g ( n ) ≤ f ( n ) } \{ f(n) : 存在正常量c和n_0,使得对所有n\geq n_0有:0\leq cg(n)\leq f(n) \} {f(n):存在正常量c和n0,使得对所有n≥n0有:0≤cg(n)≤f(n)}
-
ω \omega ω 记号:非渐进紧确下界记号
ω ( g ( n ) ) \omega(g(n)) ω(g(n))= { f ( n ) : 对 任 意 正 常 量 c > 0 , 存 在 常 量 n 0 > 0 , 使 得 对 所 有 n ≥ n 0 有 : 0 ≤ c g ( n ) < f ( n ) } \{ f(n) : 对任意正常量 c>0,存在常量n_0>0,使得对所有n\geq n_0有:0\leq cg(n)< f(n)\} {f(n):对任意正常量c>0,存在常量n0>0,使得对所有n≥n0有:0≤cg(n)<f(n)}
Θ , O , Ω \Theta,O,\Omega Θ,O,Ω三种记号的图例如下所示:
<img
定理1:对任意两个函数 f ( n ) , g ( n ) f(n),g(n) f(n),g(n) ,当且仅当 f ( n ) = O ( g ( n ) ) , f ( n ) = Ω ( g ( n ) ) f(n)=O(g(n)),f(n)=\Omega(g(n)) f(n)=O(g(n)),f(n)=Ω(g(n)) 时,有 f ( n ) = Θ ( g ( n ) ) f(n)=\Theta (g(n)) f(n)=Θ(g(n))
2. 主定理计算T(n)=aT(n/b)+f(n)的时间复杂度
主定理:
令
a
≥
1
a\geq1
a≥1 和
b
>
1
b>1
b>1 是常数,
f
(
n
)
f(n)
f(n) 是一个函数,
T
(
n
)
T(n)
T(n) 是定义在非负整数上的递归式:
T
(
n
)
=
a
T
(
n
/
b
)
+
f
(
n
)
T(n)=aT(n/b)+f(n)
T(n)=aT(n/b)+f(n)
其中我们将
n
/
b
n/b
n/b 解释为
⌊
n
/
b
⌋
\lfloor n/b\rfloor
⌊n/b⌋ 或
⌈
n
/
b
⌉
\lceil n/b\rceil
⌈n/b⌉ 。那么
T
(
n
)
T(n)
T(n) 有如下渐进界:
- 若对某个常数 ϵ > 0 \epsilon>0 ϵ>0 ,有 f ( n ) = O ( n l o g b a − ϵ ) f(n)=O(n^{log_ba-\epsilon}) f(n)=O(nlogba−ϵ) ,则 T ( n ) = Θ ( n l o g b a ) T(n)=\Theta(n^{log_ba}) T(n)=Θ(nlogba)
- 若 f ( n ) = Θ ( n l o g b a ) f(n)=\Theta(n^{log_ba}) f(n)=Θ(nlogba) , 则 T ( n ) = Θ ( n l o g b a l o g n ) T(n)=\Theta(n^{log_ba}logn) T(n)=Θ(nlogbalogn)
- 若对某个常数 ϵ > 0 \epsilon>0 ϵ>0 有 f ( n ) = Ω ( n l o g b a + ϵ ) f(n)=\Omega(n^{log_ba+\epsilon}) f(n)=Ω(nlogba+ϵ) 且对某个常数 c < 1 c<1 c<1 和所有足够大的 n n n 有 a f ( n / b ) ≤ c f ( n ) af(n/b)\leq cf(n) af(n/b)≤cf(n),则 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))
直观理解
将 f ( n ) f(n) f(n) 与 n l o g b a n^{log_b^a} nlogba 的阶进行比较(两个函数较大者决定了递归式的解):
- 若 n l o g b a n^{log_ba} nlogba 更大 ,则解为 T ( n ) = Θ ( n l o g b a ) T(n)=\Theta(n^{log_ba}) T(n)=Θ(nlogba) ——如上述情况1
- 若 Θ ( n l o g b a ) = f ( n ) \Theta (n^{log_ba})= f(n) Θ(nlogba)=f(n) ,即 f ( n ) f(n) f(n) 与 n l o g b a n^{logb^a} nlogba 同阶,则解为 T ( n ) = Θ ( n l o g b a l o g n ) = Θ ( f ( n ) l o g n ) T(n)=\Theta(n^{log_ba}logn)=\Theta(f(n)logn) T(n)=Θ(nlogbalogn)=Θ(f(n)logn) ——如上述情况2
- 若 f ( n ) f(n) f(n) 更大,则 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))
注:上述红色区域部分,主定理无能为力
示例: T ( n ) = 9 T ( n / 3 ) + n T(n)=9T(n/3)+n T(n)=9T(n/3)+n
解: a = 9 , b = 3 , f ( n ) = n a=9,b=3,f(n)=n a=9,b=3,f(n)=n, n l o g b a = n l o g 3 9 = Θ ( n 2 ) n^{log_ba}=n^{log_39}=\Theta(n^2) nlogba=nlog39=Θ(n2) 。又 f ( n ) = O ( n l o g 3 9 − ϵ ) f(n)=O(n^{log_3{9-\epsilon}}) f(n)=O(nlog39−ϵ) ,其中 ϵ = 1 \epsilon=1 ϵ=1,通过主定理情况1,可得 T ( n ) = Θ ( n 2 ) T(n)=\Theta(n^2) T(n)=Θ(n2)
3. 排序算法时间复杂度
算法名称 | 平均时间复杂度 | 最坏时间复杂度 | 最好时间复杂度 | 稳定性 |
---|---|---|---|---|
快速排序 | O ( n l g n ) O(nlgn) O(nlgn) | O ( n 2 ) O(n^2) O(n2) | O ( n l g n ) O(nlgn) O(nlgn) | 不稳定 |
归并排序 | O ( n l g n ) O(nlgn) O(nlgn) | O ( n l g n ) O(nlgn) O(nlgn) | O ( n l g n ) O(nlgn) O(nlgn) | 稳定 |
堆排序 | O ( n l g n ) O(nlgn) O(nlgn) | O ( n l g n ) O(nlgn) O(nlgn) | O ( n l g n ) O(nlgn) O(nlgn) | 不稳定 |
冒泡排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | 稳定 |
选择排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | 不稳定 |
插入排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | 稳定 |
注: l g n lgn lgn 指 l o g 2 n log_2n log2n