時間複雜度和空間複雜度簡述

 

 

  定義:一個算法中的語句執行次數稱爲 語句頻度 或 時間頻度;算法

  約定:檢驗算法的效率,主要考慮 最壞時間複雜度 和 平均時間複雜度 通常不特別說明,討論的時間複雜度均是最壞狀況下的時間複雜度函數

一、時間複雜度post

  一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但咱們不可能也沒有必要對每一個算法都上機測試,只需知道哪一個算法花費的時間多,哪一個算法花費的時間少就能夠了。而且一個算法花費的時間與算法中語句的執行次數成正比例,哪一個算法中語句執行次數多,它花費時間就多。測試

  在時間頻度中,n稱爲問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。可是它的變化是有規律的,因此引入時間複雜度這個概念。通常狀況下,算法中的基本操做重複次數的是問題規模n的某個函數,用T(n)表示,如有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值爲不等於零的常數,則稱f(n)是T(n)的同數量級函數。記做T(n)=O(f(n)),稱O(f(n)) 爲算法的漸進時間複雜度,簡稱時間複雜度。code

  計算時間複雜度blog

  (1) 若是算法的執行時間不隨着問題的規模n的增加而增加,即便算法中有上千條語句,執行時間也只是一個比較大的常數。此類算法的時間複雜度爲O(1);遞歸

   按數量級遞增排列,常見的時間複雜度有:常數階O(1),對數階O(log2n),線性階O(n), 線性對數階O(nlog2n),平方階O(n2),立方階O(n3),..., k次方階O(nk),指數階O(2n)。隨着問題規模n的不斷增大,上述時間複雜度不斷增大,算法的執行效率越低。內存

1 i = 100000;
2 while(i--) {
3   printf("hello");
4 }

  解答:it

  這個算法循環100000次,雖然它運行次數很是多,可是主要執行的第三行的執行時間是常數值,因此他的時間複雜度爲常數階O(1);class

  (2) 當有多個循環嵌套時,算法的時間複雜度是由嵌套層數最多的循環語句的語句頻度決定的

1 x=0; 
2 for(i=1;i<=n;i++) 
3     for(j=1;j<=i;j++)
4        for(k=1;k<=j;k++)
5           x++; 

  這個算法中主要執行的是第5行,它的執行時間是常數值,可是它上面有三層循環,每層每次分別執行是(從最外層到內) [(n-1) ],[(n-1)+(n-2) ....],[(n-1-1)+(n-2-1) ....] 次,因此該算法的時間複雜度爲O(n3+ 剩餘低次項) ≈O(n3);

  PS: 簡單的計算方式(只能參考): 一個循環爲n,一個嵌套是n+1,並列時是+n,最後結果取最大項;

二、空間複雜度

  一個程序的空間複雜度是指運行完一個程序所需內存的大小。

  (1) 固定部分。這部分空間的大小與輸入/輸出的數據的個數多少、數值無關。主要包括指令空間(即代碼空間)、數據空間(常量、簡單變量)等所佔的空間。這部分屬於靜態空間。
  (2) 可變空間,這部分空間的主要包括動態分配的空間,以及遞歸棧所需的空間等。這部分的空間大小與算法有關。
  一個算法所需的存儲空間用f(n)表示。S(n)=O(f(n)) 其中n爲問題的規模,S(n)表示空間複雜度。
相關文章
相關標籤/搜索