《大話資料結構》筆記 第二章 演算法(下)

2021-08-19 20:31:52 字數 2706 閱讀 4252

給定兩個函式 f(n) 和 g(n),如果存在乙個整數 n,使得對於所有的 n > n,f(n) 總大於 g(n),那麼我們說 f(n) 的增長漸近快於 g(n)。

例如,演算法 a 要 2n+3 次操作,而演算法 b 要 3n+1 次。隨著 n 的增大,比較執行次數時,我們可以忽略加法常數。

再例如,演算法 c 是 4n+8,而演算法 d 要 2n2

n

2+1。隨 n 的增大,我們可以發現執行次數與最高項相乘的常數並不重要。

然後,例如,演算法 e 是 2n2

n

2+3n+1 演算法 f 是 2n3

n

3+3n+1。隨 n 的增大,最高次項的指數大的,結果增長特別快。

最後乙個例子,演算法 g 是 2n2

n

2, 演算法 h 是 3n+1,演算法 i 是 2n2

n

2+3n+1。隨著 n 的增大,h 演算法會越來越少於 g 和 i 的次數,g 也會越來越趨近於 i 。於是得出結論判斷乙個演算法的效率時,函式中的常數和其他次要項常常可以忽略,而更應該關注主項(最高端項)的階數。

定義:

在進行演算法分析時,語句總的執行次數 t(n) 是關於問題規模 n 的函式,進而分析 t(n) 隨 n 的變化情況並確定 t(n) 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作:t(n)=o(f(n))。它表示隨問題規模 n 的增大,演算法執行時間的增長率和 f(n) 的增長率相同,稱作演算法的漸近時間複雜度,簡稱為時間複雜度。其中 f(n) 是問題規模 n 的某個函式。

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

一般情況下,隨著 n 的增大,t(n) 增長最慢的演算法為最優演算法。

推導大 o 階:

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

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

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

得到的結果就是大 o 階。

常數階:迴圈的時間複雜度為o(1)。

注意:不管這個時間複雜度為多少,只要是常數,我們都記作 o(1),而不能是 o(3)、o(12) 等其他任意數字。

線性階:迴圈的時間複雜度為 o(n)。

對數階:迴圈的時間複雜度為 o(lo

g2n log

2n

)。 平方階:迴圈的時間複雜度為 o(n2

n 2)。

int i,j;

for (i = 0; i

< n ; i++)

void function

(int count)

}

這個例子最終的時間複雜度為 o(n2

n

2)。

再看下面這段相對複雜的語句:

n++;                       /* 執行次數為 1 */

function

(n);

/* 執行次數為 n */

int i,j;

for(i = 0; i < n; i++) /* 執行次數為 n^2 */

for(i = 0; i < n; i++) /* 執行次數為 n(n+1)/2 */

}

它的執行次數為f(

n)=1

+n+n

2+n(

n+1)

2=32

n2+3

2n+1

f (n

)=1+

n+n2

+n(n

+1)2

=32n

2+32

n+

1,根據推導大 o 階的方法,最終這段**的時間複雜度也是 o(n2

n 2)。

常見的時間複雜度

按消耗的時間從小到大依次為:

o(1) < o(log

n n

) < o(

n'>n

n) < o(

n n

logn

'>n

n) < o(n2n2

) < o(n3n3

) < o(2n2n

) < o(n!n!

) < o(nnnn

)

最壞情況執行時間是一種保證,那就是執行時間將不會再壞了。在應用中,這是一種最重要的需求,通常,除非特別指定,我們提到的執行時間都是最壞情況的執行時間。

平均執行時間是所有情況中最有意義的,因為他是期望的執行時間。

一般在沒有特殊說明的情況下,都是指最壞時間複雜度。

演算法的空間複雜度通過計算演算法所需的儲存空間實現,演算法空間複雜度的計算公式為:s(n) = o(f(n)),其中,n 為問題規模,f(n) 為語句關於 n 所佔儲存空間的函式。

老楊《大話資料結構》第二章 演算法

演算法是解決特定問題求解步驟的描述,計算機中表現為指令的有限序列,每條指令表示乙個或者多個操作。輸入輸出 有窮性確定性 可行性正確性 可讀性健壯性 時間效率高和儲存量低 事後統計方法 事前分析估計方法 通過書中所給1 2 99 100的例子,可以明顯對比出幾種不同演算法具有不同的空間和時間開銷。某個...

大話資料結構第二章學習筆記

演算法 資料結構與演算法的關係 演算法是什麼?指令的有限序列,每條指令表示乙個或多個操作。演算法能輸入輸出,能自動結束不會無限迴圈,而且每乙個步驟在可接受的時間內完成。好的演算法什麼正確可讀健壯都不算什麼,最重要的是時間效率高和儲存量低。怎麼衡量演算法的效率啊?事前分析估算的方法 時間取決於演算法採...

讀書筆記 《大話資料結構》第二章演算法

2.3兩種演算法的比較 include if 0 需要執行 100次 int main std cout sum return 0 endif if 1 int main endif 顯然 第二個演算法更優秀 演算法 解決特定問題求解的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個...