我在为这两个递归函数制定Big O表示法时遇到了一些麻烦:
int calc (int n)
{
if (n <= 0)
return 0 ;
else if (n > 10)
return n ;
else
return calc (5 + calc(5n));
}
在上面的例子中,我认为Big O表示法可能是O(n ^ 2),因为数据集中嵌套了迭代?
boolean method (int k ,int [] arr, int i, int j)
{
if (i > j)
return false;
if (arr [(i+j)/2] == k)
return true;
if (arr [(i+j)/2] < k)
return method (k, arr, i, ( (i+j)/2) - 1) ;
else
return method (k, arr, ((i+j)/2)+1, j) ;
}
这里我认为大O表示法可能是O(log N),因为每次迭代输入数据集都减半了?
然而,我对Big O符号非常陌生,任何帮助或解释都会非常感激!
答案 0 :(得分:3)
适用于calc
:
在递归期间,此函数永远不会被调用超过5次。从简短的分析中可以很容易地看到并用n
代替几个值。因此它是O(1)
。 提示:对于较小的n
(超过某个阈值),函数将被调用更多次。
也许有点大胆的陈述,但我相信任何函数(假设n
是输入/输入大小)if (n > max) return const;
必须为{{1} (只需让“常量”为O(1)
)所需的最长时间。
适用于n <= max
:
是的,它是method
。
该功能实际上是二元搜索,这是一件好事。
答案 1 :(得分:0)
Dukeling是对的。第一个是O(1),第二个是O(log N)
但考虑到这个问题的标题,我认为重要的是要记住递归并不特别。任何递归函数都可以重写为循环,在查看它们与标准循环时没有区别。