第 3 章 函數的增長

  當輸入規模足夠大時,使得只有運行時間的增長量級有關時,我們要研究算法的漸近效率。也就是說,我們關心當輸入規模無限增加時,在極限中,算法的運行時間如何隨着輸入規模的變大而增加。通常,漸近地更有效的某個算法對很小的輸入外的所有情況將是最好的。
  本章給出幾種標準方法來簡化算法的漸近分析。下一節首先定義幾類“漸近記號”,其中,我們已經見過一個例子是Θ記號。然後,我們給出貫穿本書使用的幾種記號的約定。最後,回顧以下在算法分析中常見的若干函數的行爲。

3.1 漸近記號

用來描述算法漸近運行時間的記號根據定義域爲自然數集N={0,1,2,……}的函數來定義。這樣的記號對描述最壞情況運行時間函數T(n)是方便的,因爲該函數通常只定義在整數輸入規模上。
漸近記號、函數與運行時間
  我們將主要用漸近記號來描述算法的運行時間。然而,漸近記號實際應用與函數。
  本書中對其使用漸近記號的函數通常刻畫算法的運行時間。但是漸近記號也可以適用於刻畫算法的某個方面的函數,甚至可以適用於和算法沒有關係的函數。

Θ記號
  在第 2 章,我們發現插入排序的最壞情況運行時間T(n)=Θ(n2 )。讓我們來定義這個記號意指什麼。對一個給定的函數g(n),用Θ(g(n))來表示以下函數的集合:
  Θ(g(n)) = { f(n):存在常量c1、c2和n0,使得對所有n ≥ n0,有 0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) }
  若存在常量c1和c2,使得對於足夠大的n,函數f(n)能“夾入”c1g(n) 與 c2g(n)之間,則f(n) 屬於集合Θ(g(n))。因爲Θ(g(n))是一個集合,所以可以記爲“f(n) ∈ Θ(g(n))”,以指出f(n)是Θ(g(n))的成員。作爲替代,我們通常記爲“f(n) = Θ(g(n))”以表達相同的概念。
  換句話說,對所有 n ≥ n0,函數f(n)在一個常量因子內等於g(n)。我們稱g(n) 是 f(n) 的一個漸近緊確界
  Θ(g(n))的定義要求每個成員f(n) ∈ Θ(g(n))均漸近非負,即當 n 足夠大時,f(n)非負。因此,函數g(n)本身必爲漸近非負,否者集合Θ(g(n))爲空。所有我們假設用在 Θ 記號的每個函數均漸近非負。這個假設對本章定義的其他漸近號也成立。
  一般來說,對任意多項式p(n) = di=0aini ,其中ai 爲常量且 ad > 0 ,我們有p(n) = Θ(nd )。
  因爲任意常量是一個 0 階多項式所以可以把任意常量函數表示成Θ(n2 )或Θ(1)。然而,後一種記號是一種輕微的活用,因爲該表達式併爲指出什麼變量趨於無窮。我們將經常是使用記號Θ(1)來意指一個常量或者關於某個變量的一個常量函數。
  
Ο記號
Θ記號漸近地給出了一個函數的上界和下界。當只有一個漸近上界時,使用O記號。對於給定的函數g(n) ,用O(g(n))來表示以下函數的集合:
O(g(n)) = { f(n)存在正常量c和n0 ,使得對所有 n n0 , 有 0f(n)cg(n) }
  我們記f(n)=O(g(n))以指出函數f(n)是集合O(g(n))的成員。按集合論的寫法,我們有Θ(g(n)) ⊆ O(g(n))。
  當我們說“運行時間爲O(n2 )時”,意指存在一個O(n2 )的函數f(n),使得對 n 的任意值,不管選擇什麼特定的規模的 n 的輸入,其運行時間的上界都是f(n)。這也就是說最壞情況運行時間爲O(n2 )。

Ω記號
Ω記號提供了漸近下界。對於給定的函數g(n),Ω(g(n))來表示以下函數的集合:
Ω(g(n))={f(n):存在正常量c 和 n0 ,使得對所有nn0 ,有 0cg(n)f(n) }
  定理 3.1 對任意兩個函數f(n)和g(n),我們有f(n)=Θ(g(n)),當且僅當f(n)=O(g(n))且f(n)=Ω(g(n)).
  當稱一個算法的運行時間爲Ω(g(n))時,我們意指對每個n值,不管選擇什麼特定的規模爲n的輸入,只要n足夠大,對那個輸入的運行時間至少是g(n)的常量倍。等價地,我們在對一個算法的最好情況運行時間給出一個下界。

