大話資料結構 Chapter 2 演算法
2.1 演算法定義
演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作
2.2 演算法的特性
演算法具有五個基本特性:輸入、輸出、有窮性、確定性和可行性。
2.2.1 輸入輸出
演算法有0個或多個輸入,至少有一個或多個輸出。
2.2.2 有窮性
有窮性:指演算法在執行有限的步驟之後,自動結束而不會出現無限迴圈,並且每一個步驟可在可接受的時間內完成。
2.2.3 確定性
確定性:演算法的每一步驟都具有明確的含義,不會出現二義性。
2.2.4 可行性
可行性:演算法的每一步都必須是可行的,也就是說,每一步都能夠通過執行有限次數完成。
2.3 演算法設計的要求
好的演算法具有的特性:
2.3.1 正確性
正確性:演算法的正確性是指演算法至少應該具有輸入、輸出和加工處理無歧義性、能正確反映問題的需求、能夠得到問題的正確答案。
正確性可以分為四個層次:
- 演算法程式沒有語法錯誤
- 演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果
- 演算法程式對於非法的輸入資料能夠得出滿足規格說明的結果
- 演算法程式對於精心選擇的,甚至刁難的測試資料都有滿足要求的輸出結果。
層次依次提高。
2.3.2 可讀性
可讀性:演算法設計的另一目的是為了便於閱讀、理解和交流
2.3.3 健壯性
健壯性:當輸入不合法時,演算法也能作出相關處理,而不是產生異常或莫名奇妙的結果。
2.3.4 時間效率高和儲存量低
設計演算法應儘量滿足時間效率高和儲存量低的要求。
2.4 演算法效率的度量方法
2.4.1 事後統計方法
事後統計方法:這種防風主要是通過設計好的測試程式和資料,利用計算機時對不同演算法的編制的程式的執行時間進行比較,從而確定演算法效率的高低。
存在很大缺陷:
- 必須事先編寫好程式
- 依賴計算機硬體和軟體等環境因素
- 測試資料設計困難
因此,基於事後統計防風,我們通常不予採納。
2.4.2 事前分析估算方法
事前分析估算方法:在計算機程式編制前,依據統計方法對演算法進行估算。
高階程式語言便攜的程式執行時消耗時間的影響因素:
- 演算法採用的策略、方法
- 編譯產生的程式碼質量:受軟體影響
- 問題輸入的規模
- 機器執行指令的速度
在分析程式的執行時間時,最重要的是把程式看成是獨立於程式設計的語言的演算法或一系列步驟。
2.5 演算法時間複雜度
2.5.1 演算法時間複雜度定義
在進行演算法分析時,語句總的執行次數T(n)是關於問題規模n的函式,進而分析T(n)隨n的變化情況並確定T(n)的數量級。演算法的時間複雜度,是演算法的時間量度,記作:T(n)=O(f(n))。它表示隨問題規模n的增大,稱作演算法的漸進時間複雜度,簡稱時間複雜度。f(n)是問題規模n的某個函式。
O( )來體現演算法時間複雜度的記法,稱之為大O記法。
最優演算法是T(n)增長最慢的演算法。
2.5.2 推倒大O階方法
推到大O階:
- 用常數1取代執行時間中的所有加法常數
- 在修改後的執行次數函式中,只保留最高階項
- 如果最高階項存在且不是1,則去除與這個項相乘的常數,得到的結果就是大O階。
2.5.3 常數階
執行時間恆定,與問題規模無關的程式是O(1)複雜度。
2.5.4 線性階
要分析演算法的複雜度,關鍵就是要分析迴圈結構的執行情況。
除了常數階和線性階,還有對數階、平方階、立方階和指數階等。
2.6 常見的時間複雜度
執行次數函式 | 階 | 非正式術語 |
---|---|---|
12 | O(1) | 常數階 |
2n+3 | O(n) | 線性階 |
3n^2+2n+1 | O(n^2) | 平方階 |
5log_2n+20 | O(logn) | 對數階 |
2n+nlog_2n+19 | O(nlogn) | nlogn階 |
6n3+2n2+3n+4 | O(n^3) | 立方階 |
2^n | O(2^n) | 指數階 |
注意O(logn)的時間複雜度比O(n)小。
2.7最壞情況與平均情況
最壞情況執行時間是一種保證,執行時間不能再壞了。除非特別指定的情況,一般提到的執行時間都是最壞情況的執行時間。
平均執行時間是所有情況中最有意義的,因為它是期望的執行時間。
2.8 演算法空間複雜度
演算法的空間複雜度通過計算演算法所需的儲存空間實現,演算法空間複雜度的計算公式記作:S(n)=O(f(n)),其中,n為問題的規模,f(n)為語句關於n所佔儲存空間的函式。