《大话数据结构》第2章 算法基础 2.8 函数的渐近增长
2.8 函數(shù)的漸近增長(zhǎng)
????????我們現(xiàn)在來判斷一下,兩個(gè)算法A和B哪個(gè)更好。假設(shè)兩個(gè)算法的輸入規(guī)模都是n,算法A要做2n + 3次操作,你可以理解為先有一個(gè)n次的循環(huán),執(zhí)行完成后,再有一個(gè)n次循環(huán),最后有三次賦值或運(yùn)算,共2n + 3次操作。算法B要做3n + 1次操作。你覺得它們誰更快呢?
??????? 準(zhǔn)確說來,答案是不一定的(如表2-8-1所示)。
??????? 當(dāng)n = 1時(shí),算法A效率不如算法B(次數(shù)比算法B要多一次)。而當(dāng)n = 2時(shí),兩者效率相同;當(dāng)n > 2時(shí),算法A就開始優(yōu)于算法B了,隨著n的增加,算法A要越來越好過算法B了(執(zhí)行的次數(shù)比B要少)。于是我們可以得出結(jié)論,算法A總體上要好過算法B。
??????? 此時(shí)我們給出這樣的定義,輸入規(guī)模n在沒有限制的情況下,只要超過一個(gè)數(shù)值N,這個(gè)函數(shù)就總是大于另一個(gè)函數(shù)。我們稱函數(shù)是漸近增長(zhǎng)的。
??????? 函數(shù)的漸近增長(zhǎng):給定兩個(gè)函數(shù)f(n)和g(n),如果存在一個(gè)整數(shù)N,使得對(duì)于所有的n > N,f(n)總是比g(n)大,那么,我們說f(n)的增長(zhǎng)漸近快于g(n)。
??????? 從中我們發(fā)現(xiàn),隨著n的增大,后面的 +3還是 +1其實(shí)是不影響最終的算法變化的,例如算法A’與算法B’。所以,我們可以忽略這些加法常數(shù)。后面的例子,這樣的常數(shù)被忽略的意義可能會(huì)更加明顯。
??????? 我們來看第二個(gè)例子。算法C是4n + 8,算法D是2n2 + 1(如表2-8-2所示)。
??????? 當(dāng)n < = 3的時(shí)候,算法C要差于算法D(因?yàn)樗惴–次數(shù)比較多),但當(dāng)n > 3后,算法C的優(yōu)勢(shì)就越來越優(yōu)于算法D了,到后來更是遠(yuǎn)遠(yuǎn)勝過。而當(dāng)后面的常數(shù)去掉后,我們發(fā)現(xiàn)其實(shí)結(jié)果沒有發(fā)生改變。甚至我們?cè)儆^察發(fā)現(xiàn),哪怕去掉與n相乘的常數(shù),這樣的結(jié)果也沒發(fā)生改變,算法C’ 的次數(shù)隨著n的增長(zhǎng),還是遠(yuǎn)小于算法D’。也就是說,與最高次項(xiàng)相乘的常數(shù)并不重要。
??????? 我們?cè)賮砜吹谌齻€(gè)例子。算法E是2n2 + 3n + 1,算法F是2n3 + 3n + 1(如表2-8-3所示)。
??????? 當(dāng)n = 1的時(shí)候,算法E與算法F結(jié)果相同,但當(dāng)n > 1后,算法E的優(yōu)勢(shì)就要開始優(yōu)于算法F,隨著n的增大,差異非常明顯。通過觀察發(fā)現(xiàn),最高次項(xiàng)的指數(shù)大的,函數(shù)隨著n的增長(zhǎng),結(jié)果也會(huì)變得增長(zhǎng)特別快。
??????? 我們來看最后一個(gè)例子。算法G是2n2,算法H是3n + 1,算法I是2n2 + 3n + 1(如表2-8-4所示)。
??????? 這組數(shù)據(jù)應(yīng)該就看得很清楚。當(dāng)n的值越來越大時(shí),你會(huì)發(fā)現(xiàn),3n+1已經(jīng)沒法和2n2的結(jié)果相比較,最終幾乎可以忽略不計(jì)。也就是說,隨著n值變得非常大以后,算法G其實(shí)已經(jīng)很趨近于算法I。于是我們可以得到這樣一個(gè)結(jié)論,判斷一個(gè)算法的效率時(shí),函數(shù)中的常數(shù)和其他次要項(xiàng)常常可以忽略,而更應(yīng)該關(guān)注主項(xiàng)(最高階項(xiàng))的階數(shù)。
??????? 判斷一個(gè)算法好不好,我們只通過少量的數(shù)據(jù)是不能做出準(zhǔn)確判斷的。根據(jù)剛才的幾個(gè)樣例,我們發(fā)現(xiàn),如果我們可以對(duì)比這幾個(gè)算法的關(guān)鍵執(zhí)行次數(shù)函數(shù)的漸近增長(zhǎng)性,基本就可以分析出,某個(gè)算法,隨著n的增大,它會(huì)越來越優(yōu)于另一算法,或者越來越差于另一算法。這其實(shí)就是事前估算方法的理論依據(jù),通過算法時(shí)間復(fù)雜度來估算算法時(shí)間效率。
出處:http://www.cnblogs.com/cj723/archive/2011/03/05/1964884.html
總結(jié)
以上是生活随笔為你收集整理的《大话数据结构》第2章 算法基础 2.8 函数的渐近增长的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《大话数据结构》第1章 数据结构绪论 1
- 下一篇: 《大话数据结构》第2章 算法基础 2.9