標籤:

演算法導論第二課——漸進分析

本文給出幾種標準方法來簡化演算法的漸進分析,首先定義幾類漸進符號,其中演算法導論第一課中的 Theta notation。


O notation表示漸進上界

O 表示函數具有漸進上界,對於給定的函數 g(n) ,用 O(g(n)) 來表示以下函數的集合:

O(g(n))=left{ f(n): exists c>0,n_{o}>0,s.t. forall ngeq n_{0},0leq f(n) leq cg(n) 
ight}

例如 2n^{2}=O(n^3) ,這裡的 = 並不是傳統的等於的意思,而是 2n^2 in O(n^3) 的意思,即 exists c>0,n_{o}>0,s.t. forall ngeq n_{0},0leq 2n^2 leq cn^3

當我們說運行時間為 O(n^3) 時,指存在一個屬於  O(n^3) 的函數 f(n) 使得對 n 的任意值,不管選擇什麼規模為n的輸入,其運行時間的上界都是  f(n) ,也就是說最壞情況運行時間為 O(n^3) .


Theta notation 表示漸進緊確界

對於一個給定的函數 g(n) ,用 Theta(g(n)) 來表示以下函數的集合:

O(g(n))=left{ f(n): exists c_{1}>0,c_{2}>0,n_{o}>0,s.t. forall ngeq n_{0},0leq c_{1}g(n)leq f(n) leq c_{2}g(n) 
ight}

若存在正常量 c_{1},c_{2} 使得對於足夠大的 n ,函數 f(n) 能夠夾入 c_{1}g(n)c_{2}g(n) 之間,則 f(n) 屬於集合 Theta(g(n)) ,即 f(n) in Theta(g(n)) ,我們用 f(n) = Theta(g(n)) 來表示同樣的概念。

在演算法導論第一課中我們介紹了 Theta 符號的非形式化的概念,相當於扔掉低階項並忽略最高階項前的係數,我們來使用形式化定義來證明 frac{1}{2}n^2-3n=Theta(n^2)

按照定義我們必須確定正常量 c_{1},c_{2},n_{0} 來使得對所有的 ngeq n_0 有:

c_{1}n^2leq frac{1}{2}n^2 -3n leq c_{2}n^2

即得到: c_{1}leq frac{1}{2} -frac{3}{n} leq c_{2}

c_2 = frac{1}{2} , c_{1}leq frac{1}{14} , n_0 =7 ,即可得到 frac{1}{2}n^2-3n=Theta(n^2)

從上述例子可以看出,常量選擇依賴於函數本身,屬於 Theta(n^2) 的不同函數通常需要不同的常量。

一般來說,對於任意多項式pn p(n)=sum_{i=0}^{d}{a_i n^i} ,其中 a_i 為常量且 a_d>0 ,我們有 p(n)=Theta(n^d) .


Omega notation 表示漸進下界

對於給定的函數 g(n) ,用 Omega(g(n)) 來表示以下函數的集合:

O(g(n))=left{ f(n): exists c>0,n_{o}>0,s.t. forall ngeq n_{0},0 leq cg(n) leq f(n)
ight}


定理:對於任意的兩個函數 f(n),g(n) ,我們有 f(n)=Theta(g(n)) ,當且僅當 f(n)=O(g(n))f(n)=Omega(g(n))


推薦閱讀:

科技特稿 | 凱西·奧尼爾:盲目信仰大數據的時代必須結束
好好玩的螺旋演算法No.69
九章演算法 | Uber面試題2 : House Robber III
演算法教練談談碼工面試

TAG:演算法 |