參考文章:數據結構算法之美
由於算法的設計常常需要我們特別的關注算法的執行時間,所以,我們需要一些方法來估算算法的執行效率。
事後統計法
事後統計法主要在算法完成之後,在以來測試環境和數據的情況下,對算法的效率進行測試,根據算法在不同數據量級下的執行效率來評估算法的總體效率
事後統計法存在很多的侷限性:
- 測試結果非常依賴測試環境
- 測試結果受數據規模的影響很大
- 測試數據的設計非常困難
由於事後統計法的侷限性,我們需要一個不用具體測試數據和測試環境就能估算出算法執行效率的方法
大 O 複雜度表示法
算法的執行效率,我們可以大致地認爲是算法的執行的時間長短。假定一行代碼每次執行的時間爲單位時間 unit_time,代碼執行 n 次,那麼執行的總時間就是 n * unit_time。可以看出,代碼的執行時間 T(n) 與每行代碼的執行次數 n 成正比
我們可以用一個公式表示:T(n) = O(f(n))
其中 Tn 表示代碼的執行時間,f(n) 表示每行代碼執行的次數總和,O 表示 Tn 與 f(n) 是正比關係
大 O 表示法並不能代表算法真正的執行時間,而是代表 代碼執行的時間隨數據規模增長的變化趨勢
,所以叫做 漸進時間複雜度
,簡稱 時間複雜度
時間複雜度分析
因爲大 O 表示法表示的是一種變化趨勢,所以我們常常會忽略掉公式中的常量、低階、係數,只需要關注最大階的量級即可。所以再分析一段代碼的時間複雜度的時候,只需要關注循環次數最多的那一段代碼就可以了
- 關注循環次數最多的代碼
- 總複雜度等於量級最大的那段代碼的複雜度
- 嵌套代碼的複雜度等於嵌套內外代碼複雜度的乘積
常見的複雜度
量級 | 大 O 表示法 |
---|---|
常數階 | O(1) |
線性階 | O(n) |
平方階 | O(n^2) |
對數階 | O(logn) |
線性對數階 | O(nlogn) |
指數階 | O(2^n) |
階乘階 | O(n!) |
k次方階 | O(n^k) |
空間複雜度
空間複雜度的全稱是 漸進空間複雜度
,表示算法的存儲空間與數據規模之間的增長關係