【问题标题】:Iterative fibonacci complexity, cannot undersant why it is O(n^2)迭代斐波那契复杂度,不能理解为什么它是 O(n^2)
【发布时间】:2014-09-16 11:47:12
【问题描述】:

请不要将此问题与复杂度为 2^n 的递归斐波那契混淆。

这是我使用的斐波那契迭代代码:

def f(n):
    a, b = 0, 1
    for i in range(0, n):
        a, b = b, a + b
    return a

我试图找出复杂性,我得到了 T(n) = n * 4 + 4 = 4n + 4,但我得到的图根本不是线性的,更像是一个 n^2。例如:

print(timerf(250000)/timerf(50000)) 

这给了我 25 左右的结果。

我画了一个图:

这表明斐波那契迭代方法的复杂度应为 n^2。这要怎么解释?

【问题讨论】:

    标签: algorithm time-complexity fibonacci


    【解决方案1】:

    迭代方法复杂度为O(n)*cost_of_addition

    通常人们假设cost_of_addition 是一个常数,但在斐波那契数的情况下,我们很快就会超过这个假设。

    由于F(n) 呈指数增长,因此其中的位数为O(n)。所以得到的复杂度是O(n^2)

    【讨论】:

    • 好吧,现在我明白了,一个新的问题出现了,cost_of_addition,它有某种指数函数,对吗?因为斐波那契数很快变大,但加法成本取决于斐波那契数,而不是 n,你将如何实现加法成本?我的意思是您是否采用斐波那契数的上限(如果存在)并说斐波那契(n)总是小于该函数,那就是复杂性?
    • 编辑,当然它是 n 次方的黄金比例,它是 fibonacci(n) 函数的上限。
    【解决方案2】:

    也许原因是整数的加法不需要常数时间而是线性的 - O(位数)

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 2018-12-13
      • 2011-11-24
      • 1970-01-01
      • 2019-05-15
      • 2012-12-29
      • 2019-03-02
      • 2018-05-31
      • 1970-01-01
      相关资源
      最近更新 更多