我们应该“考虑以下算法,该算法对整数数组A [1。。n]进行操作。”
for i in [1 . . n] do
A[i] ← 0
for i in [1 . . n] do
j ← i
while j ≤ n do
A[j] ← A[j] + 1
j ← j + i
作业要求我们证明该算法在O(n log n)中运行。
很明显,第一个循环将为运行时间添加n,只需将其删除即可。
第二个嵌套循环的运行速度比纯O(n ^ 2)算法快,因为while循环并不总是运行n次。当i = 1时,它将运行n次; i = 2时,它将运行n-1次,一直到i = n时,它将运行一次。
但是,使用与高斯求和相同的方法将1到100之间的整数相加,我们可以看到while循环将平均运行(n + 1)/ 2次。将n乘以for循环,得到(n ^ 2 + n)/ 2,可以简化为O(n ^ 2),而不是O(n log n)
这如何导致O(n log n)运行时间?