1. 程式人生 > >時間復雜度和空間復雜度

時間復雜度和空間復雜度

變量 效率 spa 表達式 圖像 .com urn 代碼 需要

B 先引入一段代碼:

 1 int cal(int n) {
 2    int ret = 0; 
 3    int i = 1;
 4    for (; i < n; ++i) {
 5      ret = ret + f(i);
 6    } 
 7  } 
 8  
 9  int f(int n) {
10   int sum = 0;
11   int i = 1;
12   for (; i < n; ++i) {
13     sum = sum + i;
14   } 
15   return sum;
16  }

對於cal函數,只看執行次數最多的4~6行代碼,負責一共執行了2n次,可對於f函數內部也執行了2n次,那麽總的時間復雜度就是:T(n)= O(cal(n)* f (n)= O(4n^2)= O(n^2)。

時間和空間復雜度用來度量程序的運行時間效率和占用空間大小,即大O表示法:T(n) = O(f(n)),最終求得的時間復雜度,需要省略掉表達式中的系數、低階、常量,因為我們只關心占用時間和空間最大的那一部分代碼。

幾種常見的時間復雜度量級:

技術分享圖片

這裏主要分析一下對數階復雜度,這樣一段代碼:

1  i=1;
2  while (i <= n)  {
3    i = i * 2;
4  }

變量i從1開始取值,每次循環乘以2,得出2^x=n,根據對數公式,x = log2^n,忽略掉對數底,則時間復雜度為O(logn)。

時間復雜度的全稱是漸進時間復雜度,表示算法的執行時間與數據規模之間的增長關系,那麽空間復雜度就是表示算法的存儲空間和數據規模之間的存儲關系。空間復雜度的分析只要計算出是否持續的申請內存就好,常見的空間復雜度是O(1)、O(n)、O(n^2)。越高階復雜度的算法,執行效率越低,從小到大依次是:O(1)、O(logn)、O(n)、o(nlogn)、o(n^2) ,對應圖像:

技術分享圖片

時間復雜度和空間復雜度