算法设计与分析——算法学基础(三):渐进记号
分類目錄:《算法設(shè)計(jì)與分析》總目錄
相關(guān)文章:
算法學(xué)基礎(chǔ)(一):算法學(xué)概述
算法學(xué)基礎(chǔ)(二):分析算法
算法學(xué)基礎(chǔ)(三):漸進(jìn)記號(hào)
第《算法學(xué)基礎(chǔ)(二):分析算法》中定義了算法運(yùn)行時(shí)間的增長(zhǎng)量級(jí)簡(jiǎn)單地刻畫(huà)了算法效率,并且還允許我們比較可選算法的相對(duì)性能。一旦輸入規(guī)模nnn變得足夠大,最壞情況運(yùn)行時(shí)間為Θ(nlg?n)\Theta(n\lg{n})Θ(nlgn)的歸并排序?qū)?zhàn)勝最壞情況運(yùn)行時(shí)間為Θ(n2)\Theta(n^2)Θ(n2)的插入排序。正如我們?cè)诜治霾迦肱判驎r(shí)所做的工作,雖然有時(shí)我們能夠確定一個(gè)算法的精確運(yùn)行時(shí)間,但是通常并不值得花力氣來(lái)計(jì)算它以獲得多余的精度。對(duì)于足夠大的輸入,精確運(yùn)行時(shí)間中的倍增常量和低階項(xiàng)被輸入規(guī)模本身的影響所支配。
當(dāng)輸入規(guī)模足夠大,使得只有運(yùn)行時(shí)間的增長(zhǎng)量級(jí)有關(guān)時(shí),我們要研究算法的漸近效率。也就是說(shuō),我們關(guān)心當(dāng)輸入規(guī)模無(wú)限增加時(shí),在極限中,算法的運(yùn)行時(shí)間如何隨著輸入規(guī)模的變大而增加。通常,漸近地更有效的某個(gè)算法對(duì)除很小的輸入外的所有情況將是最好的選擇。
本文以及后文將給出幾種標(biāo)準(zhǔn)方法來(lái)簡(jiǎn)化算法的漸近分析。首先定義幾類“漸近記號(hào)”,其中,我們已經(jīng)見(jiàn)過(guò)的一個(gè)例子是Θ\ThetaΘ記號(hào)。然后,我們給出算法分析領(lǐng)域經(jīng)常使用的幾種記號(hào)約定。
漸近記號(hào)、函數(shù)與運(yùn)行時(shí)間
正如我們寫(xiě)插入排序的最壞情況運(yùn)行時(shí)間為Θ(n2)\Theta(n^2)Θ(n2)時(shí)那樣,我們將主要使用漸近記號(hào)來(lái)描述算法的運(yùn)行時(shí)間。然而,漸近記號(hào)實(shí)際上應(yīng)用于函數(shù)。回顧一下,我們?cè)巡迦肱判虻淖顗那闆r運(yùn)行時(shí)間刻畫(huà)為an2+bn+can^2 + bn + can2+bn+c,其中aaa、bbb和ccc是常量。通過(guò)把插入排序的運(yùn)行時(shí)間寫(xiě)成Θ(n2)\Theta(n^2)Θ(n2),我們除去了該函數(shù)的某些細(xì)節(jié)。因?yàn)闈u近記號(hào)適用于函數(shù),我們所寫(xiě)成的Θ(n2)\Theta(n^2)Θ(n2)就是函數(shù)an2+bn+can^2 + bn + can2+bn+c,所以上述情況碰巧刻畫(huà)了插入排序的最壞情況運(yùn)行時(shí)間。
算法分析領(lǐng)域常常對(duì)其使用漸近記號(hào)的函數(shù)通常刻畫(huà)算法的運(yùn)行時(shí)間。但是漸近記號(hào)也可以適用于刻畫(huà)算法的某個(gè)其他方面(例如,算法使用的空間數(shù)量)的函數(shù),甚至可以適用于和算法沒(méi)有任何關(guān)系的函數(shù)。
即使我們使用漸近記號(hào)來(lái)刻畫(huà)算法的運(yùn)行時(shí)間,我們也需要了解意指哪個(gè)運(yùn)行時(shí)間。有時(shí)我們對(duì)最壞情況運(yùn)行時(shí)間感興趣。然而,我們常常希望刻畫(huà)任何輸入的運(yùn)行時(shí)間。換句話說(shuō),我們常常希望做出一種綜合性地覆蓋所有輸入而不僅僅是最壞情況的陳述。我們將看到完全適合刻畫(huà)任何輸入的運(yùn)行時(shí)間的漸近記號(hào)。
漸近記號(hào)
Θ\ThetaΘ記號(hào)
在《算法學(xué)基礎(chǔ)(二):分析算法》中,我們發(fā)現(xiàn)插入排序的最壞情況運(yùn)行時(shí)間為T(n)=Θ(n2)T(n) = \Theta(n^2)T(n)=Θ(n2)。這意味著:對(duì)一個(gè)給定的函數(shù)g(n)g(n)g(n),用Θ(g(n))\Theta(g(n))Θ(g(n))來(lái)表示以下函數(shù)的集合:
Θ(g(n))={f(n):?c1>0,c2>0,n0>0,?n≥n0,0≤c1g(n)≤f(n)≤c2g(n)}\Theta(g(n)) = \{ f(n):\exists \ c_1 > 0, c_2 > 0, n_0 >0,\forall n \geq n_0,0 \leq c_1g(n) \leq f(n) \leq c_2g(n) \} Θ(g(n))={f(n):??c1?>0,c2?>0,n0?>0,?n≥n0?,0≤c1?g(n)≤f(n)≤c2?g(n)}
若存在正常量c1c_1c1?和c2c_2c2?,使得對(duì)于足夠大的nnn,函數(shù)f(n)f(n)f(n)能“夾入”c1g(n)c_1g(n)c1?g(n)與c2g(n)c_2g(n)c2?g(n)之間,則f(n)f(n)f(n))屬于集合Θ(g(n))\Theta(g(n))Θ(g(n))。因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">Θ(g(n))\Theta(g(n))Θ(g(n))是一個(gè)集合,所以可以記f(n)∈Θ(g(n))f(n) \in \Theta(g(n))f(n)∈Θ(g(n)),以指出f(n)f(n)f(n)是Θ(g(n))\Theta(g(n))Θ(g(n))的成員。作為替代,我們通常記f(n)=Θ(g(n))f(n) = \Theta(g(n))f(n)=Θ(g(n))以表達(dá)相同的概念。因?yàn)槲覀儼催@種方式活用了等式,所以你可能感到困惑,但是在后面的文章中我們將看到這樣做有其好處。
下圖(a)給出了函數(shù)f(n)f(n)f(n)與g(n)g(n)g(n)的一幅直觀畫(huà)面,其中f(n)=Θ(g(n))f(n) = \Theta(g(n))f(n)=Θ(g(n))。對(duì)在n0n_0n0?及其右邊nnn的所有值,f(n)f(n)f(n)的值位于或高于c1g(n)c_1g(n)c1?g(n)且位于或低于c2g(n)c_2g(n)c2?g(n)。換句話說(shuō),對(duì)所有n≤n0n \leq n_0n≤n0?,函數(shù)f(n)f(n)f(n)在一個(gè)常量因子內(nèi)等于g(n)g(n)g(n)。我們稱g(n)g(n)g(n)是f(n)f(n)f(n)的一個(gè)漸近緊確界。
Θ(g(n))\Theta(g(n))Θ(g(n))的定義要求每個(gè)成員f(n)∈Θ(g(n))f(n) \in \Theta(g(n))f(n)∈Θ(g(n))均漸近非負(fù),即當(dāng)nnn足夠大時(shí),f(n)f(n)f(n)非負(fù)。其中,漸近正函數(shù)就是對(duì)所有足夠大的nnn均為正的函數(shù)。因此,函數(shù)g(n)g(n)g(n)本身必為漸近非負(fù),否則集合Θ(g(n))\Theta(g(n))Θ(g(n))為空。所以我們假設(shè)用在Θ\ThetaΘ記號(hào)中的每個(gè)函數(shù)均漸近非負(fù)。這個(gè)假設(shè)對(duì)本章定義的其他漸近記號(hào)也成立。
在《算法學(xué)基礎(chǔ)(二):分析算法》中我們介紹了Θ\ThetaΘ記號(hào)的一種非形式化的概念,相當(dāng)于扔掉低階項(xiàng)并忽略最高階項(xiàng)前的系數(shù)。直覺(jué)上,一個(gè)漸近正函數(shù)的低階項(xiàng)在確定漸近確界時(shí)可以被忽略,因?yàn)閷?duì)大的nnn,它們是無(wú)足輕重的。當(dāng)nnn較大時(shí),即使最高階項(xiàng)的一個(gè)很小的部分都足以支配所有低階項(xiàng)。因此,將c1c_1c1?置為稍小于最高階項(xiàng)系數(shù)的值并將c2c_2c2?置為稍大于最高階項(xiàng)系數(shù)的值能使Θ\ThetaΘ記號(hào)定義中的不等式得到滿足。最高階項(xiàng)系數(shù)同樣可以被忽略,因?yàn)樗鼉H僅根據(jù)一個(gè)等于該系數(shù)的常量因子來(lái)改變c1c_1c1?和c2c_2c2?。
作為一個(gè)例子,考慮任意二次函數(shù)f(n)=an2+bn+cf(n) = an^2 + bn + cf(n)=an2+bn+c,其中aaa、bbb和ccc均為常量且a>0a > 0a>0。扔掉低階項(xiàng)并忽略常量后得f(n)=Θ(n2)f(n) = \Theta(n^2)f(n)=Θ(n2)。為了形式化地證明相同的結(jié)論,我們?nèi)〕A?span id="ozvdkddzhkzd" class="katex--inline">c1=a4c_1 = \frac{a}{4}c1?=4a?,c2=7a4c_2 = \frac{7a}{4}c2?=47a?且n0=2max?(∣b∣a,∣c∣a)n_0 = 2\max{(\frac{|b|}{a}, \sqrt{\frac{|c|}{a}})}n0?=2max(a∣b∣?,a∣c∣??)。可以證明對(duì)所有n≥n0n \geq n_0n≥n0?,有0≤c1n2≤an2+bn+c≤c2n20 \leq c_1n^2 \leq an^2 + bn + c \leq c_2n^20≤c1?n2≤an2+bn+c≤c2?n2。一般來(lái)說(shuō),對(duì)任意多項(xiàng)式p(n)=∑i=0dainip(n) = \sum_{i = 0}^d a_in^ip(n)=∑i=0d?ai?ni,其中aia_iai?為常量且ad>0a_d > 0ad?>0,我們有p(n)=Θ(nd)p(n) = \Theta(n^d)p(n)=Θ(nd)。
因?yàn)槿我獬A渴且粋€(gè)000階多項(xiàng)式,所以可以把任意常量函數(shù)表示成Θ(n0)\Theta(n^0)Θ(n0)或者Θ(1)\Theta(1)Θ(1)。然而,后一種記號(hào)是一種輕微的活用,因?yàn)樵摫磉_(dá)式并未指出什么變量趨于無(wú)窮e。我們將經(jīng)常使用記號(hào)Θ(1)\Theta(1)Θ(1)來(lái)意指一個(gè)常量或者關(guān)于某個(gè)變量的一個(gè)常量函數(shù)。
OOO記號(hào)
記號(hào)漸近地給出一個(gè)函數(shù)的上界和下界。當(dāng)只有一個(gè)漸近上界時(shí),使用OOO記號(hào)。對(duì)于給定的函數(shù)g(n)g(n)g(n),用O(g(n))O(g(n))O(g(n))來(lái)表示以下函數(shù)的集合:
O(g(n))={f(n):?c>0,n0>0,?n≥n0,0≤f(n)≤cg(n)}O(g(n)) = \{ f(n):\exists \ c > 0, n_0 >0,\forall n \geq n_0,0 \leq f(n) \leq cg(n) \} O(g(n))={f(n):??c>0,n0?>0,?n≥n0?,0≤f(n)≤cg(n)}
我們使用OOO記號(hào)來(lái)給出函數(shù)的一個(gè)在常量因子內(nèi)的上界。上圖(b)展示了OOO記號(hào)背后的直覺(jué)知識(shí)。對(duì)在n0n_0n0?及其右邊的所有值nnn,函數(shù)f(n)f(n)f(n)的值總小于或等于cg(n)cg(n)cg(n)。
我們記f(n)=O(g(n))f(n) = O(g(n))f(n)=O(g(n))以指出函數(shù)f(n)f(n)f(n)是集合O(g(n))O(g(n))O(g(n))的成員。注意,f(n)=Θ(g(n))f(n) = \Theta(g(n))f(n)=Θ(g(n))蘊(yùn)涵著f(n)=O(g(n))f(n) = O(g(n))f(n)=O(g(n)),因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">Θ\ThetaΘ記號(hào)是一個(gè)比OOO記號(hào)更強(qiáng)的概念。按集合論中的寫(xiě)法,我們有Θ(g(n))?O(g(n))\Theta(g(n)) \subseteq O(g(n))Θ(g(n))?O(g(n))。因此,關(guān)于任意二次函數(shù)f(n)=an2+bn+cf(n) = an^2 + bn + cf(n)=an2+bn+c,其中a>0a > 0a>0,在Θ(n2)\Theta(n^2)Θ(n2)中的證明也證明了任意這樣的二次函數(shù)在O(n2)O(n^2)O(n2)中。也許更令人驚奇的是當(dāng)a>0a > 0a>0時(shí),任意線性函數(shù)an+ban + ban+b也在O(n2)O(n^2)O(n2)中,我們可以很容易證明這個(gè)結(jié)論。
但是在文獻(xiàn)中,有時(shí)我們發(fā)現(xiàn)OOO記號(hào)非形式化地描述漸近確界,即已經(jīng)使用Θ\ThetaΘ記號(hào)定義的東西。使用OOO記號(hào),我們常常可以僅僅通過(guò)檢查算法的總體結(jié)構(gòu)來(lái)描述算法的運(yùn)行時(shí)間。例如,《排序算法(一):插入排序》中插入排序算法的雙重嵌套循環(huán)結(jié)構(gòu)對(duì)最壞情況運(yùn)行時(shí)間立即產(chǎn)生一個(gè)O(n2)O(n^2)O(n2)的上界:內(nèi)層循環(huán)每次迭代的代價(jià)以O(1)O(1)O(1)為上界,下標(biāo)iii和iii均最多為nnn,對(duì)于n2n^2n2個(gè)iii和jjj值對(duì)的每一對(duì),內(nèi)循環(huán)最多執(zhí)行一次。
既然OOO記號(hào)描述上界,那么當(dāng)用它來(lái)限制算法的最壞情況運(yùn)行時(shí)間時(shí),關(guān)于算法在每個(gè)輸入上的運(yùn)行時(shí)間,我們也有一個(gè)界,這就是前面討論的綜合性陳述。因此,對(duì)插入排序的最壞情況運(yùn)行時(shí)間的界O(n2)O(n^2)O(n2)也適用于該算法對(duì)每個(gè)輸入的運(yùn)行時(shí)間。然而,對(duì)插入排序的最壞情況運(yùn)行時(shí)間的界Θ(n2)\Theta(n^2)Θ(n2)并未暗示插入排序?qū)γ總€(gè)輸入的運(yùn)行時(shí)間的界也是Θ(n2)\Theta(n^2)Θ(n2))。例如,我們?cè)诋?dāng)輸入已排好序時(shí),插入排序的運(yùn)行時(shí)間為Θ(n)\Theta(n)Θ(n)。從技術(shù)上看,稱插入排序的運(yùn)行時(shí)間為O(n2)O(n^2)O(n2)有點(diǎn)不合適,因?yàn)閷?duì)給定的nnn,實(shí)際的運(yùn)行時(shí)間是變化的,依賴于規(guī)模為nnn的特定輸入。當(dāng)我們說(shuō)“運(yùn)行時(shí)間為O(n2)O(n^2)O(n2)”時(shí),意指存在一個(gè)O(n2)O(n^2)O(n2)的函數(shù)f(n)f(n)f(n),使得對(duì)nnn的任意值,不管選擇什么特定的規(guī)模為nnn的輸入,其運(yùn)行時(shí)間的上界都是f(n)f(n)f(n)。這也就是說(shuō)最壞情況運(yùn)行時(shí)間為O(n2)O(n^2)O(n2)。
Ω\OmegaΩ記號(hào)
正如OOO記號(hào)提供了一個(gè)函數(shù)的漸近上界,Ω\OmegaΩ記號(hào)提供了漸近下界。對(duì)于給定的函數(shù)g(n)g(n)g(n),用Ω(g(n))\Omega(g(n))Ω(g(n))來(lái)表示以下函數(shù)的集合:
Ω(g(n))={f(n):?c>0,n0>0,?n≥n0,0≤cg(n)≤f(n)}\Omega(g(n)) = \{ f(n):\exists \ c > 0, n_0 >0,\forall n \geq n_0,0 \leq cg(n) \leq f(n) \} Ω(g(n))={f(n):??c>0,n0?>0,?n≥n0?,0≤cg(n)≤f(n)}
上圖?給出了Ω\OmegaΩ記號(hào)的直觀解釋。對(duì)在n0n_0n0?及其右邊的所有值nnn,f(n)f(n)f(n)的值總大于或等于cg(n)cg(n)cg(n)。
根據(jù)目前所看到的這些漸近記號(hào)的定義,容易證明以下重要定理:對(duì)任意兩個(gè)函數(shù)f(n)f(n)f(n)和g(n)g(n)g(n),我們有f(n)=Θ(g(n))f(n) = \Theta(g(n))f(n)=Θ(g(n)),當(dāng)且僅當(dāng)f(n)=O(g(n))f(n) = O(g(n))f(n)=O(g(n))且f(n)=Ω(g(n))f(n) = \Omega(g(n))f(n)=Ω(g(n))。
當(dāng)稱一個(gè)算法的運(yùn)行時(shí)間為Ω(g(n))\Omega(g(n))Ω(g(n))時(shí),我們意指對(duì)每個(gè)nnn值,不管選擇什么特定的規(guī)模為nnn的輸入,只要nnn足夠大,對(duì)那個(gè)輸入的運(yùn)行時(shí)間至少是g(n)g(n)g(n)的常量倍。等價(jià)地,我們?cè)賹?duì)一個(gè)算法的最好情況運(yùn)行時(shí)間給出一個(gè)下界。例如,插入排序的最好情況運(yùn)行時(shí)間為Ω(n)\Omega(n)Ω(n),這蘊(yùn)涵著插入排序的運(yùn)行時(shí)間為Ω(n)\Omega(n)Ω(n)。
所以插入排序的運(yùn)行時(shí)間介于Ω(n)\Omega(n)Ω(n)和O(n)O(n)O(n),因?yàn)樗淙?span id="ozvdkddzhkzd" class="katex--inline">nnn的線性函數(shù)與nnn的二次函數(shù)之間的任何地方。而且,這兩個(gè)界是盡可能漸近地緊確的:例如,插入排序的運(yùn)行時(shí)間不是Ω(n)\Omega(n)Ω(n),因?yàn)榇嬖谝粋€(gè)輸入,對(duì)該輸入,插入排序在Θ(n)\Theta(n)Θ(n)時(shí)間內(nèi)運(yùn)行。然而,這與稱插入排序的最壞情況運(yùn)行時(shí)間為Ω(n2)\Omega(n^2)Ω(n2)并不矛盾,因?yàn)榇嬖谝粋€(gè)輸入,使得該算法需要Ω(n2)\Omega(n^2)Ω(n2)的時(shí)間。
ooo記號(hào)
由OOO記號(hào)提供的漸近上界可能是也可能不是漸近緊確的。界2n2=O(n2)2n^2 = O(n^2)2n2=O(n2)是漸近緊確的,但是界2n=O(n2)2n = O(n^2)2n=O(n2)卻不是。我們使用ooo記號(hào)來(lái)表示一個(gè)非漸近緊確的上界。形式化地定義o(g(n))o(g(n))o(g(n))為以下集合:
o(g(n))={f(n):?c>0,?n0>0,?n≥n0,0≤f(n)≤cg(n)}o(g(n)) = \{ f(n):\forall \ c > 0, \exist \ n_0 >0,\forall n \geq n_0,0 \leq f(n) \leq cg(n) \} o(g(n))={f(n):??c>0,??n0?>0,?n≥n0?,0≤f(n)≤cg(n)}
例如,2n=o(n2)2n = o(n^2)2n=o(n2),但是2n2≠o(n2)2n^2 \neq o(n^2)2n2?=o(n2)。OOO記號(hào)與ooo記號(hào)的定義類似。主要的區(qū)別是在f(n)=O(g(n))f(n) = O(g(n))f(n)=O(g(n))中,界0≤f(n)≤cg(n)0 \leq f(n) \leq cg(n)0≤f(n)≤cg(n)對(duì)某個(gè)常量c>0c > 0c>0成立,但在f(n)=o(g(n))f(n) = o(g(n))f(n)=o(g(n)),界0≤f(n)≤cg(n)0 \leq f(n) \leq cg(n)0≤f(n)≤cg(n)對(duì)所有常量c>0c > 0c>0成立。直觀上,在ooo記號(hào)中,當(dāng)nnn趨于無(wú)窮時(shí),函數(shù)f(n)f(n)f(n)相對(duì)于g(n)g(n)g(n)來(lái)說(shuō)變得微不足道了,即:
lim?n→+∞f(n)g(n)=0\lim_{n \to +\infty}\frac{f(n)}{g(n)} = 0n→+∞lim?g(n)f(n)?=0
ω\omegaω記號(hào)
ω\omegaω記號(hào)與Ω\OmegaΩ記號(hào)的關(guān)系類似于ooo記號(hào)與OOO記號(hào)的關(guān)系。我們使用ω\omegaω記號(hào)來(lái)表示一個(gè)非漸近緊確的下界。它形式化定義是:
ω(g(n))={f(n):?c>0,?n0>0,?n≥n0,0≤cg(n)≤f(n)}\omega(g(n)) = \{ f(n):\forall \ c > 0, \exist \ n_0 >0,\forall n \geq n_0,0 \leq cg(n) \leq f(n) \} ω(g(n))={f(n):??c>0,??n0?>0,?n≥n0?,0≤cg(n)≤f(n)}
然而,我們還可以用另一種方式定義ω\omegaω記號(hào):
f(n)∈ω(g(n))?g(n)∈o(f(n))f(n) \in \omega(g(n)) \Leftrightarrow g(n) \in o(f(n))f(n)∈ω(g(n))?g(n)∈o(f(n))
同樣,關(guān)系f(n)=ω(g(n))f(n) = \omega(g(n))f(n)=ω(g(n))也蘊(yùn)含著:
lim?n→+∞f(n)g(n)=∞\lim_{n \to +\infty}\frac{f(n)}{g(n)} = \inftyn→+∞lim?g(n)f(n)?=∞
也就是說(shuō),如果這個(gè)極限存在,那么當(dāng)n趨于無(wú)窮時(shí),f(n)f(n)f(n)相對(duì)于g(n)g(n)g(n)來(lái)說(shuō)變得任意大了。
等式和不等式中的漸近記號(hào)
我們已經(jīng)看到漸近記號(hào)可以如何用于數(shù)學(xué)公式中。例如,在介紹OOO記號(hào)記n=O(n2)n = O(n^2)n=O(n2)。我們還可能寫(xiě)過(guò)2n2+3n+1=2n2+Θ(n)2n^2 + 3n + 1 = 2n^2 + \Theta(n)2n2+3n+1=2n2+Θ(n)。當(dāng)漸近記號(hào)獨(dú)立于等式或不等式的右邊時(shí),如在n=O(n2)n = O(n^2)n=O(n2)中,我們已經(jīng)定義等號(hào)意指集合的成員關(guān)系:n∈O(n2)n \in O(n^2)n∈O(n2)。然而,一般來(lái)說(shuō),當(dāng)漸近記號(hào)出現(xiàn)在某個(gè)公式中時(shí),我們將其解釋為代表某個(gè)我們不關(guān)注名稱的匿名函數(shù)。例如,公式2n2+3n+1=2n2+Θ(n)2n^2 + 3n + 1 = 2n^2 + \Theta(n)2n2+3n+1=2n2+Θ(n)意指2n2+3n+1=2n2+f(n)2n^2 + 3n + 1 = 2n^2 + f(n)2n2+3n+1=2n2+f(n),其中f(n)f(n)f(n)是集合Θ(n)\Theta(n)Θ(n)中的某個(gè)函數(shù)。在這個(gè)例子中,假設(shè)f(n)=3n+1f(n) = 3n + 1f(n)=3n+1,該函數(shù)確實(shí)在Θ(n)\Theta(n)Θ(n)中。
按這種方式使用漸近記號(hào)可以幫助消除一個(gè)等式中無(wú)關(guān)緊要的細(xì)節(jié)與混亂。例如,在《分治策略(一):基礎(chǔ)知識(shí)》中,我們把歸并排序的最壞情況運(yùn)行時(shí)間表示為遞歸式2T(n2)+Θ(n)2T(\frac{n}{2}) + \Theta(n)2T(2n?)+Θ(n)。如果只對(duì)T(n)T(n)T(n)的漸近行為感興趣,那么沒(méi)有必要準(zhǔn)確說(shuō)明所有低階項(xiàng),它們都被理解為包含在由項(xiàng)Θ(n)\Theta(n)Θ(n)表示的匿名函數(shù)中。
一個(gè)表達(dá)式中匿名函數(shù)的數(shù)目可以理解為等于漸近記號(hào)出現(xiàn)的次數(shù)。例如,在表達(dá)式∑O(i)\sum O(i)∑O(i)中,只有一個(gè)匿名函數(shù)(一個(gè)iii的函數(shù))。因此,這個(gè)表達(dá)式不同于O(1)+O(2)+?+O(n)O(1) + O(2) + \cdots + O(n)O(1)+O(2)+?+O(n),實(shí)際上后者沒(méi)有一個(gè)清晰的解釋。
在某些例子中,漸近記號(hào)出現(xiàn)在等式的左邊,例如:2n2+Θ(n)=Θ(n2)2n^2 + \Theta(n) = \Theta(n^2)2n2+Θ(n)=Θ(n2)。我們使用以下規(guī)則來(lái)解釋這種等式:無(wú)論怎樣選擇等號(hào)左邊的匿名函數(shù),總有一種辦法來(lái)選擇等號(hào)右邊的匿名函數(shù)使等式成立。因此,我們的例子意指對(duì)任意函數(shù)f(n)∈Θ(n)f(n) \in \Theta(n)f(n)∈Θ(n),存在某個(gè)函數(shù)g(n)∈Θ(n2)g(n) \in \Theta(n^2)g(n)∈Θ(n2),使得對(duì)所有的nnn,有2n2+f(n)=g(n)2n^2 + f(n) = g(n)2n2+f(n)=g(n)。換句話說(shuō),等式右邊比左邊提供的細(xì)節(jié)更粗糙。
漸近記號(hào)的比較
實(shí)數(shù)的許多關(guān)系性質(zhì)也適用于漸近比較。下面假定f(n)f(n)f(n)和g(n)g(n)g(n)漸近為正。
傳遞性
f(n)=Θ(g(n))and?g(n)=Θ(h(n))?f(n)=Θ(h(n))f(n) = \Theta(g(n)) \ \text{and} \ g(n) = \Theta(h(n)) \quad \Rightarrow \quad f(n) = \Theta(h(n))f(n)=Θ(g(n))?and?g(n)=Θ(h(n))?f(n)=Θ(h(n))
f(n)=O(g(n))and?g(n)=O(h(n))?f(n)=O(h(n))f(n) = O(g(n)) \ \text{and} \ g(n) = O(h(n)) \quad \Rightarrow \quad f(n) = O(h(n))f(n)=O(g(n))?and?g(n)=O(h(n))?f(n)=O(h(n))
f(n)=Ω(g(n))and?g(n)=Ω(h(n))?f(n)=Ω(h(n))f(n) = \Omega(g(n)) \ \text{and} \ g(n) = \Omega(h(n)) \quad \Rightarrow \quad f(n) = \Omega(h(n))f(n)=Ω(g(n))?and?g(n)=Ω(h(n))?f(n)=Ω(h(n))
f(n)=o(g(n))and?g(n)=o(h(n))?f(n)=o(h(n))f(n) = o(g(n)) \ \text{and} \ g(n) = o(h(n)) \quad \Rightarrow \quad f(n) = o(h(n))f(n)=o(g(n))?and?g(n)=o(h(n))?f(n)=o(h(n))
f(n)=ω(g(n))and?g(n)=ω(h(n))?f(n)=ω(h(n))f(n) = \omega(g(n)) \ \text{and} \ g(n) = \omega(h(n)) \quad \Rightarrow \quad f(n) = \omega(h(n))f(n)=ω(g(n))?and?g(n)=ω(h(n))?f(n)=ω(h(n))
自反性
f(n)=Θ(f(n))f(n) = \Theta(f(n))f(n)=Θ(f(n))
f(n)=O(f(n))f(n) = O(f(n))f(n)=O(f(n))
f(n)=Ω(f(n))f(n) = \Omega(f(n))f(n)=Ω(f(n))
對(duì)稱性
f(n)=Θ(g(n))?g(n)=Θ(f(n))f(n) = \Theta(g(n)) \Leftrightarrow g(n) = \Theta(f(n))f(n)=Θ(g(n))?g(n)=Θ(f(n))
f(n)=O(g(n))?g(n)=Ω(f(n))f(n) = O(g(n)) \Leftrightarrow g(n) = \Omega(f(n))f(n)=O(g(n))?g(n)=Ω(f(n))
f(n)=o(g(n))?g(n)=ω(f(n))f(n) = o(g(n)) \Leftrightarrow g(n) = \omega(f(n))f(n)=o(g(n))?g(n)=ω(f(n))
三分性
對(duì)任意兩個(gè)實(shí)數(shù)aaa和bbb,下列三種情況恰有一種必須成立:a<ba < ba<b,a=ba = ba=b,a>ba > ba>b。雖然任意兩個(gè)實(shí)數(shù)都可以進(jìn)行比較,但不是所有函數(shù)都可漸近比較。也就是說(shuō),對(duì)兩個(gè)函數(shù)f(n)f(n)f(n)和g(n)g(n)g(n),也許f(n)=O(g(n))f(n) = O(g(n))f(n)=O(g(n))和f(n)=Ω(g(n))f(n) =\Omega(g(n))f(n)=Ω(g(n))都不成立。
總結(jié)
以上是生活随笔為你收集整理的算法设计与分析——算法学基础(三):渐进记号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: NOD32企业版授权文件过期后的应急处理
- 下一篇: 猫眼数据分析过程