1. 程式人生 > >演算法概念:大O表示法/小o表示法/Ω/Θ

演算法概念:大O表示法/小o表示法/Ω/Θ

對於任何數學函式,這三個記號可以用來度量其“漸近表現”,即當趨於無窮大時的階的情況,這是演算法分析中非常重要的概念。大家可以把它們分別想象成≤、≥和,分別估計了函式的漸近上界、漸近下界和準確界。誠然,漸近關係和確切大小關係是有區別的,但當問題規模很大時,忽略這種區別能大大降低演算法分析的難度。

下面我們就來具體定義這三種記號的表示。

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

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

2)如果

正無窮,則稱f (n)在數量級上嚴格大於g(n),記為f (n)=( ( 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))。(大O表示法)

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發現的)。該法則聲稱,

兩個函式的比率極限等於兩個函式的導數的比率極限,這裡當然假定兩個函式的導數比率的極限存在,即有:


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

,符合第1個定義,因此這兩個素性測試演算法的效率差異是數量級的差異。

在演算法分析中,最常選取的g(n)有如下一些,見表2-1。

 


一個值得提醒的問題是,根據定義,對於任意一個g (n)函式來說,可能存在很多個函式f (n),使得f (n)=O(g(n)),即O(g(n))表示的實際上是一個函式的集合,這裡的等於也不是普通意義上的等於,而是說明f (n)是函式集合o(g(n))裡的一員,即f (n)=O(g(n))並不意味著f (n)等於O(g(n))。等於號的這種使用令那些嚴謹的科學家非常不快甚至憤怒,但計算機界人士很喜歡這種馬虎的表示。不過,我們在心裡應該知道,

f (n)=O(g(n))並不意味著f (n)≠O(g(n))。不然,我們就被自己騙了!

等號在其他漸近表示中的使用也可以同樣解釋。