我需要一些帮助才能理解分析递归算法。我很快就提出了这个算法,并且想知道复杂性是什么:
int FunctionExampple( A1, A2, ... An )
{
product = 1;
if( n == 2)
{
product = multi(A1, A2);
}
else
{
product = multi(A1, FunctionExample( A2, A3, ..., An ) );
}
return product;
}
现在假设函数multi需要O(n ^ 1.59)时间,复杂性会是多少?它会保持为O(n ^ 1.59)还是递归调用会使O(n ^ 1.59 * n)来计算递归调用的数量?谢谢你们。
PS:我刚刚写了这么快,语法和所有这些东西并不重要。
答案 0 :(得分:1)
O(n 1.59 )中的参数'n'测量'multi'参数的大小,而不是参数的数量。因此,关键是“多”输出的大小如何与其输入的大小相关。例如。如果'multi'的结果是其任何参数大小的两倍,那么a,B,C大小为n的调用multi(A,multi(B,C))为O(n 1.59 < / sup> +(2n) 1.59 ),如果你以这种方式将多个调用链接到multi,则会获得指数式增长。另一方面,如果'multi'返回与其输入大小相同的值,则得到O(kn 1.59 )其中k是FunctionExample的参数个数,n是它们的(最大的。)
所以这取决于'多'的行为方式。例如。如果它是有限域内的乘法与乘法会有很大差异,因为后者的结果不会从输入增长,而对于无限整数,结果会增大。