时间复杂度:这两个代码是否具有相同的时间复杂度?

时间:2016-08-09 09:21:10

标签: recursion time-complexity

我正在读一本名为破解编码面试的书第6版。关于时间复杂度,有一个递归运行时的示例代码(第44页):

int f(int n) {
 if (n <= 1){
  return 1;
 }
 return f(n - 1) + f(n - 1);
}

我在想如果产生相同数值结果的以下代码具有相同的时间复杂度?我猜不会?

   int f(int n) {
     if (n <= 1){
      return 1;
     }
     return 2 * f(n - 1);
    }

附加:以下是本书中(第一)代码的上下文: enter image description here

1 个答案:

答案 0 :(得分:2)

执行两次函数与将该点的函数值乘以2不同。将函数执行视为正在执行的几条指令。

所以当你这样做时:

 return f(n-1) + f(n-1) //In your definition of f(n)

要计算f(n),需要计算f(n-1)两次。然后计算f(n-1)f(n-2)需要依次计算两次。因此,执行调用以树的形式增长,在每个级别乘以两次。看起来像这样的图形格式:

Multiple recursive calls

但是,在你的第二个定义中:

return 2 * f(n-1) //In your definition of f(n)

要计算f(n),我们只计算f(n-1) 一次,然后我们只将它乘以2,这不会影响程序的整体复杂程度n。请注意,我们没有在任何地方保存f(n-1)f(n-2)的中间值,这就是为什么我说每次都计算它们的原因,否则情况会有所不同。所以在您的情况下,程序进展如下:

Linear recursion

再次尝试并完成您的函数定义,并根据在每次迭代时执行的指令对它们进行可视化。你会在脑海中找到两张相似的照片。

希望它能让你开始朝着正确的方向前进。