1. 程式人生 > >演算法分析之時間複雜度與空間複雜度

演算法分析之時間複雜度與空間複雜度

演算法的評價指標主要是正確性,健壯性、可讀性和有效性4個方面,有效性又包括時間複雜度和空間複雜度。

演算法的時間複雜度和空間複雜度通常採用數量級的形式來表示,而數量的形式有常量階、對數階、線性階、線性對數階、平方階、立方階、指數階、階乘階等。若演算法的時間複雜度和空間複雜度越好,則演算法的執行效率越高。

1、時間複雜度

1.1、時間頻度T(n):一個演算法花費的時間與演算法中語句的執行次數成正比。一個演算法中的語句執行次數稱為語句頻度或時間頻度,記為T(n)。

如下列演算法段的語句頻度:T(n)=1+2+......+n=n(n+1)/2

for(I=1;i<n;i++)
{
    for(j=1;j<i;i++)
    {
       ;
    }
}

1.2、時間複雜度

在時間頻度中,n稱為問題的規模,T(n)隨著n的不斷變化而不斷變化。

設f(n)是T(n)的一個輔助函式,定義:

a.當n大於等於某個足夠大的正整數n_0時,存在兩個正常數A和B(A\leqslantB),使得A\leqslant \frac{T(n)}{f(n)}\leqslant B均成立;

或b.\lim_{n\rightarrow+\infty}\frac{T(n)}{f(n)}=A(A為常數),

則稱f(n)是T(n)的同數量級函式。把T(n)表示成數量級的形式為:T(n)=O(f(n)),O為英文Order(數量級)首字母。

如:T(n)=\frac{n(n+1)}{2},則有\lim_{n\rightarrow+\infty}\frac{T(n)}{n^2}=\frac{1}{2},故其時間複雜度為O(n^2),即T(n)與n^2數量級相同。

例:分析以下程式段的時間複雜度

i=1;                /***********①***********/
while(i<=n)
    i =i*2;         /***********②***********/

解:該程式語句①頻度為1;

設語句②的頻度為f(n),則有2^{f(n)}\leqslant n,即f(n)\leqslant\log_2n,取最大值f(n)=\log_2n

T(n)=1+f(n)=1+\log_2n=O(\log_2n)

1.3、總結

按數量級的增排序,常見的時間複雜度有:

常量階O(1)、對數階O(\log_2n)、線性階O(n)、線性對數階O(n\log_2n)、平方階O(n^2)、立方階O(n^3)、指數階O(2^n)、階乘階O(n!)等。

一個演算法的時間複雜度最好是常數階,最壞不超過k次冪階。如果演算法的時間複雜度為指數階,則該演算法無法使用。

2.空間複雜度

2.1、空間頻度:一個演算法在執行時所佔用的記憶體開銷,稱為空間頻度。

2.2、空間複雜度:指程式從開始到結束所需要的記憶體容量,即儲存量。

程式執行所需要的儲存空間包括:

a.固定部分:與所處理資料的大小和個數無關。主要包括程式程式碼、常量、簡單變數、定長成分的結構變數所佔的空間;

b.可變部分:一部分空間大小與演算法在某次執行處理的特定資料的大小與規模有關;另一部分包括遞迴棧所需的空間及動態分配空間。