繁体   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