等式和不等式中的漸近記號
  當漸近記號獨立於等式的右邊時,我們已經定義等號意指集合的成員關係。然而,一般來說,當漸近號出現在某個公式中時,我們將其解釋爲代表某個我們不關注名稱的匿名函數。例如,公式2n2+3n+1=2n2+Θ(n) 意指2n^2+3n+1=2n^2+f(n),其中f(n)是集合Θ(n)中的某個函數。在這裏,假設f(n)=3n+1,該函數確實在Θ(n)中。
  按這種方式使用漸近記號可以幫助消除一個等式中無關緊要的細節與混亂。

o記號
  由O記號提供的漸近上界可能是也可能不是漸近緊確的。我們使用o記號來表示一個非漸近緊確的上界。形式化地定義o(g(n))爲以下集合:
  o(g(n))={f(n):對任意正常量c>0,存在常量n0>0 ,使得對所有nn0 ,有0f(n)<cg(n) }
  O記號與o記號類似。主要區別是在f(n)=O(g(n))中,界0f(n)cg(n) 對某個常量c>0成立,但在f(n)=o(g(n))對所有常量c>0成立。直觀上,在o記號中,當n區域無窮大時,函數f(n)相對於g(n)來說變得微不足道了,即
  

limxf(n)g(n)=0

  有些學者使用這個極限作爲o記號的定義;本書中的定義還限定匿名函數是漸近非負的。

ω記號
  ω與Ω的關係類似與o記號與O記號的關係。我們使用ω記號來表示一個非漸近緊確的下界。定義它的一種方式是:
  f(n) ∈ ω(g(n))當且僅當g(n) ∈ o(f(n))
然而,我們形式化第定義ω(g(n))爲以下集合:
ω(g(n))={f(n):對任意正常量c>0,存在常量n0>0 ,使得對所有nn0 ,有0cg(n)<f(n) }
關係f(n)=ω(g(n))蘊含着:

limxf(n)g(n)=

也就是說,如果這個極限存在,那麼當n趨於無窮大時,f(n)相對於g(n)來說變得任意大了。

比較各種函數
實數的許多關係性質也使用於漸近比較。下面假定f(n)和g(n)漸近爲正。
傳遞性
    f(n)=Θ(g(n)) 且 g(n) = Θ(h(n)) 蘊含f(n)=Θ(h(n))
    f(n)=O(g(n)) 且 g(n) = O(h(n)) 蘊含f(n)=O(h(n))
    f(n)=Ω(g(n)) 且 g(n) = Ω(h(n)) 蘊含f(n)=Ω(h(n))
    f(n)=o(g(n)) 且 g(n) = o(h(n)) 蘊含f(n)=o(h(n))
    f(n)=ω(g(n)) 且 g(n) = ω(h(n)) 蘊含f(n)=ω(h(n))
自反性   
     f(n) = Θ(f(n))
     f(n) = O(f(n))
     f(n) = Ω(f(n))
對成型
    f(n) = Θ(g(n)),當且僅當g(n)=Θ(f(n))
轉置對成性    
    f(n) = O(g(n))當且僅當g(n)= Ω(f(n))
    f(n) = o(g(n))當且僅當g(n)= ω(f(n))
  因爲這些性質對漸近記號成立,所以可以在兩個函數f和g的漸近比較和兩個實數a與b的比較之間做一種類比。
   f(n)=O(g(n)) 類似於a b
   f(n)=Ω(g(n)) 類似於a b
   f(n)=Θ(g(n)) 類似於a= b
   f(n)=o(g(n)) 類似於a< b
   f(n)=ω(g(n)) 類似於a> b
若f(n)=o(g(n)),則稱f(n)漸近小於**g(n);若f(n)=ω(g(n)),則稱f(n)漸近大於**g(n);
然而,實數的下列性質不能攜帶到漸近記號:
三分性:對任意兩個實數a和b,下列三種情況恰有一種必須成立:a

3.2 標準記號與常用函數

本節將回顧一些標準的數學函數與記號並探索它們之間的關係
單調性
  若mn 蘊含f(m)f(n) ,則函數f(n)是單調遞增的。類似地,若mn 蘊含f(m)f(n) 則函數f(n)是單調遞減的。若m<n 蘊含f(m)<f(n) ,則函數f(n)是嚴格遞增的。類似地,若m<n 蘊含f(m)>f(n) 則函數f(n)是嚴格遞減的。
向下取整與向上取整
  對任意實數x,我們用⌊x⌋表示小於或等於x的最大整數(讀作“x的向下取整”),並用⌈x⌉表示大於或等於x的最小整數(讀作“x的向上取整”)。對所有實數x,
  x-1<⌊x⌋xx < x+1
 對任意實數n,⌊n/2⌋+⌈n/2⌉ = n
 對任意實數x 0和整數a,b>0,
     ⌈x/ab ⌉=⌈xab
     ⌊x/ab ⌋=⌊xab
     ⌈aba+(b1)b
     ⌊aba(b1)b
