算法复杂度


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,c2n0,使nn0c1g(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):cn0,使nn00f(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>0n0>0,使nn00f(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) 0f(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) 0f(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):cn0,使nn00cg(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>0n0>0,使nn00cg(n)<f(n)}

Θ , O , Ω \Theta,O,\Omega Θ,O,Ω三种记号的图例如下所示:

<img src="E:%5CL1%5C%E7%AE%97%E6%B3%95%5C%E5%9B%BE%E7%89%87%5C1.PNG" alt="1" style="zoom:60%;" />

定理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 a1 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) 有如下渐进界:

  1. 若对某个常数 ϵ > 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)
  2. 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)
  3. 若对某个常数 ϵ > 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值