算法複雜度漸近符號總結

本文根據算法導論第三章總結,但其中加入了我對本章的一些補充,並且配合算法導論習題進行講解。

相信本文會讓你對漸近記號有更深入地理解。

一、定義介紹


對於某個比較簡單的算法,我們有時候確實能夠精確地分析出算法的複雜度,比如算法複雜度爲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)<cg(n),因此必定存在“存在c,n0,使得對於任意的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,因爲這道題能夠更清晰地理清概念。



---------------------------------------------------------------------------------------------------------------------------

本文轉載自xiazdong:點擊查看原文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章