所以这里有一个算法,它应该返回给定多项式的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语句,我感到困惑。我不知道复发关系是什么。
答案 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定理或使用递归树方法来解决此递归关系。