计算算法

时间:2017-04-22 10:32:04

标签: algorithm time-complexity polynomials

所以这里有一个算法,它应该返回给定多项式的P(x)的多项式值和任何给定的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语句,我感到困惑。我不知道复发关系是什么。

2 个答案:

答案 0 :(得分:3)

观察后可能会有所帮助:我们r = l + 1时,我们会花费 O(logn)时间,我们就完成了。

我的回答需要对Recursion Tree有很好的理解。所以明智地继续。

所以我们的目标是找到:经过多少次迭代我们能够判断出我们有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))))

答案 1 :(得分:-1)

这可能会有所帮助:

{{1}}

其中a和b是常数,而#terms是指多项式中的项数。 可以使用Master's定理或使用递归树方法来解决此递归关系。