感謝作者分享,原文鏈接: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符號在分析算法效率的時候非常有用。舉個例子,解決一個規模爲的問題所花費的時間(或者所需步驟的數目)可以表示爲:。當增大時,項將開始占主導地位,而其他各項可以被忽略。 舉例說明:當,項是 項的1000倍大,因此在大多數場合下,省略後者對錶達式的值的影響將是可以忽略不計的。
進一步看,如果我們與任一其他級的表達式比較,項的係數也是無關緊要的。例如:一個包含或項的表達式,即使 ,假定 ,一旦增長到大於1,000,000,後者就會一直超越前者()。
這樣,大O符號就記下剩餘的部分,寫作:
或
並且我們就說該算法具有階(平方階)的時間複雜度。
無窮小漸近
大O也可以用來描述數學函數估計中的誤差項。例如的泰勒展開:
- 當時
這表示,如果足夠接近於0,那麼誤差的絕對值小於的某一常數倍。
形式化定義
給定兩正值函數和,定義:
- ,條件爲:存在正實數和,使得對於所有的,有
上述的定義表明,當足夠大,大過一個特定的時,且存在一個正數,使得不大於,則是的表示。和的關係可以理解爲是的一個上界,也可以理解爲最終至多增漲的速度與一樣快,但不會超過的增漲速度。
常用的函數階
下面是在分析算法的時候常見的函數分類列表。所有這些函數都處於趨近於無窮大的情況下,增長得慢的函數列在上面。是一個任意常數。
符號 | 名稱 |
---|---|
常數(階,下同) | |
對數 | |
多對數 | |
線性,次線性 | |
爲迭代對數 | |
線性對數,或對數線性、擬線性、超線性 | |
平方 | |
多項式,有時叫作“代數”(階) | |
指數,有時叫作“幾何”(階) | |
階乘,有時叫做“組合”(階) |
一些相關的漸近符號
大O是最經常使用的比較函數的漸近符號。
符號 | 定義 |
---|---|
漸近上限 | |
asymptotically negligible() | |
漸近下限 (當且僅當) | |
asymptotically dominant(當且僅當) | |
asymptotically tight bound(當且僅當且) |
注意
大O符號經常被誤用:有的作者可能會使用大O符號表達大Θ符號的含義。因此在看到大O符號時應首先確定其是否爲誤用。
大Ω符號
大Θ符號
注意
大Θ符號經常被誤用;有的作者可能會使用大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發現的)。該法則聲稱,兩個函數的比率極限等於兩個函數的導數的比率極限,這裏當然假定兩個函數的導數比率的極限存在,即有:
有了這個定義,就可以對素性測試的兩個算法進行比較了。