[英]How to do recurrence relations?
n因此,一天前我們被告知復發關系,並且我們得到了一些練習代碼:
int pow(int base, int n){
if (n == 0)
return 1;
else if (n == 1)
return base;
else if(n%2 == 0)
return pow(base*base, n/2);
else
return base * pow(base*base, n/2);
}
我要獲得其閉合形式的最遠距離是T(n)= T(n / 2 ^ k)+ 7k。 我不確定該如何走下去,因為提供給我們的示例很簡單,並沒有太大幫助。 您實際上如何解決此代碼的重復關系?
讓我們只計算對pow
的調用中的乘數,表示為M(N)
,前提是它們支配了成本(現今是非常無效的假設)。
通過檢查代碼,我們看到:
M(0) = 0
(對於N = 0,不乘)
M(1) = 0
(對於N = 1不乘)
M(N)
,N> 1,N偶數= M(N/2) + 1
(對於偶數N,一乘后遞歸調用)
M(N)
,N> 1,N奇數= M(N/2) + 2
(對於奇數N,在一個乘法之后遞歸調用,然后進行第二個乘法)。
由於它處理偶數和奇數整數的事實使這種重復變得有些復雜。 我們將通過僅考慮偶數或奇數序列來解決此問題。
讓我們首先處理N
是2的冪的情況。如果迭代公式,則得到M(N) = M(N/2) + 1 = M(N/4) + 2 = M(N/8) + 3 = M(N/16) + 4
。 我們很容易發現模式M(N) = M(N/2^k) + k
,因此解M(2^n) = n
隨之而來。 我們可以寫成M(N) = Lg(N)
(以2為底的對數)。
同樣, N = 2^n-1
在除以2后將始終產生奇數。我們有M(2^n-1) = M(2^(n-1)-1) + 2 = M(2^(n-2)-1) + 4... = 2(n-1)
。 或M(N) = 2 Lg(N+1) - 2
。
一般N
的確切解可以相當復雜,但是我們可以看到Lg(N) <= M(N) <= 2 Lg(N+1) - 2
。 因此M(N)
是O(Log(N))
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.