为什么使用for循环的斐波那契时间复杂度是O(n ^ 2)而不是O(n)?

时间:2018-07-05 07:32:35

标签: 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-1] + F[i-2]        O(n) 

    return F[n]                        O(1)

O(n)+ O(1)+ O(1)+ O(n)O(n)+ O(1)= O(n ^ 2)

1 个答案:

答案 0 :(得分:1)

如果您假设将k1位的整数与k2位的整数相加的成本与max(k1k2)成正比(因此(称为“位”成本模型或“对数”成本模型),那么您生成的代码的时间复杂度为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]

与(1 + 2 + 3 + ... n-1)成正比(n(n-1)/ 2),因此与O(n ^ 2)成正比。

如果假定任意大小的整数相加为O(1),则代码为O(n)。

有关费用模型的背景信息,请参见维基百科https://en.wikipedia.org/wiki/Analysis_of_algorithms#Cost_models的本节,内容为

  

这里一定要小心;例如,某些分析将   两个数字相加为一步。这个假设可能不是   在某些情况下是必要的。例如,如果涉及的数字   计算可能会非常大,单个人所需的时间   加法不再被认为是恒定的。

顺便说一句,在您的问题中使用的方法(写出每行的最大复杂度然后乘以嵌套的行)不是计算紧密复杂度的有效方法,尽管它适用于所有复杂度都是多项式的情况,在这种情况下是。