本文根據演算法導論第三章總結,但其中加入了我對本章的一些補充,並且配合演算法導論習題進行講解。
相信本文會讓你對漸近記號有更深入地理解。
對於某個比較簡單的演算法,我們有時候確實能夠精確地分析出演算法的複雜度,比如演算法複雜度為5n^2+10n+6,但是事實上並不需要這樣,因為當n足夠大時,可以忽略掉低階項和最高次項的係數,因此就引出了「漸近複雜度」,並且用「漸近記號」來表示「漸近複雜度」。
漸近記號包括:
(1)θ (theta):緊確界。 相當於"="
(2)o
(大歐):上界。 相當於"<="
(3)o (小歐):非緊的上界。 相當於"
(4)ω (大omega):下界。 相當於">="
(5)ω (小omega):非緊的下界。 相當於">"
給出這些記號的定義:
對於定義的注意點:
(1)這些定義的前提是f(n)和g(n)是漸近非負的,漸近非負的意思是「當n趨於無窮大時,f(n)和g(n)都非負」。
(2)對於第4和第5條定義,需要注意是對於任意的c。
用集合論來表示這5個符號的關係:
從上面的圖可以看出:
(1)如果f(n)=θ(g(n)),則f(n)=
o(g(n))且f(n)=
ω(g(n))。
(2)如果f(n)=
o(g(n)),則f(n)=
o(g(n))
。 (3)如果f(n)=
ω(g(n)),則f(n)=
ω(g(n))。
(4)如果
f(n)=
o(g(n)),則要麼是
f(n)=
o(g(n)),要麼是
f(n)=
θ(g(n))。
(5)如果f(n)=
ω(g(n))
,則要麼是
f(n)=
ω(g(n)),要麼是
f(n)=
θ(g(n))。
原因其實很簡單因為:
(1)如果
f(n)=
θ(g(n)),則根據定義一定存在c1,c2,n0,使得對於任意的n>=n0,都有c1g(n)<=f(n)<=c2g(n),因此必定存在
"c=c2,n0,使得對於任意的n>=n0,都有f(n)<=cg(n)"
"c=c1,n0,使得
對於任意的n>=n0,都有
cg(n)
<=
f(n)
" (2)如果
f(n)=
o(g(n)),則根據定義一定對於任意的c,都存在n0,使得任意的n>=n0,都有
f(n)=n0,都有f(n)<=cg(n)」
(3)如果f(n)=
ω (g(n)),則根據定義一定對於任意的c,都存在n0,使得任意的n>=n0,都有
cg(n)
<
f(n),因此必定存在「存在c,n0,使得對於任意的n>=n0,都有
cg(n)
<=
f(n)」
了解了這些定義後,給出乙個概念:這些漸近記號表示的都是集合,比如
o(n^2)表示的是乙個集合,可以是n,1,n^2等,
因此對於這些漸近記號的使用最準確應該是「f(n)∈
o(g(n))
」,但是一般都是寫成「
f(n)=
o(g(n))」。
給出一些例子:
o(n^2)可以是n,2n,1,2n^2等
。 θ(n^2)可以是n^2,3n^2等。
ω (n^2)可以是n^3,n^10等,但不能是n^2。
ω (n^2)可以是n^2,n^3,n^10等。
o(n^2)可以是n,1,3n等,
但不能是n^2。
一般我們對於演算法複雜度的描述都是用
o記號,比如bellmanford的複雜度為
o(ve),表示對於所有的輸入,都滿足
o(ve)。
我們這裡給出了很通用的方法,叫做「極限法」。
看到上面的方法,很多人會問「怎麼沒有o和
ω?」,原因很簡單,因為如果
f(n)=
o(g(n)),
則要麼是
f(n)=
o(g(n)),要麼是
f(n)=
θ(g(n))。
stirling公式:
還要注意一點:我們在證明時,一般不需要具體指出n0的值,只需要證明一定存在n0即可。(像在演算法導論p27頁的最後幾行中,他給出了很複雜的n0,這不必深究。)
現在開始舉例子。
第乙個問題**於演算法導論思考題3-1。
第二個問題**於演算法導論3.2-3。
第三個問題**於演算法導論3.2-5。
第四個問題是設計函式以滿足一定的條件。
第五個問題也是關於設計乙個函式,他是演算法導論思考題3-3(b)。
最後還要再舉乙個演算法導論思考題3-4,因為這道題能夠更清晰地理清概念。
資料結構與演算法(二) 漸近符號
當我們從時間和空間方面分析任何演算法的複雜性時,我們永遠不能以確切的數字去定義執行演算法所需的時間和空間,因此我們需要用一些標準符號來表達,也被稱為漸近符號。當我們在分析任何乙個演算法時,我們通常會用乙個公式來表示執行該演算法所需的時間或者計算機編譯執行所需的時間,記憶體訪問次數,比較次數,占用記憶...
第二節 漸近符號 遞迴及解法
一 漸進符號 1 of n o g n 表示存在適當的常數c和n0使得f n 小於或等於c g n 對於充分大的n成立 0 f n c g n c 0,n0 0,n n0 例 2n 2 o n 3 粗略的說就是去掉首項係數和低階項,剩下的小於或等於n 3 o粗略的說就是小於或等於,這裡的等號不對稱 ...
android shape漸近線效果
android畫圖 shape的使用 在gradientdrawable1試圖中終於把shape學會了,以前總是似懂非懂,現在終於把裡面的東西搞清楚了,同時也挺佩服谷歌的用心,故意設 置一些陷阱吧,不認真對待還真以為沒有啥效果呢。setcontentview r.layout.shape drawa...