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