【问题标题】:Recurrence for Indicator Function指标函数的重现
【发布时间】:2013-02-11 01:22:40
【问题描述】:

假设你有一个递归函数,其中:

我知道第一个 if 语句的递归关系是 O(n),而 else 条件的递归关系是 O(logn)。然而,我对计算整个函数的复杂性感到困惑。因为 n 支配 log(n),所以整体复杂度是否只是 O(n)?

【问题讨论】:

  • 仅供参考 log(n) 与 lg(n) 不同。 log 以 10 为底,而 lg 以 2 为底。当您递归调用 foo(x/2) 时,您实际上是在做 lg(n)

标签: complexity-theory big-o


【解决方案1】:

根据定义,大 O 是上限,所以它是 O(n)(因为 O(n) 大于 O(lg(n))。 阅读一些关于大 O 和大 theta 的内容 Big-oh vs big-theta

编辑:

假设代码如下所示:

foo(x,y)
{
 if(y<0):
  //call some other function, or throw an error, otherwise we're stuck in an infinite loop
 else if(y==0):
   return 1
 else if(y%2!=0):
   return x*foo(x,y-1)
 else:
   return foo(x,y/2)*foo(x,y/2)
}

这里,大 O 是 O(n),但从技术上讲,它也是 O(n^2)、O(n^3) 等。这是因为大 O 是一个上限。

Big Theta(紧界)是 Theta(n)。

注意,仅仅因为你可以通过除以 y/2 来减少 y,你并没有减少对 foo 的调用,因为你做了两倍的调用:foo*foo。由于您将函数调用加倍,因此您不会获得 Theta(lg(n)) 的性能。

【讨论】:

  • 我将如何用 theta 表示法表达这一点?它只是 theta(n) 吗?
  • 如果您修复代码,我会帮助您解决这个问题。首先你有 foo(x,y) *注意它需要 2 个变量。然后你调用 foo(x-1) 或 foo(x/2) *注意你只发送一个变量。其次,您的代码可能会导致无限循环,因为 y 永远不会改变。我假设 y 是一个错字,函数应该只是 foo(x),第一个条件应该是 if(x==0)... 如果是这种情况,你的代码仍然有问题是无限的,假设 x 开始为负数。
【解决方案2】:

我相信您可以将其分解为 O(n) 是最坏的情况,O(logn) 是最好的情况。

只是给出一些想法,这绝不是一个完整的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2017-03-06
    • 2015-07-01
    相关资源
    最近更新 更多