時間復雜度例子


時間復雜度計算實例

表示時間復雜度的階有:

O(1) :常量時間階          O (n):線性時間階

O(㏒n) :對數時間階    O(n㏒n) :線性對數時間階

O (nk): k≥2 ,k次方時間階

例1  兩個n階方陣的乘法

              for(i=1i<=n; ++i)

                  for(j=1; j<=n; ++j)

                     {   c[i][j]=0 ;

                          for(k=1; k<=n; ++k)

                         c[i][j]+=a[i][k]*b[k][j] ; 

}

由於是一個三重循環,每個循環從1到n,則總次數為: n×n×n=n3 時間復雜度為T(n)=O(n3)【立方階】

例2  {++x; s=0 ;}

x自增看成是基本操作,則語句頻度為1,即時間復雜度為O(1) 。【常量階】

如果將s=0也看成是基本操作,則語句頻度為2,其時間復雜度仍為O(1),即常量階。

例3   for(i=1; i<=n; ++i)

               { ++x; s+=x ; } 

語句頻度為:2n,其時間復雜度為:O(n) ,即為【線性階】。

例4   for(i=1; i<=n; ++i)

    for(j=1; j<=n; ++j)

                   { ++x; s+=x ; }

   語句頻度為:n*n*2=2n2 ,其時間復雜度為:O(n2) ,即為【平方階】。

定理:若A(n)=amnm +am-1nm-1+…+a1n+a0是一個m次多項式,則A(n)=O(nm)

例5   for(i=2;i<=n;++i)

              for(j=2;j<=i-1;++j)

                    {++x; a[i,j]=x; }

語句頻度為:   1+2+3+…+n-2=(1+n-2) ×(n-2)/2

=(n-1)(n-2)/2 =n2-3n+2

 ∴時間復雜度為O(n2),即此算法的時間復雜度為【平方階】。

一個算法時間為O(1)的算法,它的基本運算執行的次數是固定的。因此,總的時間由一個常數(即零次多項式)來限界。而一個時間為O(n2)的算法則由一個二次多項式來限界。

以下六種計算算法時間的多項式是最常用的。其關系為:

     O(1) < O(n) < O(n) < O(n㏒n) < O(n2) < O(n3)

  指數時間的關系為:

    O(2n) < O(n!) < O(nn)

n取得很大時,指數時間算法和多項式時間算法在所需時間上非常懸殊。

1:素數的判斷算法。

void prime( int n)

 

{  

int i=2 ;

while ( (n%i)!=0 && i*1.0< sqrt(n) )  

     i++ ;

if (i*1.0>sqrt(n) )

      printf(“&d 是一個素數\n” , n) ;

else

      printf(“&d 不是一個素數\n” , n) ;

}

嵌套的最深層語句是i++;其頻度由條件( (n% i)!=0 && i*1.0< sqrt(n) )決定,顯然i*1.0< sqrt(n) ,時間復雜度O(n1/2)。

或者說是O(sqrt(n));

 

2:冒泡排序法。

Void bubble_sort(int a[],int n)

{  

change=false;

for (i=n-1; change=TURE; i>1 && change; --i)

for (j=0; j<i; ++j)

if (a[j]>a[j+1])

    {     a[j] ←→a[j+1] ;   change=TURE ; }

}

最好情況:0次

最壞情況:1+2+3+⋯+n-1=n(n-1)/2

平均時間復雜度為: O(n2)  【平方階】   

轉載http://blog.sina.com.cn/s/blog_6b7c77e00101hzgr.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM