大O符号和递归

时间:2013-02-28 18:41:28

标签: algorithm recursion complexity-theory big-o

我在为这两个递归函数制定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符号非常陌生,任何帮助或解释都会非常感激!

2 个答案:

答案 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)

但考虑到这个问题的标题,我认为重要的是要记住递归并不特别。任何递归函数都可以重写为循环,在查看它们与标准循环时没有区别。