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


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

  約定:檢驗算法的效率,主要考慮 最壞時間復雜度平均時間復雜度 一般不特別說明,討論的時間復雜度均是最壞情況下的時間復雜度

1、時間復雜度

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

  在時間頻度中,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)) 為算法的漸進時間復雜度,簡稱時間復雜度。

  計算時間復雜度

  (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 }

  解答:

  這個算法循環100000次,雖然它運行次數非常多,但是主要執行的第三行的執行時間是常數值,所以他的時間復雜度為常數階O(1);

  (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,最后結果取最大項;

2、空間復雜度

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM