資料結構和演算法解決的問題是「如何讓計算機更快時間、更省空間地工作」;
更快、更省的效能需要有東西來衡量,複雜度分析就是分別從執行時間和占用空間兩個維度來評估資料結構和演算法的效能;
分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。
複雜度描述的是演算法執行時間(或占用空間)與資料規模的增長關係。
和效能測試相比,複雜度分析有不依賴執行環境、成本低、效率高、易操作、指導性強的特點。
掌握複雜度分析,將能編寫出效能更優的**,有利於降低系統開發和維護成本。
三、如何進行複雜度分析?
1)**
演算法的執行時間與每行**的執行次數成正比,用t(n) = o(f(n))表示,其中t(n)表示演算法執行總時間,f(n)表示每行**執
行總次數,而n往往表示資料的規模。
2)特點
以時間複雜度為例,由於時間複雜度描述的是演算法執行時間與資料規模的增長變化趨勢,所以常量階、低階以及係數實際
上對這種增長趨勢不產決定性影響,所以在做時間複雜度分析時忽略這些項。
1)單段**看高頻:迴圈次數最多的一段**;
2)多段**取最大:比如一段**中有單迴圈和多重迴圈,那麼取多重迴圈的複雜度;
3)巢狀**求乘積:巢狀**的複雜度等於巢狀內外複雜度的乘積;
4)多個規模求加法:比如方法有兩個引數控制兩個迴圈的次數,那麼這時就取二者複雜度相加。
多項式階:隨著資料規模的增長,演算法的執行時間和空間占用,按照多項式的比例增長。包括:
o(1)(常數階)、o(logn)(對數階)、o(n)(線性階)、o(nlogn)(線性對數階)、o(n^2)(平方階)、
o(n^3)(立方階);
非多項式階:隨著資料規模的增長,演算法的執行時間和空間占用暴增,這類演算法效能極差。包括,
o(2^n)(指數階)、o(n!)(階乘階);
複雜度分析關鍵在於多練,所謂孰能生巧。
1.最好情況時間複雜度:**在最理想情況下執行的時間複雜度。
2.最壞情況時間複雜度:**在最壞情況下執行的時間複雜度。
3.平均時間複雜度:用**在所有情況下執行的次數的加權平均值表示。
4.均攤時間複雜度:在**執行的所有複雜度情況中絕大部分是低階別的複雜度,個別情況是高階別複雜度且發生具有時
序關係時,可以將個別高階別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。
1.同一段**在不同情況下時間複雜度會出現量級差異,為了更全面,更準確的描述**的時間複雜度,所以引入這4個
概念。2.**複雜度在不同情況下出現量級差別時才需要區別這四種複雜度。大多數情況下,是不需要區別分析它們的。
**在不同情況下複雜度出現量級差別,則用**所有可能情況下執行次數的加權平均值表示。
兩個條件滿足時使用:1)**在絕大多數情況下是低級別複雜度,只有極少數情況是高階別複雜度;2)低級別和高階別
複雜度出現具有時序規律。均攤結果一般都等於低級別複雜度。
資料結構與演算法之美 複雜度分析
因為我們需要乙個不用具體的測試資料來測試,就可以粗略估計演算法的執行效率的方法。演算法的執行效率,粗略地講,就是演算法 執行的時間。舉個例子 int cal int n 首先,所有 的執行時間 t n 與每行 的執行次數成正比。我們依舊假設每個語句的執行時間是 unit time。那這段 的總執行時...
資料結構與演算法之美 02複雜度分析(上)
如何分析 統計演算法的執行效率和資源消耗 複雜度描述的是演算法執行時間 或占用空間 與資料規模的增長關係。為什麼要需要複雜度分析?測試結果非常依賴測試環境,而且受資料規模影響很大,所以需要乙個不用具體資料來測試,可以粗略估計演算法的執行效率的方法 如何在不執行 的情況下,粗略的估算一段 的執行時間 ...
資料結構與演算法之美 2 複雜度分析(上)
相對於複雜度分析,還有乙個對立的分析方法,叫做事後統計法,但它有兩個缺點 測試結果非常依賴測試環境 測試結果受資料規模的影響很大 我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。這就是我們今天要講的時間 空間複雜度分析方法。對於大o複雜度表示法,我們可以把它總結成乙個公...