【问题标题】:Primer Method Big-O Complexity引物方法 Big-O 复杂度
【发布时间】:2020-02-03 21:42:30
【问题描述】:

在考虑调用递归方法的方法的复杂度(引物方法)时,是考虑递归方法的复杂度,还是只考虑方法的调用。

例如,我有一个计算斐波那契数列的小程序:

// Complexity: ???
public int fib() {
    int n = 9;
    return fib(n);
}


// Complexity: O(2^n)
private int fib(int n) {
    if (n <= 1)
        return n;
    return fib(n-1) + fib(n-2);
}

递归fib(int n)方法的复杂度是O(2^n),但我不确定fib()的复杂度是多少。

我的假设是复杂度为 1,因为它所做的只是定义和 int 并返回一个数字。

【问题讨论】:

  • 在这种情况下,它的复杂性与fib(int n) 相同。任何方法的复杂性都不能低于它执行的最复杂的任务——例如,调用O(n^2) 操作的方法本身必须至少为O(n^2)
  • 每个人都错了——它是O(1),因为fib() 不接受任何输入,因此它的运行时间是恒定的。
  • @BrentMB:如果您不提及要放任无穷大的输入参数是什么,那么复杂性分析就毫无意义。您的函数fib() 没有明显的输入。您要计算渐近运行时间的输入是什么?

标签: java recursion big-o code-complexity


【解决方案1】:

我的假设是复杂度为 1,因为它所做的只是定义和 int 并返回一个数字。

事实上,你的“所有它都做......”这是不正确的。 f(9) 的值也正在计算。 (它可以在“编译时”计算,但它仍然在计算。)由于你的论点的前提不是严格正确的......不能得出任何结论。

忽略那个狡辩,你的解释在直觉上是正确的,但从严格的数学角度来看却站不住脚。

更好的解释是选择一些数学变量(比如Q)。然后我们可以说fib() 的时间复杂度是O(1)相对于那个变量

(请注意,n 在此上下文中不是变量,正如 pie 是变量一样。)

或者您可以说fib() 的复杂性分析是没有意义的,除非您确定感兴趣的输入变量。

从数学角度 (IMO) 来看,这两种方式更有意义,O 的公认数学定义假设存在一个变量。 O 复杂度表征了函数相对于该变量的行为。

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多