演算法的時間複雜度

2021-08-29 18:05:47 字數 2474 閱讀 2412

用o( )來體現演算法時間複雜度的記法,我們稱之為大o表示法。

演算法複雜度可以從最理想情況、平均情況和最壞情況三個角度來評估,由於平均情況大多和最壞情況持平,而且評估最壞情況也可以避免後顧之憂,因此一般情況下,我們設計演算法時都要直接估算最壞情況的複雜度。

大o表示法o(f(n)中的f(n)的值可以為1、n、logn、n²等,因此我們可以將o(1)、o(n)、o(logn)、o(n²)分別可以稱為常數階、線性階、對數階和平方階,那麼如何推導出f(n)的值呢?我們接著來看推導大o階的方法。

推導大o階

推導大o階,我們可以按照如下的規則來進行推導,得到的結果就是大o表示法:

1.用常數1來取代執行時間中所有加法常數。

2.修改後的執行次數函式中,只保留最高端項

3.如果最高端項存在且不是1,則去除與這個項相乘的常數

常見的時間複雜度:

執行次數函式術語描述

12o(1)

常數階2n+3

o(n)

線性階3n2+2n+1

o(n2)

平方階5log2n+20

o(log2n)

對數階2n+3nlog2n+19

o(nlogn)

nlog2n階

6n3+2n2+3n+4

o(n3)

立方階2n

o(2n)

指數階

我們假設計算機執行一行基礎**需要執行一次運算。

int afunc(void)
那麼上面這個方法需要執行 2 次運算

int afunc(int n) 

}

此時時間複雜度為 o(n × 1),即 o(n)。

對於多個迴圈,假設迴圈體的時間複雜度為 o(n),各個迴圈的迴圈次數分別是a, b, c...,則這個迴圈的時間複雜度為 o(n×a×b×c...)。分析的時候應該由里向外分析這些迴圈。

void afunc(int n) 

}}

此時時間複雜度為 o(n × n × 1),即 o(n^2)。

對於順序執行的語句或者演算法,總的時間複雜度等於其中最大的時間複雜度。

void afunc(int n) 

}// 第二部分時間複雜度為 o(n)

for(int j = 0; j < n; j++)

}

此時時間複雜度為 max(o(n^2), o(n)),即 o(n^2)。

對於條件判斷語句,總的時間複雜度等於其中 時間複雜度最大的路徑 的時間複雜度。

void afunc(int n) 

}} else

}}

此時時間複雜度為 max(o(n^2), o(n)),即 o(n^2)。

時間複雜度分析的基本策略是:從內向外分析,從最深層開始分析。如果遇到函式呼叫,要深入函式進行分析。

最後,我們來練習一下

一. 基礎題

求該方法的時間複雜度

void afunc(int n) 

}}

參***:

當 i = 0 時,內迴圈執行 n 次運算,當 i = 1 時,內迴圈執行 n - 1 次運算……當 i = n - 1 時,內迴圈執行 1 次運算。

所以,執行次數 t(n) = n + (n - 1) + (n - 2)……+ 1 = n(n + 1) / 2 = n^2 / 2 + n / 2。

根據上文說的 大o推導法 可以知道,此時時間複雜度為 o(n^2)。

二. 高階題

求該方法的時間複雜度

void afunc(int n) 

}

參***:

假設迴圈次數為 t,則迴圈條件滿足 2^t < n。

可以得出,執行次數t = log(2)(n),即 t(n) = log(2)(n),可見時間複雜度為 o(log(2)(n)),即 o(log n)。

三. 再次高階

求該方法的時間複雜度

long afunc(int n)  else 

}

參***:

顯然執行次數,t(0) = t(1) = 1,同時 t(n) = t(n - 1) + t(n - 2) + 1,這裡的 1 是其中的加法算一次執行。

顯然 t(n) = t(n - 1) + t(n - 2) 是乙個斐波那契數列,通過歸納證明法可以證明,當 n >= 1 時 t(n) < (5/3)^n,同時當 n > 4 時 t(n) >= (3/2)^n。

所以該方法的時間複雜度可以表示為 o((5/3)^n),簡化後為 o(2^n)。

可見這個方法所需的執行時間是以指數的速度增長

演算法時間複雜度空間複雜度

演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...

演算法 時間複雜度 空間複雜度

1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...

演算法的時間複雜度 空間複雜度

時間複雜度和空間複雜度是度量演算法效率的常用指標 事後統計,不常用 事前統計影響因素 演算法策略 問題規模 程式語言 質量 機器執行指令的速度 撇開軟硬體的影響,演算法執行工作量的大小只依賴於問題的規模 通常用整數n表示 乙個演算法是由控制結構 順序,分支,迴圈三種 和原操作 指固有資料型別的操作 ...