算法分析:大O符號/大Ω符號/大Θ符號/小o符號/小w符號

感謝作者分享,原文鏈接:http://blog.csdn.net/u012816041/article/details/49888631

大O,漸進表示法,接下來我嘗試用最簡單的方式進行說明。

學習算法我經常聽到這個詞彙,我一開始很難理解,什麼鬼?其實簡單的說,就是描述一個算法的好壞詞。

大O,可以認爲它的含義是“order of”(大約是)。

簡單列舉幾個,當人們形容:

某個算法的時間複雜度是O(1),就說明這是一個優秀的算法。

某個算法的時間複雜度是O(logn),就說明這是一個良好的算法。

某個算法的時間複雜度是O(n),就說明這個算法還不錯。

某個算法的時間複雜度是O(n2),就說明這個算法差一些了。

上面那些記住後,至少讓你,聽到這個詞後不會呆。。額。。


其實知其然不知其所以然是很可怕的,不過上面內容,起碼保證了過一段時間不會一無所知。接下來是具體的數學分析和其他的一些表示法,直接上維基百科了。


大O符號

注:“order”在全文中被譯爲“”,也可以另譯爲“數量級”。

大O符號英語Big O notation)是用於描述函數漸近行爲數學符號。更確切地說,它是用另一個(通常更簡單的)函數來描述一個函數數量級漸近上界。在數學中,它一般用來刻畫被截斷的無窮級數尤其是漸近級數的剩餘項;在計算機科學中,它在分析算法複雜性的方面非常有用。

大O符號是由德國數論學家保羅·巴赫曼(Paul Bachmann)在其1892年的著作《解析數論》(Analytische Zahlentheorie)首先引入的。而這個記號則是在另一位德國數論學家艾德蒙·朗道(Edmund Landau)的著作中才推廣的,因此它有時又稱爲朗道符號(Landau symbols)。代表“order of ...”(……階)的大O,最初是一個大寫的希臘字母'Ο'(omicron),現今用的是大寫拉丁字母O’,但從來不是阿拉伯數字‘0’

使用

這個符號有兩種形式上很接近但迥然不同的使用方法:無窮大漸近與無窮小漸近。然而這個區別只是在運用中的而不是原則上的——除了對函數自變量的一些不同的限定, “大O”的形式定義在兩種情況下都是相同的。[來源請求]

無窮大漸近

大O符號在分析算法效率的時候非常有用。舉個例子,解決一個規模爲n的問題所花費的時間(或者所需步驟的數目)可以表示爲:T(n)=4n^2-2n+2。當n增大時,n^2項將開始占主導地位,而其他各項可以被忽略。 舉例說明:當n=5004n^2項是 2n項的1000倍大,因此在大多數場合下,省略後者對錶達式的值的影響將是可以忽略不計的。

進一步看,如果我們與任一其他級的表達式比較,n^2項的係數也是無關緊要的。例如:一個包含n^3n^2項的表達式,即使 T(n)=1,000,000\cdot n^2,假定 U(n)=n^3,一旦n增長到大於1,000,000,後者就會一直超越前者(T(1,000,000)=1,000,000^3=U(1,000,000))。

這樣,大O符號就記下剩餘的部分,寫作:

T(n)\in\Omicron(n^2)

T(n)=\Omicron(n^2)

並且我們就說該算法具有n^2階(平方階)的時間複雜度。

無窮小漸近

大O也可以用來描述數學函數估計中的誤差項。例如e^x泰勒展開

e^x=1+x+\frac{x^2}{2}+\hbox{O}(x^3)\qquadx \to 0

這表示,如果x足夠接近於0,那麼誤差e^x - \left(1 + x + \frac{x^2}{2}\right)絕對值小於x^3的某一常數倍。

形式化定義

給定兩正值函數fg,定義:

f(n)=\Omicron(g(n)),條件爲:存在正實數cN,使得對於所有的n \geq N,有|f(n)| \leq |cg(n)|

上述的定義表明,當n足夠大,大過一個特定的N時,且存在一個正數c,使得|f|不大於|cg|,則fg\Omicron表示。fg的關係可以理解爲g(n)f(n)的一個上界,也可以理解爲f最終至多增漲的速度與g一樣快,但不會超過g的增漲速度。

