Time complexity Fibonacci解的时间和空间复杂性

Time complexity Fibonacci解的时间和空间复杂性,time-complexity,fibonacci,Time Complexity,Fibonacci,我正在阅读这篇关于fib解决方案的文章(非常有用): 但她上一次的解决方案时间和空间复杂度是否存在拼写错误 function fib(n, a = 0, b = 1){ if (n > 0) { return fib(n - 1, b, a + b) } return a } 她说,“这个尾部递归解决方案是恒定的O(n)时间和恒定的O(n)空间复杂性。这是无与伦比的。她指的是O(1),对吗?因为O(n)是线性的。还有,我知道它是O(1)空间,但是有人能解释为什么它是O

我正在阅读这篇关于fib解决方案的文章(非常有用):

但她上一次的解决方案时间和空间复杂度是否存在拼写错误

function fib(n, a = 0, b = 1){
  if (n > 0) {
    return fib(n - 1, b, a + b)
  }
  return a
}
她说,“这个尾部递归解决方案是恒定的O(n)时间和恒定的O(n)空间复杂性。这是无与伦比的。她指的是O(1),对吗?因为O(n)是线性的。还有,我知道它是O(1)空间,但是有人能解释为什么它是O(1)时间吗?对我来说,它似乎是O(n)时间

是的,这是一个打字错误(或编辑错误),空间复杂性也取决于编译器优化是否确实是常数
O(1)

这段代码的复杂度是
Theta(n)
时间,空间复杂度可能是
Theta(n)
Theta(1)
,这取决于编译器是否优化了循环的尾部递归。如果它确实优化了尾部递归,那么代码基本上等同于她的解决方案3

function fibs(n){
  let [a, b] = [0, 1]
  while (n > 0){
    [a, b] = [b, a + b]
    n -= 1
  }
  return a
}
我还对
这是最棒的
的说法表示担忧。

事实上,斐波那契有a,可以使用
O(logn)
计算,假设乘法是在恒定时间内完成的。1


(1) 如果这个假设不成立,而且你实际上也关心算术运算的复杂性,那么答案就复杂了。基本上,这意味着您的复杂性取决于输出的大小,输出的大小也呈指数增长。因为这是指数增长。因为它呈指数增长,所以需要
O(log(result))
位来表示它,然后得到线性时间的下限,因为输出的大小本身在
n
中是线性的