大O符号和递归
问题描述:
我有一些麻烦,工作了大O记法这两个递归函数:大O符号和递归
int calc (int n)
{
if (n <= 0)
return 0 ;
else if (n > 10)
return n ;
else
return calc (5 + calc(5n));
}
在上述情况下,我认为大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),因为输入数据集是每次迭代减半?
但是,我对大O符号很陌生,任何帮助或解释都将不胜感激!
答
为calc
:
此功能将永远不会递归过程中被调用的5倍以上。从简要分析中很容易看出,并用n
代替了一些值。因此它是O(1)
。 提示:函数将被调用更多次,更小的n
(超过某个阈值)。
也许有点大胆的声明,但我相信任何功能(假设n
是输入/输入尺寸)与if (n > max) return const;
有是O(1)
(只是让“常数”应采取的n <= max
的最大时间)。
对于method
:
是的,这是O(log n)
。
该函数实际上是二进制搜索,这是一件很好的事情要知道。
答
Dukeling是正确的。第一个是O(1),第二个是O(log N)
但是,考虑到这个问题的标题,我认为重要的是要记住,递归并不是特别的。任何递归函数都可以重写为一个循环,与标准循环相比,它们看起来没什么区别。
不是一个大胆的陈述 - 是真的。大O符号描述相对于输入元素的时间。如果任何输入的时间保持不变,那么它就是'O(1)'*(与无穷大相比,0..10之间的项不重要)。 – Hogan 2013-02-28 19:47:24