1. 程式人生 > >極客講堂之資料結構與演算法之美(一):複雜度分析(上)

極客講堂之資料結構與演算法之美(一):複雜度分析(上)

(本文根據極客講堂——資料結構與演算法之美專欄的問答區整理修改而成,如有侵權還希望聯絡我鴨~)

一、什麼是複雜度分析?

1.資料結構和演算法解決是“如何讓計算機更快時間、更省空間的解決問題”。 2.因此需從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。 4.複雜度描述的是演算法執行時間(或佔用空間)與資料規模的增長關係。

二、為什麼要進行復雜度分析?

1.和效能測試相比,複雜度分析有不依賴執行環境、成本低、效率高、易操作、指導性強的特點。 2.效能測試結果受資料規模影響很大,比如對於小規模的資料排序,插入排序可能會比快速排序要快。 3.掌握複雜度分析,將能編寫出效能更優的程式碼,有利於降低系統開發和維護成本。

三、如何進行復雜度分析?

1.大O表示法

1)來源 所有程式碼的執行時間T(n)與每行程式碼的執行次數n成正比,用T(n) = O(f(n))表示,其中T(n)表示程式碼執行總時間,f(n)表示每行程式碼執行的次數總和,n表示資料的規模大小,O表示程式碼的執行時間與每行程式碼執行的次數總和成反比。 2)特點 以時間複雜度為例,由於時間複雜度描述的是演算法執行時間與資料規模的增長變化趨勢,所以常量階、低階以及係數實際上對這種增長趨勢不產生決定性影響,所以在做時間複雜度分析時忽略這些項。

2.複雜度分析法則

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)巢狀程式碼求乘積:乘法法則。比如遞迴,也可以把乘法法則看成巢狀迴圈。如果T1(n)=O(f(n)),T2(n)=O(g(n)),則T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n))。 4)多個規模求加法:比如方法有兩個引數控制兩個迴圈的次數,那麼這時就取二者複雜度相加。加法法則改變:T1(m)+T2(n)=O(f(m)+g(n))。乘法法則仍然有效:T1(m)*T2(n)=O(f(m)*g(n))。

四、常用的複雜度級別?

多項式量級:隨著資料規模的增長,演算法的執行時間和空間佔用,按照多項式的比例增長。包括: O(1)(常數階)(一般情況下,只要演算法中不存在迴圈語句、遞迴語句,即使有成千上萬行程式碼,其時間複雜度也是O(1))、O(logn)(對數階)、O(n)(線性階)、O(nlogn)(線性對數階)、O(n^2)(平方階)、O(n^3)(立方階) 非多項式量級:是NP(Non-Deterministic Polynomial,非確定多項式)問題。隨著資料規模的增長,演算法的執行時間和空間佔用暴增,這類演算法效能極差。包括: O(2^n)(指數階)、O(n!)(階乘階)

五、如何掌握好複雜度分析方法?

要勤學多練,多加思考鴨~