[英]Calculate time complexity of algorithm
因此,這里有一種算法應該返回具有任意給定x的給定多項式的P(x)的多項式值。
A []是系數數組,P []是x數組的冪。
(例如x ^ 2 + 2 * x + 1將具有:A [] = {1,2,1},P [] = {2,1,0})
另外,recPower()= O(logn)
int polynomial(int x, int A[], int P[], int l, int r)
{
if (r - l == 1)
return ( A[l] * recPower(x, P[l]) ) + ( A[r] * recPower (x, P[r]) );
int m = (l + r) / 2;
return polynomial(x, A, P, l, m) + polynomial(x, A, P, m, r);
}
如何計算時間復雜度? 由於if語句,我感到困惑。 我不知道遞歸關系是什么。
進行觀察可能會有所幫助:一旦我們使r = l + 1
,我們就花費O(logn)時間並完成。
我的答案需要對遞歸樹有很好的理解。 因此,明智地進行。
因此,我們的目標是發現: 經過多少次迭代,我們就能知道我們有r = l + 1?
讓我們找出:
專注於return polynomial(x, A, P, l, m) + polynomial(x, A, P, m, r);
讓我們首先考慮左函數polynomial(x, A, P, l, m)
。 要注意的關鍵是l
在所有后續遞歸調用的左函數中保持不變。
左函數是polynomial(x, A, P, l, m)
,右函數是
polynomial(x, A, P, m, r)
對於左函數polynomial(x, A, P, l, m)
,我們有:
第一次迭代
l = l and r = (l + r)/2
第二次迭代
l = l and r = (l + (l + r)/2)/2
意思就是
r = (2l + l + r)/2
第三次迭代
l = l and r = (l + (l + (l + r)/2)/2)/2
意思就是
r = (4l + 2l + l + r)/4
第四次迭代
l = l and r = (l + (l + (l + (l + r)/2)/2)/2)/2
意思就是
r = (8l + 4l + 2l + l + r)/8
這意味着在第n次迭代中,我們有:
r = (l(1 + 2 + 4 + 8 +......2^n-1) + r)/2^n
終止條件為r = l + 1
求解(l(1 + 2 + 4 + 8 +......2^n-1) + r)/2^n = l + 1
,我們得到
2^n = r - l
這意味着n = log(r - l)
。 可能會說在所有后續的左函數調用中,我們忽略了另一個調用,即右函數調用。 原因是這樣的:
因為在正確的函數調用中,我們取平均值,所以l = m
,其中m已經被減小,而r = r
,它甚至更平均,這漸近不會對時間復雜度產生任何影響。
因此,我們的遞歸樹將具有最大深度= log(r-l) 。 的確,並非所有級別都將完全填充,但為簡單起見,我們在漸近分析中假設這一點。 因此,在達到log(r - l)
的深度之后,我們調用函數recPower
,這需要O(logn)時間。 深度log(r - l)
)處的總節點( 假設以上所有級別均已滿 )為2^(log(r - l) - 1)
。 對於單個節點,我們花費O(logn)時間。
因此,總時間= O(logn *(2 ^(log(r-l)-1))) 。
這可能會有所幫助:
T(#terms) = 2T(#terms/2) + a
T(2) = 2logn + b
其中a和b為常數,#項指多項式中的項數。 可以使用Master定理或使用遞歸樹方法來解決此遞歸關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.