複雜度分析

什麼是複雜度分析?

數據結構和算法本身解決的是“快”和“省”的問題,即如何讓代碼運行得更快,如何讓代碼更省存儲空間,因而需要從執行時間和佔用空間兩個維度來評估代碼的性能問題。

複雜度也叫漸近複雜度,包括時間複雜度和空間複雜度,用來分析算法的執行效率(或佔用空間)與數據模塊的增長關係,可以粗略表示,越高階複雜度的算法,執行效率越低。


爲什麼要進行複雜度分析?

1、和性能測試相比,複雜度分析有不依賴執行環境、成本低、效率高、易操作、指導性強的特點。

2、掌握複雜度分析,將能編寫出性能更優的代碼,有利於降低系統開發和維護成本。

3、事後統計法的測試結果非常依賴測試環境,且測試結果受數據規模的影響很大。

    事後統計法:把代碼跑一遍,通過統計、監控,就能得到算法執行的時間和佔用的內存大小。


 如何進行複雜度分析?

大O時間複雜度表示法

算法的執行時間與每行代碼執行次數的總和成正比,用T(n) = O(f(n))表示,其中T(n)表示算法執行總時間,f(n)表示每行代碼執行次數的總和,n表示數據的規模。

大O時間複雜度實際上並不具體表示代碼真正的執行時間,而是表示代碼執行時間隨數據增長的變化趨勢。

以時間複雜度爲例,由於時間複雜度描述的是算法執行時間與數據規模的增長變化趨勢,所以常量階、低階以及係數實際上對這種增長趨勢不產決定性影響,所以在做時間複雜度分析時忽略這些項。


時間複雜度分析方法

1. 只關注循環執行次數最多的一段代碼

    我們在分析一個算法、一段代碼的時間複雜度的時候,也只關注循環執行次數最多的那一段代碼就可以了。

2. 加法法則:總複雜度等於量級最大的那段代碼的複雜度(多個算法、多段代碼)

如果 T1(n)=O(f(n)),T2(n)=O(g(n));那麼 T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n))) =O(max(f(n), g(n)))

3. 乘法法則:嵌套代碼的複雜度等於嵌套內外代碼複雜度的乘積


幾種常見複雜度分析

多項式階:隨着數據規模的增長,算法的執行時間和空間佔用,按照多項式的比例增長。包括,O(1)(常數階)、O(logn)(對數階)、O(n)(線性階)、O(nlogn)(線性對數階)、O(n^2)(平方階)、O(n^3)(立方階)


非多項式階:當數據規模 n 越來越大時,非多項式量級算法的執行時間會急劇增加,求解問題的執行時間會無限增長。包括,O(2^n)(指數階)、O(n!)(階乘階)


O(1)

只要代碼的執行時間不隨 n 的增大而增長,這樣代碼的時間複雜度我們都記作 O(1)。或者說,一般情況下,只要算法中不存在循環語句、遞歸語句,即使有成千上萬行的代碼,其時間複雜度也是O(1)。


O(logn)、O(nlogn)

在採用大 O 標記複雜度的時候,可以忽略係數,即 O(Cf(n)) = O(f(n))。

在對數階時間複雜度的表示方法裏,我們忽略對數的“底”,統一表示爲 O(logn)


O(m+n)、O(m*n)

代碼的複雜度由兩個數據的規模來決定,即T1(m) + T2(n) = O(f(m) + g(n))


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章