Algorithm 为什么Fibonacci循环的时间复杂度是O(n^2)而不是O(n)?

Algorithm 为什么Fibonacci循环的时间复杂度是O(n^2)而不是O(n)?,algorithm,time-complexity,fibonacci,Algorithm,Time Complexity,Fibonacci,为什么对于下面的算法,时间复杂度计算为O(n^2)而不是O(n) FibList(n) array[0-n] Create Array O(n) F[0] <- 0 O(1) F[1] <- 1 O(1) for i from 2 to n O(n) F[i] <- F[i-

为什么对于下面的算法,时间复杂度计算为O(n^2)而不是O(n)

FibList(n)
    array[0-n] Create Array            O(n)
    F[0] <- 0                          O(1)
    F[1] <- 1                          O(1)

    for i from 2 to n                  O(n)
        F[i] <- F[i-1] + F[i-2]        O(n) 

    return F[n]                        O(1)
FibList(n)
数组[0-n]创建数组O(n)

F[0]如果您假设将一个具有
k1
位的整数与一个具有
k2
位的整数相加的成本与max成正比(
k1
k2
)(这就是所谓的“位”成本模型或“对数”成本模型),那么您生成的代码的时间复杂度是O(n^2)

这是因为F(i)几乎与phi^i成正比,其中phi是黄金比例。这意味着F(i)有~i位

因此,成本:

for i from 2 to n
    F[i] <- F[i-1] + F[i-2]
从2到n的i的


F[i]
F[i]现在创建一个大小为n的数组也是O(1)。@Adam这是一个假设。在一个不同的假设下,即F[i-1]+F[i-2]消耗O(log_2(max(F[i-1],F[i-2]))(也就是说,消耗取决于比特数),得到O(n^2)。请看我的答案。循环迭代次数和位数彼此不相关。所以你永远不会得到
n^2
。也许是m*n。查找max无论如何都是O(1),因为int位数很可能是4个字节。@TonyTannous F[i]有~i位,而i是循环计数器,因此它们在本例中是相关的。可能i位超出了使用中的(int)位的大小。我不知道任何需要I位而不是sizeof(int)的运算。@TonyTannous添加两个bignum如何?如果我错了,请纠正我,添加任何两个数字都需要sizeof(type)。