我們在度量一個程序(或者一個算法)執行時間的兩種方法
- 第一種最簡單,我們直接在分別運行需要比較的算法計算個需要的時間然后進行比較
當然這種解決方式也是存在問題的:一是要想對設計的算法的運行性能進行評測,需要實際運行該程序;二是所得到的時間統計量依賴於計算機的硬件、軟件等環境因素,這種方式要在同一台計算機的相同狀態下運行,才能比較哪一種算法效率更高 - 第二種通過分析某個算法的時間復雜度來判斷哪一個算法更優
我們在學習時間復雜度前需要了解時間頻度的概念
時間頻度
一個算法花費的時間於算法中語句執行次數成正比,哪個算法中語句執行的次數多,它花費的時間就多。一個算法中的語句執行次數稱之為語句頻度或者時間頻度。記為T(n)
1、時間頻度的常數項可以忽略
舉例說明
由圖中的表可知:
- 2n+20和2n隨着n變大,執行曲線無線接近,20可以忽略
- 3n+10和3n隨着n變大,執行曲線無線接近,10可以忽略
2、時間頻度的低次項可以忽略
結論:
- 2n2+3n+10和2n2隨着n變大,執行曲線無線接近,可以忽略3n+10
- n2+5n+20和n2隨着n變大,執行曲線無線接近,可以忽略5n+20
3、時間頻度可以忽略系數
結論
- 隨着n值變大,5n2+7n和3n2+2n,執行曲線重合,說明這種情況下,5和3可以忽略
- 而n3+5n和6n3+4n,執行曲線分離,說明多少次放是關鍵
然后我們再介紹時間復雜度
時間復雜度
- 一般情況下,算法中的基本操作語句的重復執行次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)時T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n))為算法的漸進時間復雜度,簡稱時間復雜度
- T(n)不同,但時間復雜度可能相同。如:T(n)=n2+7n+6與T(n)=3n2+2n+2他們的T(n)不同,但時間復雜度相同,都稱為O(n2)
- 計算時間復雜度的方法:
①用常數1代替運行時間中的所有加法常數
②需改后的運行次數函數中,只保留最高階
③取出最高階項的系數
常見的時間復雜度
常見的算法時間復雜度由小到大一次為:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)< Ο(nk) <Ο(2n) ,隨着問題規模n的不斷增大,上述時間復雜度不斷增大,算法的執行效率越低
從圖中可見,我們應該盡可能避免使用指數階的算法
① 常數階
② 對數階
③ 線性階
④ 線性對數階
⑤ 平方階
算法的平均時間復雜度和最壞時間復雜度
- 平均時間復雜度是指所有可能的輸入實例均以等概率出現的情況下,該算法的運行時間。
- 最壞情況下的時間復雜度稱最壞時間復雜度。一般討論的時間復雜度均是最壞情況下的時間復雜度。 這樣做的原因是:最壞情況下的時間復雜度是算法在任何輸入實例上運行時間的界限,這就保證了算法的運行時間不會比最壞情況更長。
- 平均時間復雜度和最壞時間復雜度是否一致,和算法有關(如圖:)。
算法的空間復雜度
- 類似於時間復雜度的討論,一個算法的空間復雜度(Space Complexity)定義為該算法所耗費的存儲空間,它也是問題規模n的函數。
- 空間復雜度(Space Complexity)是對一個算法在運行過程中臨時占用存儲空間大小的量度。有的算法需要占用的臨時工作單元數與解決問題的規模n有關,它隨着n的增大而增大,當n較大時,將占用較多的存儲單元,例如快速排序和歸並排序算法就屬於這種情況
- 在做算法分析時,主要討論的是時間復雜度。從用戶使用體驗上看,更看重的程序執行的速度。一些緩存產品(redis, memcache)和算法(基數排序)本質就是用空間換時間.