在演算法分析中,當乙個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為乙個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法:
(1)代入法(substitution method)
代入法的基本步驟是先推測遞迴方程的顯式解,然後用數學歸納法來驗證該解是否合理。
(2)迭代法(iteration method)
迭代法的基本步驟是迭代地展開遞迴方程的右端,使之成為乙個非遞迴的和式,然後通過對和式的估計來達到對方程左端即方程的解的估計。
(3)套用公式法(master method)
這個方法針對形如「t(n) = at(n/b) +f(n)」的遞迴方程。這種遞迴方程是分治法的時間複雜性所滿足的遞迴關係,即乙個規模為n的問題被分成規模均為n/b的a個子問題,遞迴地求解這a個子問題,然後通過對這a個子間題的解的綜合,得到原問題的解。
(4)差分方程法(difference formula method)
可以將某些遞迴方程看成差分方程,通過解差分方程的方法來解遞迴方程,然後對解作出漸近階估計。
下面就以上方法給出一些例子說明。
一、代入法
大整數乘法計算時間的遞迴方程為:t(n) = 4t(n/2) + o(n),其中t(1) = o(1),我們猜測乙個解t(n) = o(n2),根據符號o的定義,對n>n0,有t(n) < cn2 - eo(2n)(注意,這裡減去o(2n),因其是低階項,不會影響到n足夠大時的漸近性),把這個解代入遞迴方程,得到:
t(n) = 4t(n/2) + o(n)
≤ 4c(n/2)2 - eo(2n/2)) + o(n)
= cn2 - eo(n) + o(n)
≤ cn2
其中,c為正常數,e取1,上式符合 t(n)≤cn2 的定義,則可認為o(n2)是t(n)的乙個解,再用數學歸納法加以證明。
二、迭代法
某演算法的計算時間為:t(n) = 3t(n/4) + o(n),其中t(1) = o(1),迭代兩次可將右端展開為:
t(n) = 3t(n/4) + o(n)
= o(n) + 3( o(n/4) + 3t(n/42) )
= o(n) + 3( o(n/4) + 3( o(n/42) + 3t(n/43) ) )
從上式可以看出,這是乙個遞迴方程,我們可以寫出迭代i次後的方程:
t(n) = o(n) + 3( o(n/4) + 3( o(n/42) + ... + 3( n/4i + 3t(n/4i+1) ) ) )
當n/4i+1=1時,t(n/4i+1)=1,則
t(n) = n + (3/4) + (32/42)n + ... + (3i/4i)n + (3i+1)t(1)
< 4n + 3i+1
而由n/4i+1=1可知,i4n,從而
3i+1 ≤ 3log4n+1 = 3log3n*log43+1 = 3nlog43
代入得:
t(n) < 4n + 3nlog43,即t(n) = o(n)。
三、套用公式法
這個方法為估計形如:
t(n) = at(n/b) + f(n)
其中,a≥1和b≥1,均為常數,f(n)是乙個確定的正函式。在f(n)的三類情況下,我們有t(n)的漸近估計式:
1.若對於某常數ε>0,有f(n) = o(nlogba-ε),則t(n) = o(nlogba)
2.若f(n) = o(nlogba),則t(n) = o(nlogba*logn)
3.若f(n) = o(nlogba+ε),且對於某常數c>1和所有充分大的正整數n,有af(n/b)≤cf(n),則t(n)=o(f(n))。
設t(n) = 4t(n/2) + n,則a = 4,b = 2,f(n) = n,計算得出nlogba = nlog24 = n2,而f(n) = n = o(n2-ε),此時ε= 1,根據第1種情況,我們得到t(n) = o(n2)。
這裡涉及的三類情況,都是拿f(n)與nlogba作比較,而遞迴方程解的漸近階由這兩個函式中的較大者決定。在第一類情況下,函式nlogba較大,則t(n)=o(nlogba);在第三類情況下,函式f(n)較大,則t(n)=o(f (n));在第二類情況下,兩個函式一樣大,則t(n)=o(nlogba*logn),即以n的對數作為因子乘上f(n)與t(n)的同階。
但上述三類情況並沒有覆蓋所有可能的f(n)。在第一類情況和第二類情況之間有乙個間隙:f(n)小於但不是多項式地小於nlogba,第二類與第三類之間也存在這種情況,此時公式法不適用。
在一秒內機器能解決最大規模n
運算量n!
2的n次冪
n的三次方
n的平方
nlog2(n)
n最大規模
1126
46410000
4.5*10e6
100000000
速度擴大兩倍後
1127
58414142
8.6*10e6
200000000
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析(上)時間複雜度 空間複雜度
為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...