1. 程式人生 > >極客時間——資料結構與演算法(3)

極客時間——資料結構與演算法(3)

一、什麼是複雜度分析?
1.資料結構和演算法解決是“如何讓計算機更快時間、更省空間的解決問題”。
2.因此需從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。
3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。
4.複雜度描述的是演算法執行時間(或佔用空間)與資料規模的增長關係。
二、為什麼要進行復雜度分析?
1.和效能測試相比,複雜度分析有不依賴執行環境、成本低、效率高、易操作、指導性強的特點。
2.掌握複雜度分析,將能編寫出效能更優的程式碼,有利於降低系統開發和維護成本。
三、如何進行復雜度分析?
1.大O表示法
1)來源
演算法的執行時間與每行程式碼的執行次數成正比,用T(n) = O(f(n))表示,其中T(n)表示演算法執行總時間,f(n)表示每行程式碼執行總次數,而n往往表示資料的規模。
2)特點
以時間複雜度為例,由於時間複雜度描述的是演算法執行時間與資料規模的增長變化趨勢,所以常量階、低階以及係數實際上對這種增長趨勢不產決定性影響,所以在做時間複雜度分析時忽略這些項。
2.複雜度分析法則
1)單段程式碼看高頻:比如迴圈。
2)多段程式碼取最大:比如一段程式碼中有單迴圈和多重迴圈,那麼取多重迴圈的複雜度。
3)巢狀程式碼求乘積:比如遞迴、多重迴圈等
4)多個規模求加法:比如方法有兩個引數控制兩個迴圈的次數,那麼這時就取二者複雜度相加。
四、常見時間複雜度
第一種:多項式時間複雜度(按數量級遞增)
1、O(1) 常量階,程式碼執行時間不隨n增大而增大,見於無迴圈無遞迴程式碼,不論多少行~O(1)是一種表示方式(不論多少行);
2、O(logN)對數階,因為對數可以互相轉換,且常量係數可忽略,所以忽略對數的底;
3、O(n)線性階;
4、O(nlogN)對數線性階;
5、各種次方階。
第二種:非多項式時間複雜度:O(2的n次方) 和 O(n!) 屬於非常低效的演算法
第三種:O(m+n)與O(m*n),程式碼複雜度由兩個資料規模決定,由於無法得知m、n哪個量級更大,故不能直接取其一。
五、如何掌握好複雜度分析方法?
複雜度分析關鍵在於多練,所謂孰能生巧。