大話資料結構 2 8 函式的漸近增長

2021-08-27 18:12:13 字數 1364 閱讀 6395

我們先來做乙個測試,判斷以下兩個演算法a和b哪個更好?

假設兩個演算法的輸入規模都是n,演算法a要做2n+3次操作,

你可以這麼理解:  

先執行n次的迴圈,  執行完成後再有乙個n次的迴圈,最後有3次運算。

演算法b要做3n+1次操作,理解上,你覺得它們哪乙個更快些呢?

當n=1時,演算法a1效率不如演算法b1,  

當n=2時,兩者效率相同;  

當n>2時,演算法a1就開始優於演算法b1了,隨著n的繼續增加,演算法a1比演算法b1逐步拉大差距。

所以總體上演算法a1比演算法b1優秀a

總結:給定兩個函式f(n)和g(n),如果存在乙個整數n,使得對於所有的n>n, f(n)總是比g(n)大,那麼,我們說f(n)的增長漸近快於g(n)。

從剛才的對比中我們還發現,隨著n的增大,後面的+3和+1其實是不影響最終的演算法變化曲線的。

例如演算法a2,b2 ,  在圖中他們壓根兒被覆蓋了。所以,我們可以忽略這些加法常數。

第二個測試,演算法c是4n+8,演算法d是2n^2+1。

我們觀察發現,哪怕去掉與n相乘的常數,兩者的結果還是沒有改變,演算法c2的次數隨著n的增長,還是遠小於演算法d2。

也就是說,與最高次項相乘的常數並不重要,也可以忽略。

我們再來看第三個測試,演算法e是2n^2+3n+1,演算法f是2n^3+3n+1。

我們進行最後乙個小測試

演算法g是2n^2,演算法h是3n+1, 演算法i是2n^2+3n+1。

這組資料我們看得很清楚,當n的值變得非常大的時候,  3n+1已經沒法和2n^2的結果相比較,最終幾乎可以忽略不計。

而演算法g在跟演算法工基本已經重合了。

於是我們可以得到這樣乙個結論,判斷乙個演算法的效率時,函式中的常數和其他次要項常常可以忽略,而更應該關注主項(最高項)的階數。

注意,判斷乙個演算法好不好,我們只通過少量的資料是不能做出準確判斷的,很容易以偏概全。

《大話資料結構》

函式的漸進增長 我們現在來判斷一下,兩個演算法a和b哪個更好。假設兩個演算法的輸入規模都是n,演算法a要做2n 3次操作,你可以理解為先有乙個n次的迴圈,執行完成後,再有乙個n次迴圈,最後有三次賦值或運算,共2n 3次操作。演算法b要做3n 1次操作,你覺得它們誰更快呢 準確來說,答案是不一定的 當...

《大話資料結構》

常見的時間複雜度 常見的時間複雜度如下圖所示 常用的時間複雜度所耗費的時間從小到大依次是 o 1 o logn o n o nlogn o n o n 三次方 o 2 n次方 o n!o n n次方 我們前面已經談到了 o 1 常數階 o logn 對數階 o n 線性階 o n 平方階等,至於o ...

《大話資料結構》

線性表 線性表,從某種就能感覺到,是具有像線一樣的性質的表。在廣場上,有很多人分散在各處,當中有些是小朋友,可也有很多大人,甚至還有不少寵物,這些小朋友的資料對整個廣場人群來說,不能算是線性表的結果。但像剛才提到的那樣,乙個班級的小朋友,乙個跟著乙個排著隊,有乙個打頭,有乙個收尾,當中的小朋友,每乙...