【问题标题】:Big O notation and Recursion大 O 表示法和递归
【发布时间】:2013-02-28 18:41:27
【问题描述】:

我在为这 2 个递归函数计算大 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),因为输入数据集每次迭代都会减半?

不过,我对 Big O 表示法非常陌生,非常感谢任何帮助或解释!

【问题讨论】:

    标签: algorithm recursion complexity-theory big-o


    【解决方案1】:

    对于calc

    这个函数在递归过程中被调用的次数永远不会超过 5 次。通过简要分析并用几个值替换n 很容易看出。因此它是O(1)提示:函数将被调用的次数越小n 越多(超过某个阈值)。

    也许有点大胆的说法,但我相信任何带有if (n &gt; max) return const;的函数(假设n是输入/输入大小)必须O(1)(只要让“ constant" 是n &lt;= max 花费的最长时间)。

    对于method

    是的,它是O(log n)

    这个功能其实就是二分查找,知道这个是好事。

    【讨论】:

    • 不是一个大胆的声明——是的。大 O 表示法描述了相对于输入元素的时间。如果任何输入*的时间保持不变,则它是O(1) *(与无穷大相比,0..10 之间的项目微不足道。)
    【解决方案2】:

    杜克林是正确的。第一个是 O(1),第二个是 O(log N)

    但是鉴于这个问题的标题,我认为重要的是要记住递归并不特殊。任何递归函数都可以重写为循环,与标准循环相比,它们没有区别。

    【讨论】: