演算法複雜度評價一例

2021-09-23 17:39:33 字數 2673 閱讀 8135

問題

資料結構課堂上丟擲乙個問題,下面一段演算法,複雜度是_______?

i=1;

while(i

<=n)

i=i*3;

a. o(

3n)b. o(

n)c. o(n

3)d. o(l

og3n

) 意外

連叫三位同學回答,列一例外選b,讓我有些吃驚。看來這是老師的問題,大家的思維沒有到位。

分析及解答

所謂複雜度,是要對關鍵運算的次數進行計數。關鍵運算的次數,與問題規模有關。在這裡,就是要考察迴圈了。關鍵運算是乘法,我們看執行演算法中,需要多少次乘法。而問題規模呢?顯然,執行多少次迴圈,與n的初值有關。這裡設迴圈執行的次數為t(

n)。 這裡迴圈次數首先可以確定不是b所指定的線性關係。為直觀起見,我們設

n足夠大,用於控制迴圈的變數 i 的變化過程是:

1(初值,由i=1

3(第1次迴圈:i=i*3

9(第2次迴圈:i=i*3

27(第3次迴圈:i=i*3

81(第4次迴圈:i=i*3

273(第5次迴圈:i=i*3

819(第6次迴圈:i=i*3

2457(第7次迴圈:i=i*3

…… 可以看到 i 的值就這樣,按著指數級的速度,向著(i<=n)這個使迴圈結束的條件奔去。

我們已經設迴圈執行的次數為t(

n)。可以發現,當3t

(n)≤

n時,迴圈繼續,迴圈結束時,恰 3t

(n)>

n,容易得到 t(

n)≈l

og3(

n),論及複雜度,我們常只考察量級,故有t(

n)=o

(log

3n)。

後續的疑問

課堂中我講了這個結論得出的過程,大多數同學接受了。個別同學還在繼續思考(好習慣,就著熱乎勁,有質疑,有思考,學習的優良品質!)。問得最多的問題是:當n=3(或某乙個具體的數)時,迴圈的次數不等於lo

g3n!

對此,暴露出同學們對複雜度的理解中,還有兩點不到位:

1. 複雜度只作粗略的,在定性(量級)上的考察,而不是定量(精確的計數算式)的計算,多幾次少幾次,不要細究了。注意說複雜度是o(

log3

n),而不是lo

g3n。要深刻理解這兒運用的「大o」的目的。

2. 複雜度只在意定性,而不在定量,為此,在衡定量級時,只保留高階部分,低階部分統計統不管,高階式子的係數統統去掉。例如,關鍵運算的執行頻度計數為

10000n3

+200n2

+1000

,在「取量級」的大方針下,也是o(

n3)。因為在

n 值取很大的這個前提下,

200n2+

1000

再大,在n3

面前也別抬頭;n3

前的係數再大,也不是主要因素。這是複雜度分析中,我們在抓主要矛盾。

3. 學計算機,計數是個很重要很重要的問題,計數的理論,也是深不可測。精確的計數,感興趣的同學可以關注,但在演算法的複雜度分析上,適應「就到量級」的處理,這裡也有大學問,這也是實用的處理。

拓展

(1)下面一段演算法,複雜度是_______?

i=n;

while(i>1)

i=i/3;

a. o(

3n)b. o(

n)c. o(n

3)d. o(l

og3n

)e. o(

1)(2)下面一段演算法,複雜度是_______?

i=1;

while(i

<=n)

i=i+3;

a. o(

n/3)

b. o(n

)c. o(

3n)d. o(

log3

n)(3)下面一段演算法,複雜度是_______?

i=1;

while(i

<=n)

n=i*3;

a. o(

∝)b. o(n

)c. o(

3n)d. o(

log3

n)解析

(1)d。和原問題其實一樣,照文章中的思路做一遍即可得到答案。若關鍵運算執行次數與問題規模

n無關時,複雜度為e. o(

1),顯然,這裡 i 的初值是 n ,並非無關。

(2)b。最迷惑人的,是a。迴圈的次數,迴圈次數約是 n3

,但是,係數13

是要去掉的,選b。

(3)錯題!這段**若執行,是個死迴圈,終止於記憶體溢位,或者有些對溢位不處理的語言,就真的一直會不停地執行下去。從演算法角度,由於違反了「有窮性」,這也根本稱不上是「演算法」了。

軟體複雜度評價

在應用軟體和嵌入式產品 包括硬體 嵌入式軟體 的可靠性設計中,有一條基本原則就是 簡單可靠 分析軟體複雜度,可以支援對軟體的質量檢查 應用分析 以及評估後續維護成本,方便查明那些可能導致錯誤的 比如開展圈複雜度分析技術,對軟體進行結構測試。以軟體複雜度測量的數目為基礎,幫助工程師識別難於測試和維護的...

時間複雜度 演算法評價的標準

前言 演算法,一直是每個程式設計師的心病,確是程式的核心,很多人覺得演算法很難,沒錯,但是世界上真的有很難的事情嗎?如果不去嘗試,只去抱怨,不去嘗試,我覺得可能一輩子也就只能當一名普通的程式設計師了。有一句老話說的挺好,成功的人遇到乙個難題,第一反應是想著怎麼解決它,而不是先擔心不會做,做不懂,如果...

openGL應用複雜度評價

在專案中,需要對使用opengl繪製的圖形應用 場景就複雜度進行評價並 同類應用的繪製效率。在有程式原始碼的條件下,從靜態統計和動態執行兩方面進行分析。如下圖 靜態統計關注的是程式 主要統計 中呼叫圖形繪製命令的種類和次數,從類別和數量上了解程式的大致規模。另一方面,在圖形流水線中,基本圖元在光柵化...