簡體   English   中英

計算算法的時間復雜度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM