我问这个问题是因为我对大O表示法的一个方面感到困惑。
我正在使用Frank Carrano的《Java的数据结构和抽象》一书。在“算法效率”一章中,他显示了以下算法:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
他最初将这种算法描述为具有(n 2 + n) / 2的增长率。哪个看似直观。
但是,可以说,当n大时,(n 2 + n) / 2的行为类似于n 2。在同一段他说(N 2 + N) / 2也表现很像ñ 2 / 2。他使用此算法将上述算法分类为O(n 2)。
我得到的(N 2 + N) / 2 类似于ň 2 / 2,因为从百分比上看,ñ差别不大。我不明白的是为什么当n大时(n 2 + n) / 2和n 2相似。
例如,如果n = 1,000,000:
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
最后一个根本不相似。实际上,很明显,它是中间值的两倍。那么,弗兰克·卡拉诺怎么能说他们相似呢?另外,该算法如何分类为O(n 2)。看着那个内循环,我会说是n 2 + n / 2
n
随着函数的增长,函数'n ^ 2'和您的函数的行为类似,它们的增长率始终保持差异。如果您具有复杂的表达式,则增长更快的功能将占主导。