1. 程式人生 > >複雜度分析(上):如何分析、統計演算法的執行效率和資源消耗

複雜度分析(上):如何分析、統計演算法的執行效率和資源消耗

一、什麼是複雜度分析?

1.資料結構和演算法本身解決的是“快”和“省”的問題,即如何讓程式碼執行得更快,如何讓程式碼更省儲存空間。

2.因此從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能

3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度

二.為什麼進行復雜度分析

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

三.如何進行復雜度分析

1.大O方法

1)來源

演算法的執行時間與每行程式碼的執行次數成正比,用T(n)=O(f(n))表示,其中T(n)表示演算法執行總時間,f(n)表示每行程式碼執行總次數,而n往往表示資料的規模

2)特點

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

2.複雜度分析法:

1)單個迴圈看高頻,比如迴圈

2)多段程式碼看最大,加分法則,總複雜度等於量級最大的那段程式碼的複雜度

3)乘法法則,巢狀程式碼的複雜度等於巢狀內外程式碼複雜度的乘積:比如遞迴

4)多個規模求加法:比如方法有兩個引數控制兩個迴圈的次數,那麼取二者複雜度相加

四、常見的複雜度級別

多項式階:隨著資料規模的增長,演算法的執行時間和空間佔用,按照多項式的比例增長。包括:

O(1)(常數階)、O(logn)(對數階  單層迴圈有乘法)、O(n)(線性階,一個迴圈)、O(nlogn)(線性對數階,兩層迴圈,有乘法)、O(n*n)(平分階)

非多項式:隨著資料規模的增長,演算法的執行時間和空間佔用暴增,這類演算法效能極差,NP問題。包括O(2 n)(指數階)、O(n!)(階乘階)

五.空間複雜度

空間複雜度比較簡單

分析:和申請的陣列大小有關係,常見的是O(1)、O(n)、O(n*n)