为什么下面的算法将时间复杂度计算为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)
答案 0 :(得分:1)
如果您假设将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]
与(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的本节,内容为
这里一定要小心;例如,某些分析将 两个数字相加为一步。这个假设可能不是 在某些情况下是必要的。例如,如果涉及的数字 计算可能会非常大,单个人所需的时间 加法不再被认为是恒定的。
顺便说一句,在您的问题中使用的方法(写出每行的最大复杂度然后乘以嵌套的行)不是计算紧密复杂度的有效方法,尽管它适用于所有复杂度都是多项式的情况,在这种情况下是。