1. 程式人生 > >演算法時間複雜度計算方法

演算法時間複雜度計算方法

一、概念:
時間複雜度是總運算次數表示式中受n的變化影響最大的那一項(不含係數)
比如:一般總運算次數表示式類似於這樣:
a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+f
a ! =0時,時間複雜度就是O(2^n);
a=0,b<>0 =>O(n^3);
a,b=0,c<>0 =>O(n^2)依此類推
例項:

for(i=1;i<=n;i++) {//迴圈了n*n次,當然是O(n^2)
    for(j=1;j<=n;j++) {
        s++;
    }
}   
for(i=1;i<=n;i++) {//迴圈了(n+n-1
+n-2+...+1)≈(n^2)/2,因為時間複雜度是不考慮係數的,所以也是O(n^2) for(j=i;j<=n;j++) { s++; } } for(i=1;i<=n;i++) {//迴圈了(1+2+3+...+n)≈(n^2)/2,當然也是O(n^2) for(j=1;j<=i;j++) { s++; } } i=1;k=0; while(i<=n-1){ //迴圈了n-1≈n次,所以是O(n) k+=10*i; i++; } for(i=1;i<=n;i++) { //迴圈了(1^2+2
^2+3^2+...+n^2)=n(n+1)(2n+1)/6(這個公式要記住哦)≈(n^3)/3,不考慮係數,自然是O(n^3) for(j=1;j<=i;j++) { for(k=1;k<=j;k++) { x=x+1; } } } i=1; while (i<=n) { i=i*2; } /*解:語句1的頻度是1, 設語句2的頻度是t, 則:nt<=n; t<=log2n 考慮最壞情況,取最大值t=log2n, T(n) = 1 + log2n f(n) = log2n lim(T
(n)/f(n)) = 1/log2n + 1 = 1 T(n) = O(log2n)*/

另外,在時間複雜度中,log(2,n)(以2為底)與lg(n)(以10為底)是等價的,因為對數換底公式:
log(a,b)=log(c,b)/log(c,a)
所以,log(2,n)=log(2,10)*lg(n),忽略掉係數,二者當然是等價的

二、計算方法:
求解演算法的時間複雜度的具體步驟是:
  ⑴ 找出演算法中的基本語句;
  演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。
  ⑵ 計算基本語句的執行次數的數量級;
  只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。
  ⑶ 用大Ο記號表示演算法的時間效能。
  將基本語句執行次數的數量級放入大Ο記號中。
  如果演算法中包含巢狀的迴圈,則基本語句通常是最內層的迴圈體,如果演算法中包含並列的迴圈,則將並列迴圈的時間複雜度相加。例如:
  for (i=1; i<=n; i++)
  x++;
  for (i=1; i<=n; i++)
  for (j=1; j<=n; j++)
  x++;
  第一個for迴圈的時間複雜度為Ο(n),第二個for迴圈的時間複雜度為Ο(n^2),則整個演算法的時間複雜度為Ο(n+n^2)=Ο(n^2)。
常見的時間複雜度:
常見的演算法時間複雜度由小到大依次為:
  Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)<Ο(n!)

其中,
1.Ο(1)表示基本語句的執行次數是一個常數,一般來說,只要演算法中不存在迴圈語句,其時間複雜度就是Ο(1)。
2.O(n),O(n^2), 立方階O(n^3),…, k次方階O(n^k) 為多項式階時間複雜度,分別稱為一階時間複雜度,二階時間複雜度。。。。
3.O(2^n),指數階時間複雜度,該種不實用
4.對數階O(log2n), 線性對數階O(nlog2n),除了常數階以外,該種效率最高
例:演算法:

for(i=1;i<=n;++i)
  {
     for(j=1;j<=n;++j)
     {
         c[ i ][ j ]=0; //該步驟屬於基本操作 執行次數:n^2
          for(k=1;k<=n;++k)
               c[ i ][ j ]+=a[ i ][ k ]*b[ k ][ j ]; //該步驟屬於基本操作 執行次數:n^3
     }
  }

則有 T(n)= n^2+n^3,根據上面括號裡的同數量級,我們可以確定 n^3為T(n)的同數量級
則有f(n)= n^3,然後根據T(n)/f(n)求極限可得到常數c
則該演算法的 時間複雜度:T(n)=O(n^3)