1. 程式人生 > >回爐篇4—資料結構(3)之演算法的時間複雜度、空間複雜度

回爐篇4—資料結構(3)之演算法的時間複雜度、空間複雜度

演算法的時間複雜度、空間複雜度

時間複雜度

定義:基本操作重複執行的次數是問題規模n的某個函式,用T(n)表示,有輔助函式f(n),使得當n趨於無窮大時,T(n)/t(n)的極限值為不等於零的常數。記作T(n)=O(f(n)),稱O(f(n))為演算法的漸進時間複雜度,簡稱時間複雜度。

計算步驟:
1.執行次數
基本操作即演算法中的每條語句(以;號作為分割),預設考慮最壞情況,語句的執行次數也叫做語句的頻度。
2.計算出T(n)的數量級
忽略常量、低次冪和最高次冪的係數。
3.用大O表示時間複雜度
當n趨近於無窮大時,如果lim(T(n)/f(n))的值為不等於0的常數,則稱f(n)是T(n)的同數量級函式。記作T(n)=O(f(n))。

示例:
(1) int num1,num2;
(2) for(int i=0;i<n;i++){
(3) num 1+=1;
(4) for(int j=1;j<=n;j*=2){
(5) num2+=num1;
(6) }
(7)}
分析:
1.
語句int num1,num2 頻度為1;
語句int i=0; 頻度為1;
語句i<n;i++;num1+=1;int j=1;頻度為n;
語句j<=n;j*=2;num2+=num1;頻度為nlog2n;
T(n)=2+4n+3n
log2n

2.忽略掉T(n)中的常量、低次冪和最高次冪的係數
f(n) = n*log2n

3.lim(T(n)/f(n)) = (2+4n+3nlog2n) / (nlog2n)
= 2*(1/n)(1/log2n) + 4(1/log2n) + 3

當n趨向於無窮大,1/n趨向於0,1/log2n趨向於0
所以極限等於3。

T(n) = O(n*log2n)

當然,有更便捷的方法算出時間複雜度。
簡化步驟:
1.找到執行次數最多的語句。
2.計算語句執行次數的數量級。
3.用大O來表示結果。
(一般是最內迴圈的句子)

以上例分析:
1.num2+=num1;
2.T(n)=nlog2n;
f(n)=n
log2n;
3.lim(T(n)/f(n))=1
T(n)=O(n*og2n);

最壞時間複雜度:
不加說明時,都採用最壞時間複雜度。
求數量級:
未知數的數量級為其最接近的數量級。
求極限的技巧:
利用好1/n。當n趨於無窮大時,1/n趨向於0 。
加法規則:
T(n,m) = T1(n) + T2(n) = O (max ( f(n), g(m) )

乘法規則:
T(n,m) = T1(n) * T2(m) = O (f(n) *g(m))

一個特例(問題規模為常量的時間複雜度)
在大O表示法裡面有一個特例,如果T1(n) = O©, c是一個與n無關的任意常數,T2(n) = O ( f(n) ) 則有
T(n) = T1(n) * T2(n) = O ( c*f(n) ) = O( f(n) )

也就是說,在大O表示法中,任何非0正常數都屬於同一數量級,記為O(1)。

複雜度與時間效率的關係:

c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一個常量)
|--------------------------|--------------------------|-------------|
較好 一般 較差

空間複雜度

空間複雜度(Space Complexity) 是對一個演算法在執行過程中臨時佔用儲存空間大小的量度,記做 S(n)=O(f(n)) ,其中n為問題的規模。利用演算法的空間複雜度,可以對演算法的執行所需要的記憶體空間有個預先估計。
  一個演算法執行時除了需要儲存本身所使用的指令、常數、變數和輸入資料外,還需要一些對資料進行操作的工作單元和儲存一些計算所需的輔助空間。演算法執行時所需的儲存空間包括以下兩部分。  
(1)固定部分。這部分空間的大小與輸入/輸出的資料的個數、數值無關。主要包括指令空間(即程式碼空間)、資料空間(常量、簡單變數)等所佔的空間。這部分屬於靜態空間。
(2)可變空間,這部分空間的主要包括動態分配的空間,以及遞迴棧所需的空間等。這部分的空間大小與演算法有關。
  舉例分析演算法的空間複雜度:
public void reserse(int[] a, int[] b) {
int n = a.length;
for (int i = 0; i < n; i++) {
b[i] = a[n - 1 - i];
}
}
上方的程式碼中,當程式呼叫 reserse() 方法時,要分配的記憶體空間包括:引用a、引用b、區域性變數n、區域性變數i

因此 f(n)=4 ,4為常量。所以該演算法的空間複雜度 S(n)=O(1)

References

資料結構01 演算法的時間複雜度和空間複雜度
演算法時間複雜度的計算 [整理]
演算法的時間複雜度和空間複雜度計算