問題
資料結構課堂上丟擲乙個問題,下面一段演算法,複雜度是_______?
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繪製的圖形應用 場景就複雜度進行評價並 同類應用的繪製效率。在有程式原始碼的條件下,從靜態統計和動態執行兩方面進行分析。如下圖 靜態統計關注的是程式 主要統計 中呼叫圖形繪製命令的種類和次數,從類別和數量上了解程式的大致規模。另一方面,在圖形流水線中,基本圖元在光柵化...