Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 计算算法的时间复杂度_Algorithm_Time Complexity_Polynomials - Fatal编程技术网

Algorithm 计算算法的时间复杂度

Algorithm 计算算法的时间复杂度,algorithm,time-complexity,polynomials,Algorithm,Time Complexity,Polynomials,这里有一个算法,它应该返回给定多项式的p(x)的多项式值 A[]是系数数组,p[]是x数组的幂 (例如,x^2+2*x+1将有:A[]={1,2,1},p[]={2,1,0}) 另外,recPower()=O(logn) 我如何计算这个时间复杂度?我对if的声明感到困惑。我不知道递归关系是什么。这可能会有帮助: T(#terms) = 2T(#terms/2) + a T(2) = 2logn + b 其中a和b为常数,#项指多项式中的项数。 这个递归关系可以用马斯特定理或递归树方法来解决。以

这里有一个算法,它应该返回给定多项式的p(x)的多项式值

A[]是系数数组,p[]是x数组的幂

(例如,x^2+2*x+1将有:A[]={1,2,1},p[]={2,1,0})

另外,recPower()=O(logn)

我如何计算这个时间复杂度?我对if的声明感到困惑。我不知道递归关系是什么。

这可能会有帮助:

T(#terms) = 2T(#terms/2) + a
T(2) = 2logn + b
其中a和b为常数,#项指多项式中的项数。
这个递归关系可以用马斯特定理或递归树方法来解决。

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

我的回答需要对这些问题有很好的理解。因此,明智地行事

因此,我们的目标是找到:经过多少次迭代之后,我们能够判断r=l+1吗?

让我们了解一下:

聚焦于
返回多项式(x,A,p,l,m)+多项式(x,A,p,m,r)

让我们先考虑左函数<代码>多项式(x,a,p,l,m)< /c>。需要注意的关键是,

l
,在所有后续递归调用的左函数中保持不变

左函数是指多项式(x,A,p,l,m)
,右函数是指

多项式(x,A,p,m,r)

对于左函数
多项式(x,A,p,l,m)
,我们有:

第一次迭代

l = l and r = (l + r)/2
l = l and r = (l + (l + r)/2)/2
l = l and r = (l + (l + (l + r)/2)/2)/2
l = l and r = (l + (l + (l + (l + r)/2)/2)/2)/2
第二次迭代

l = l and r = (l + r)/2
l = l and r = (l + (l + r)/2)/2
l = l and r = (l + (l + (l + r)/2)/2)/2
l = l and r = (l + (l + (l + (l + r)/2)/2)/2)/2
也就是说

r = (2l + l + r)/2
r = (4l + 2l + l + r)/4
r = (8l + 4l + 2l + l + r)/8
第三次迭代

l = l and r = (l + r)/2
l = l and r = (l + (l + r)/2)/2
l = l and r = (l + (l + (l + r)/2)/2)/2
l = l and r = (l + (l + (l + (l + r)/2)/2)/2)/2
也就是说

r = (2l + l + r)/2
r = (4l + 2l + l + r)/4
r = (8l + 4l + 2l + l + r)/8
第四次迭代

l = l and r = (l + r)/2
l = l and r = (l + (l + r)/2)/2
l = l and r = (l + (l + (l + r)/2)/2)/2
l = l and r = (l + (l + (l + (l + r)/2)/2)/2)/2
也就是说

r = (2l + l + r)/2
r = (4l + 2l + l + r)/4
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)
is
2^(log(r-l)-1)
处的节点总数(假设上述所有级别都已满)。对于单个节点,我们需要O(logn)时间


因此我们有总时间=O(logn*(2^(log(r-l)-1))

如果recPower是O(1),那么多项式就是O(n)。现在,随着recPower的logn的增加,我被卡住了,我明白了必须分别用T(2)来做一些事情。这可以通过更换来解决吗?需要详细说明吗?请随时查询。在计算时间复杂度之前,您确定代码是正确的吗?在我看来,这是错误的,
r
是包含的还是独占的?底部的递归调用表明它是独占的(因为否则
m
会出现在递归的左半部分和右半部分),但基本情况表明它是包含的(因为否则
A[r]
是一个错误)。它的目的似乎是计算i=0…n-1的
sum(A[i]*recPower(x,P[i])
其中
A
P
数组的长度均为
n
。对于这项任务,“分而治之”没有什么好处(至少在你做这项任务的方式上是这样的)——它只会增加工作量,并会影响效率。如果代码是正确的,你可以忽略递归,只需观察总工作量是
sum(log(P[i]),对于i=0..n-1)+Theta(n)
。假设
P
是递减的,并且您对上限没有问题,您可以将其简化为O(n*log(P[0])+n)。还有一个注释:您说“recPower()是O(logn)”,但您的确切意思是什么?我假设你的意思是“recPower(x,n)是O(logn)”,但有些答案假设你对任何I都是指“recPower(x,I)是O(logn)”。如果第二个意思是正确的,那么n是什么?