【问题标题】:Time and space complexity of this Fibonacci solution此斐波那契解的时间和空间复杂度
【发布时间】:2020-08-11 20:59:52
【问题描述】:

我正在阅读这篇关于 fib 解决方案的文章(非常有帮助):https://medium.com/@johanna.fulghum/write-the-fibonacci-sequence-in-every-computational-complexity-9adf5ef12775

但是她上一次解决时间和空间的复杂性有错别字吗?

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) 时间

【问题讨论】:

    标签: time-complexity fibonacci


    【解决方案1】:

    是的,这是一个错字(或编辑错误),空间复杂度也取决于编译器优化是否确实是常量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
    }
    

    我也对This can’t be beat 的说法感到担忧。
    事实上,斐波那契有一个closed form formula,可以使用O(logn)来计算,假设乘法是在恒定时间内完成的。1


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多