重拾演算法與資料結構之時空複雜度
時間複雜度和空間複雜度是學習資料結構的關鍵
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表示法表示上面的例子
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);