数据结构入门——复杂度分析

  • 写在前面
  • 计算复杂度
  • 递归函数的时间复杂度
    • 分治法主定理
    • 例题与分析
    • 问题规模减小的递归主定理
  • 循环的时间复杂度
    • 数学基础
    • 例题与分析
  • 参考书籍

写在前面

本系列是记录与总结性质的文章,原创的内容少,记录的内容大都与考研有关。写博客的时间仓促,文中若有错误之处,恳请朋友们批评指正。


计算复杂度

以下内容几乎全部摘自《模式分类》1

为了分析和描述某个问题或为解决为题而设计的某个特定算法的难度,我们转而讨论计算复杂度的概念。我们使用函数的阶这一概念,并且还使用渐进记号 O()Ω(omega)Θ(theta) Ο ( 大 欧 ) , Ω ( o m e g a ) 和 Θ ( t h e t a ) 。

渐进上界 O(g(x))={f(x)cx0xx00f(x)cg(x)} Ο ( g ( x ) ) = { f ( x ) : 存 在 正 的 常 数 c 和 x 0 , 对 于 所 有 的 x ≥ x 0 , 有 0 ≤ f ( x ) ≤ c g ( x ) }
渐进下界 Ω(g(x))={f(x)cx0xx00cg(x)f(x)} Ω ( g ( x ) ) = { f ( x ) : 存 在 正 的 常 数 c 和 x 0 , 对 于 所 有 的 x ≥ x 0 , 有 0 ≤ c g ( x ) ≤ f ( x ) }
渐进紧界 Θ(g(x))={f(x)c1c2x0xx00c1g(x)f(x)c2g(x)} Θ ( g ( x ) ) = { f ( x ) : 存 在 正 的 常 数 c 1 , c 2 和 x 0 , 对 于 所 有 的 x ≥ x 0 , 有 0 ≤ c 1 g ( x ) ≤ f ( x ) ≤ c 2 g ( x ) }
数据结构入门——复杂度分析_第1张图片

例如,设 f(x)=px2+mx+n f ( x ) = p x 2 + m x + n ,我们有 f(x)=O(x2) f ( x ) = O ( x 2 ) ,因为对于足够大的 x x ,总可以选择恰当的 c,x0 c , x 0 ,使得 px2+mx+ncx2 p x 2 + m x + n ≤ c x 2 。需要指出,对于函数 f(x) f ( x ) ,其渐进上界不是唯一的。对于 f(x)=px2+mx+n f ( x ) = p x 2 + m x + n ,其渐进上界可以为 O(x2)O(x3)O(x4)O(x2lnx) O ( x 2 ) , O ( x 3 ) , O ( x 4 ) , O ( x 2 l n x ) ,等等。

在计算复杂度中,渐进上界这一概念是所有的这些渐进边界中最有用的,因为通常情况下,我们都希望知道某个问题(或算法)耗时或占用内存的上限。

递归函数的时间复杂度

下面不加证明的给出递归函数的时间复杂度结论2:,如果想要了解完整的证明,请参考《算法导论》3中的相关内容。不得不说,证明过程是相当复杂的。

分治法主定理

递归式是 T(n)=aT(nb)+O(nklogpn) T ( n ) = a T ( n b ) + O ( n k l o g p n ) ,其中 a1 a ≥ 1 b>1 b > 1 k0 k ≥ 0 p p 是实数,则:

1) 如果 a>bk a > b k ,那么 T(n)=O(nlogba) T ( n ) = O ( n l o g b a )
2) 如果 a=bk a = b k
  a. 如果 p>1 p > − 1 ,那么 T(n)=O(nlogbalogp+1n) T ( n ) = O ( n l o g b a l o g p + 1 n )
  b. 如果 p=1 p = − 1 ,那么 T(n)=O(nlogbaloglogn) T ( n ) = O ( n l o g b a l o g l o g n )
  c. 如果 p<1 p < − 1 ,那么 T(n)=O(nlogba) T ( n ) = O ( n l o g b a )
3) 如果 a<bk a < b k
  a. 如果 p0 p ≥ 0 ,那么 T(n)=O(nklogpn) T ( n ) = O ( n k l o g p n )
  b. 如果 p<0 p < 0 ,那么 T(n)=O(nk) T ( n ) = O ( n k )

例题与分析

问题1     T(n)=3T(n2)+n2 T ( n ) = 3 T ( n 2 ) + n 2
解答     T(n)=O(n2) T ( n ) = O ( n 2 ) (根据主定理 3.a)

问题2     T(n)=4T(n2)+n2 T ( n ) = 4 T ( n 2 ) + n 2
解答     T(n)=O(n2logn) T ( n ) = O ( n 2 l o g n ) (根据主定理 2.a)

问题3     T(n)=T(n2)+n2 T ( n ) = T ( n 2 ) + n 2
解答     T(n)=O(n2) T ( n ) = O ( n 2 ) (根据主定理 3.a)

问题4     T(n)=2nT(n2)+nn T ( n ) = 2 n T ( n 2 ) + n n
解答    不适用( a a 不是常数)

问题5     T(n)=16T(n4)+n T ( n ) = 16 T ( n 4 ) + n
解答     T(n)=O(n2) T ( n ) = O ( n 2 ) (根据主定理 1)

问题6     T(n)=2T(n2)+nlogn T ( n ) = 2 T ( n 2 ) + n l o g n
解答     T(n)=O(nlog2n) T ( n ) = O ( n l o g 2 n ) (根据主定理 2.a)