向下取整函數f(x)=⌊x⌋是單調遞增的,向上取整函數f(x)=⌈x⌉也是單調遞增的。
模運算
  對任意整數a和任意正整數n,a mod n的值就是a/n的餘數:
  a mod n=a-n⌊a/n⌋
若(a mod n)=(b mod n),則記a b(mod n),並稱模n時a等價於b。
多項式
  給定一個非負整數d,n的d次多項式爲具有以下形式的一個函數p(n):
  

p(n)=i=0daini

  其中,常量a0,a1,...,ad 是多項式的係數且ad0 。一個多項式爲漸近正的當且僅當ad>0 。對於一個d次漸近正的多項式p(n),有p(n)=Θ(nd ).若對某個常量k,有f(n)=O(nk) ,則稱函數f(n)是多項式有界的。
指數
    對所有實數a>0、m和n,我們有以下恆等式:
        a0=1
        a1=a
        a1=1/a
        (am)n=amn
        (am)n=(an)m
        aman=am+n
對所有n和a1 ,函數an 關於n單調遞增。方便時,我們假定00=1 .
  可以通過以下事實使多項式與指數的增長率互相關聯。對所有使得a>1的實常量a和b,有
  
limxnban=0

  據此可得:nb=o(an)
  因此,任意底大於 1 的指數函數比任意多項式函數增長的快。
  使用e來表示自然對數函數的底2.71828…,對所有實數x,我們有
  
ex=1+x+x22!+x33!+...=i=0xii!

  其中“!”表示本節後面定義的階乘函數。對所有實數x,我們有不等式:
  
ex1+x

  其中只有當x=0是等號成立。當|x|1 時,我們有近似估計
  
1+xex1+x+x2

  當x0 時,用1+x作爲eex 近似是相當好的:ex=1+x+Θ(x2)
  對所有x,我們有:
  
limn(1+xn)n=ex

對數
我們將使用下面的記號:
    lgn=log2n (以2爲底的對數)
    lnn=logen (自然對數)
    lgkn=(lgn)k (取冪)
    lglgn=lg(lgn) (複合)
  對所有實數a>0,b>0,c>0和n,有
  
a=blogba

  
logcab=logca+logcb

  
logban=nlogba

  
logba=logcalogcb

  
logb(1/a)=logba

  
logba=1logab

  
alogbc=clogba

  其中,上面的每個等式中,對數的底不爲1.
  若對某個常量k,f(n)=O(lgkn ),則稱函數f(n)是多對數有界的。
  對任意常量a>0,lgbn=o(na) ,因此任意正的多項式函數比任意多對數函數增長的快。
階乘
記號n!定義爲對整數n0 ,有n!=1*2*3…*n
階乘的一個弱上界是n!nn ,因爲在階乘中,n項的每項最多爲n。斯特林近似公式
n!=2πn(ne)n(1+Θ(1n))

給出了一個更緊確的上界和下界。
n!=o(nn)

n!=ω(2n)

lg(n!=Θ(nlgn)

對所有n1 ,下面的等式也成立:
n!=2πn(ne)neαn

其中,112n+1<αn<112n

多重函數
我們使用記號f(i)(n) 來表示f(n)重複i次作用於一個初值n上。形式化地,假設f(n)爲實數集上的一個函數。對非負整數i,我們遞歸地定義
f(i)(n)={n,f(f(i1)(n)),i=0i>0
  例如,若f(n)=2n,則f(i)(n)=2in
多重對數函數
我們使用lgn (讀作“log星n”)來表示多重對數,下面給出它的定義。假設lg(i)n 定義如上,其中f(n)=lgn.因爲非正數的對數無定義,所以只能在lg(i1)n>0lg(i)n 纔有定義。一定要區分lg(i)n (從參數n開始,連續應用對數函數i次)與lgin (n的對數i次冪)。於是定義多重對數函數爲:

lgn=min{i0:lg(i)n1}

多重對數函數是一個增長非常慢的函數:
lg2=1

lg4=2

lg16=3

lg65536=4

lg(265536)=5

斐波那契數
使用下面的遞歸式來定義斐波那契數
F0=0

F1=1

Fi=Fi1+Fi1i2

因此,每個斐波那契數都是兩個前面的數之和。
斐波那契數與黃金分割率Φ及其共軛數Φ^ 有關,它們是下列方程的兩個根:
x2=x+1

Φ=1+52

Φ^=152

特別地有:
Fi=ΦiΦ^i5

因爲|Φ^ |<1,所以有
|Φ^i|5<15<12

這蘊含着
Fi=Φ^i5+12

這就是說第i個斐波那契數Fi 等於\frac{\hat Φ^i}{\sqrt5}舍入到最近的整數。因此,斐波那契數以指數形式增長。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章