常用的函數階

下面是在分析算法的時候常見的函數分類列表。所有這些函數都處於n趨近於無窮大的情況下,增長得慢的函數列在上面。c是一個任意常數。

符號 名稱
\Omicron(1)\! 常數(階,下同)
\Omicron(\log n)\! 對數
\Omicron[(\log n)^c]\! 多對數
\Omicron(n)\! 線性,次線性
\Omicron(n\log^*n)\! \log^*n迭代對數
\Omicron(n \log n)\! 線性對數,或對數線性、擬線性、超線性
\Omicron( n^2)\! 平方
\Omicron(n^c), \operatorname{Integer}(c>1) 多項式,有時叫作“代數”(階)
\Omicron(c^n)\! 指數,有時叫作“幾何”(階)
\Omicron(n!)\! 階乘,有時叫做“組合”(階)

一些相關的漸近符號

大O是最經常使用的比較函數的漸近符號。

符號 定義
f(n)=\Omicron (g(n)) 漸近上限
f(n)=o(g(n)) asymptotically negligible(\lim{} \frac{f(n)}{g(n)} = 0
f(n)=\Omega(g(n)) 漸近下限 (當且僅當g(n) = \Omicron(f(n))
f(n) = \omega (g(n)) asymptotically dominant(當且僅當g(n)=o(f(n))
f(n) = \Theta(g(n)) asymptotically tight bound(當且僅當f(n) = \Omicron(g(n))f(n)=\Omega(g(n))

注意

大O符號經常被誤用:有的作者可能會使用大O符號表達大Θ符號的含義。因此在看到大O符號時應首先確定其是否爲誤用。

大Ω符號

大Ω符號的定義與大O符號的定義類似,但主要區別是,大O符號表示函數在增長到一定程度時總小於一個特定函數的常數倍,大Ω符號則表示總大於。

用數學語言描述即是,f(\nu)=\Omega[g(\nu)]若存在x_1, \kappa使得:

對於所有\forall x>x_1, f(x)>\kappa g(x).

特性

大Ω符號與大O符號正好相反,即:\begin{cases}f(\nu)=\Omicron[g(\nu)]\\g(\nu)=\Omega[f(\nu)]\end{cases}

大Θ符號

Θ符號大O符號大Ω符號的結合。即:f(\nu)=\Theta[g(\nu)]\!\begin{cases}f(\nu)=\Omicron[g(\nu)]\\f(\nu)=\Omega[g(\nu)]\end{cases}

這一符號首先由高德納於1970年提出[1]

注意

大Θ符號經常被誤用;有的作者可能會使用大O符號表達大Θ符號的含義。因此在看到大O符號時應首先確定其是否爲誤用。


我發現讀完維基百科還是有一些不清晰的地方,或者不好理解的地方,再加上這些。

設函數f ( n )代表某一算法在輸入大小爲n的情況下的工作量(效率),則在n趨向很大的時候,我們將f (n)與另一行爲已知的函數g(n)進行比較:

1)如果0,則稱f (n)在數量級上嚴格小於g(n),記爲f (n)=o( g(n))。

2)如果,則稱f (n)在數量級上嚴格大於g(n),記爲f (n)=w( g(n))。

3)如果c,這裏c爲非0常數,則稱f (n)在數量級上等於g(n),即f (n)和g(n)是同一個數量級的函數,記爲:f (n)=Θ( g(n))。

4)如果f (n)在數量級上小於或等於g(n),則記爲f (n)=O( g(n))。

5)如果f(n)在數量級上大於或等於g(n),則記爲f (n)=Ω( g(n))。

這裏我們假定f (n),g (n)是非負單調的,且極限存在。如果這個極限不存在,則無法對f (n)和g (n)進行比較。在進行此種計算時,一個經常用到的技術是洛必達(L'Hopital)法則。該法則由17世紀法國數學家Guillaume de L'Hopital發現(也有人認爲是瑞士數學家Johann Bernoulli發現的)。該法則聲稱,兩個函數的比率極限等於兩個函數的導數的比率極限,這裏當然假定兩個函數的導數比率的極限存在,即有:


 

有了這個定義,就可以對素性測試的兩個算法進行比較了。

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