问题7     T(n)=2T(n2)+nlogn T ( n ) = 2 T ( n 2 ) + n l o g n
解答     T(n)=O(nloglogn) T ( n ) = O ( n l o g l o g n ) (根据主定理 2.b)

问题8     T(n)=2T(n4)+n0.51 T ( n ) = 2 T ( n 4 ) + n 0.51
解答     T(n)=O(n0.51) T ( n ) = O ( n 0.51 ) (根据主定理 3.b)

问题9     T(n)=0.5T(n2)+1n T ( n ) = 0.5 T ( n 2 ) + 1 n
解答    不适用( a<1 a < 1

问题10     T(n)=6T(n3)+n2logn T ( n ) = 6 T ( n 3 ) + n 2 l o g n
解答     T(n)=O(n2logn) T ( n ) = O ( n 2 l o g n ) (根据主定理 3.a)

问题11     T(n)=64T(n8)n2logn T ( n ) = 64 T ( n 8 ) − n 2 l o g n
解答    不适用(函数值非正数)

问题12     T(n)=7T(n3)+n2 T ( n ) = 7 T ( n 3 ) + n 2
解答     T(n)=O(n2) T ( n ) = O ( n 2 ) (根据主定理 3.a)

问题13     T(n)=4T(n2)+logn T ( n ) = 4 T ( n 2 ) + l o g n
解答     T(n)=O(n2) T ( n ) = O ( n 2 ) (根据主定理 1)

问题14     T(n)=16T(n4)+n! T ( n ) = 16 T ( n 4 ) + n !
解答     T(n)=O(n!) T ( n ) = O ( n ! ) (根据主定理 3.a)

问题15     T(n)=2T(n2)+logn T ( n ) = 2 T ( n 2 ) + l o g n
解答     T(n)=O(n) T ( n ) = O ( n ) (根据主定理 1)

问题16     T(n)=3T(n2)+n T ( n ) = 3 T ( n 2 ) + n
解答     T(n)=O(nlog3) T ( n ) = O ( n l o g 3 ) (根据主定理 1)

问题17     T(n)=3T(n3)+n T ( n ) = 3 T ( n 3 ) + n
解答     T(n)=O(n) T ( n ) = O ( n ) (根据主定理 1)

问题18     T(n)=4T(n2)+cn T ( n ) = 4 T ( n 2 ) + c n
解答     T(n)=O(n2) T ( n ) = O ( n 2 ) (根据主定理 1)

问题19     T(n)=3T(n4)+nlogn T ( n ) = 3 T ( n 4 ) + n l o g n
解答     T(n)=O(nlogn) T ( n ) = O ( n l o g n ) (根据主定理 3.a)

问题20     T(n)=3T(n3)+n2 T ( n ) = 3 T ( n 3 ) + n 2
解答     T(n)=O(nlogn) T ( n ) = O ( n l o g n ) (根据主定理 2.a)

问题规模减小的递归主定理

T(n) T ( n ) 为正整数 n n 的函数,对于某些常数 ca>0b>0k0 c , a > 0 , b > 0 , k ≥ 0 和函数 f(n)T(n) f ( n ) , T ( n ) 满足下面的性质:

T(n)={caT(nb)+f(n)n1n>1 T ( n ) = { c n ≤ 1 a T ( n − b ) + f ( n ) n > 1

如果 f(n) f ( n ) 的时间复杂度是 O(nk) O ( n k ) ,则

T(n)=O(nk)O(nk+1)O(nkanb)a1a=1a>1 T ( n ) = { O ( n k ) a ≤ 1 O ( n k + 1 ) a = 1 O ( n k a n b ) a > 1

循环的时间复杂度

数学基础

n n 项和公式

k=1nk=n(n+1)2 ∑ k = 1 n k = n ( n + 1 ) 2

平方和公式

k=1nk2=n(n+1)(2n+1)6 ∑ k = 1 n k 2 = n ( n + 1 ) ( 2 n + 1 ) 6

立方和公式

k=1nk=n2(n+1)24 ∑ k = 1 n k = n 2 ( n + 1 ) 2 4

例题与分析

for(int i=1; i <= n; i++){
    for(int j=1; j<= i; j++){
        for(int k=1; k <=j; k++){
            //do something
        }
    }
}

T(n)=i=1nj=1ik=1j1=i=1nj=1ij=i=1ni(i+1)2=12[n(n+1)(2n+1)6+n(n+1)2]=O(n3) T ( n ) = ∑ i = 1 n ∑ j = 1 i ∑ k = 1 j 1 = ∑ i = 1 n ∑ j = 1 i j = ∑ i = 1 n i ( i + 1 ) 2 = 1 2 [ n ( n + 1 ) ( 2 n + 1 ) 6 + n ( n + 1 ) 2 ] = O ( n 3 )

参考书籍


  1. (美)Richard O.Duda, Peter E.Hart, David G.Stork.模式分类(原书第2版)[M].李宏东, 姚天翔等, 译.北京:机械工业出版社.2003. ↩
  2. (印度)Narasimha Karumanchi.数据结构与算法经典问题解析(原书第2版)[M].骆嘉伟等,译.北京:机械工业出版社.2016. ↩
  3. (美)Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest等,著.算法导论(原书第3版)[M].殷建平,徐云,王刚等,译.北京:机械工业出版社.2013. ↩

你可能感兴趣的:(数据结构)