資料結構與演算法之美 2 複雜度分析(上)

2021-10-21 18:03:33 字數 2546 閱讀 7515

相對於複雜度分析,還有乙個對立的分析方法,叫做事後統計法,但它有兩個缺點:

測試結果非常依賴測試環境

測試結果受資料規模的影響很大

我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。這就是我們今天要講的時間、空間複雜度分析方法。

對於大o複雜度表示法,我們可以把它總結成乙個公式:

其中,t(n) 表示**執行的時間,即我們平時所說的時間複雜度;n 表示資料規模的大小;f(n) 表示每行**執行的次數總和。公式中的 o,表示**的執行時間 t(n) 與 f(n) 表示式成正比。

時間複雜度的概念很好理解,就是演算法的執行效率,粗略地講,就是演算法**執行的時間。下面我們直接來分析一段**的時間複雜度了,示例**如下,請計算函式f()的時間複雜度:

void f(int n) }}

結果已經在**注釋裡寫著了,所以t(n) = 1 + 1 +1 + n + n²;當 n 很大時,公式中的低階、常量、係數三部分並不左右增長趨勢,所以都可以忽略。我們只需要記錄乙個最大量級就可以了,就可以記為:t(n) = o(n2)。

關於時間複雜度的計算,請記住以下幾個規則:

幾種常見時間複雜度包括以下幾種,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個:o(2n) 和 o(n!)。

下面我們重點分析其中的幾個時間複雜度分析過程。

首先你必須明確乙個概念,o(1) 只是常量級時間複雜度的一種表示方法,並不是指只執行了一行**。比如這段**,即便有 3 行,它的時間複雜度也是 o(1),而不是 o(3)。

//執行次數與n無關

void f(n)

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

對數階時間複雜度非常常見,同時也是最難分析的一種時間複雜度。我通過乙個例子來說明一下。

//執行次數與n無關

void f(n)

}

上面**的計算過程也很簡單,假設執行次數為x,則執行的次數為3^x = n,所以x=log3(n),所以,這段**的時間複雜度就是 o(log3(n))。又因為log3n 就等於 log3(2) * log2(n),其中 log3(2) 是乙個常量。基於我們前面的乙個理論:在採用大 o 標記複雜度的時候,可以忽略係數,所以,o(log2n) 就等於 o(log3n)。因此,在對數階時間複雜度的表示方法裡,我們忽略對數的「底」,統一表示為 o(logn)。

我們再來講一種跟前面都不一樣的時間複雜度,**的複雜度由兩個資料的規模來決定。老規矩,先看**!

int cal(int m, int n) 

int sum_2 = 0;

int j = 1;

for (; j < n; ++j)

return sum_1 + sum_2;

}

從**中可以看出,m 和 n 是表示兩個資料規模。我們無法事先評估 m 和 n 誰的量級大,所以我們在表示複雜度的時候,就不能簡單地省略掉其中乙個。所以,上面**的時間複雜度就是 o(m+n)。

空間複雜度表示的是演算法的儲存空間與資料規模之間的增長關係。相對於時間複雜度,空間複雜度非常簡單,下面通過乙個**來解釋:

void print(int n) 

}

跟時間複雜度分析一樣,我們可以看到,第 2 行**中,我們申請了乙個空間儲存變數 i,但是它是常量階的,跟資料規模 n 沒有關係,所以我們可以忽略。第 3 行申請了乙個大小為 n 的 int 型別陣列,除此之外,剩下的**都沒有占用更多的空間,所以整段**的空間複雜度就是 o(n)。

我們常見的空間複雜度就是 o(1)、o(n)、o(n2 ),像 o(logn)、o(nlogn) 這樣的對數階複雜度平時都用不到。而且,空間複雜度分析比時間複雜度分析要簡單很多。所以,對於空間複雜度,掌握剛我說的這些內容已經足夠了

複雜度也叫漸進複雜度,包括時間複雜度和空間複雜度,用來分析演算法執行效率與資料規模之間的增長關係,可以粗略地表示,越高階複雜度的演算法,執行效率越低。常見的複雜度並不多,從低階到高階有:o(1)、o(logn)、o(n)、o(nlogn)、o(n2 )。

資料結構與演算法之美 複雜度分析

因為我們需要乙個不用具體的測試資料來測試,就可以粗略估計演算法的執行效率的方法。演算法的執行效率,粗略地講,就是演算法 執行的時間。舉個例子 int cal int n 首先,所有 的執行時間 t n 與每行 的執行次數成正比。我們依舊假設每個語句的執行時間是 unit time。那這段 的總執行時...

資料結構與演算法之美(二) 複雜度分析

資料結構和演算法解決的問題是 如何讓計算機更快時間 更省空間地工作 更快 更省的效能需要有東西來衡量,複雜度分析就是分別從執行時間和占用空間兩個維度來評估資料結構和演算法的效能 分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。複雜度描述的是演算法執行時間 或占用空間 與資料規模...

資料結構與演算法之美 02複雜度分析(上)

如何分析 統計演算法的執行效率和資源消耗 複雜度描述的是演算法執行時間 或占用空間 與資料規模的增長關係。為什麼要需要複雜度分析?測試結果非常依賴測試環境,而且受資料規模影響很大,所以需要乙個不用具體資料來測試,可以粗略估計演算法的執行效率的方法 如何在不執行 的情況下,粗略的估算一段 的執行時間 ...