表示時間復雜度的階有:
O(1) :常量時間階 O (n):線性時間階
O(㏒n) :對數時間階 O(n㏒n) :線性對數時間階
O (nk): k≥2 ,k次方時間階
例1 兩個n階方陣的乘法
for(i=1,i<=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
