1. 程式人生 > >重拾演算法與資料結構之時空複雜度

重拾演算法與資料結構之時空複雜度

時間複雜度和空間複雜度是學習資料結構的關鍵

1.大O複雜度表示法

舉個例子:

T(n) = unit_Time*(n^2+2n+1)  

T(n):程式碼執行的總時間

unit_Time:每行程式碼執行的時間

n^2+2n+1:表示程式碼執行的行數

n:一行程式碼的執行次數

按照上面的例子推出大O表示式:

T(n)=O(f(n)):n表示資料規模;f(n)表示程式碼執行的次數;O表示程式碼的執行次數與程式碼的執行時間成正比

所以上面例子可以表示為 O(n^2+2n+1)

大O時間複雜度並不表示程式碼的執行時間,而是表示程式碼的執行時間隨資料規模的增長趨勢,也叫漸近時間複雜度,簡稱時間複雜度。

當資料規模n很大時,公式中的低階,常量和係數都不能左右增長趨勢,所以可以忽略,只需要記錄最大量級,所以如果用大O表示法表示上面的例子

O(n^2)

2.時間複雜度分析

1)只關注迴圈字數最多的一段程式碼

2)加法原則,這段程式碼多處迴圈,總複雜度等於量級最大的程式碼複雜度

3)乘法原則,巢狀程式碼的複雜度等於巢狀內外的程式碼複雜度的乘積。

3.幾種常見的時間複雜度分析

對於複雜度量級,可以區分為兩類:多項式量級和非多項式量級(O(2^n),O(n!))

對於非多項式量級的問題我們稱為NP問題,當資料規模n增加時,非多項式量級的執行時間會急劇上漲,所以非多項式量級的演算法是很低效的。

主要介紹下多項式量級的複雜度

1)O(1):並不表示只執行一行程式碼,而是常量級。並不隨n發生變化。

2)O(logn),O(nlogn):

如下程式碼:

i = 1;

while(i <= n){

i = i*3

}

這段程式碼的執行次數是log3n 時間複雜度是O(logn)

不管對數的底是多少,我們都可以使用logn表示時間複雜度。這是因為對數間可以相互轉換。log3n*log23 = log2n。

3)O(m+n),O(m*n)

程式碼的複雜度由兩個資料規模決定,不能確定m,n誰更大

4.空間複雜度

空間複雜度就是漸近空間複雜度,表示演算法的儲存空間與資料規模之間增長關係。

int[] a = new int[n];

空間複雜度為O(n);