为什么此算法在O(n log n)中运行?

时间:2019-09-23 18:49:22

标签: big-o

我们应该“考虑以下算法,该算法对整数数组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)运行时间?

1 个答案:

答案 0 :(得分:0)

考虑以下几点:

for i in [1 . . n] do
    j ← i
    while j ≤ n do
        A[j] ← A[j] + 1
        j ← j + i

每次j都以+i而不是+1递增。这样,第一个while loop被迭代n次,然后被n/2,然后被n/3 ...迭代到n/n

忽略整数舍入,我们可以按以下格式编写: n(1 + 1/2 + 1/3 + ... + 1/n)

似乎我们正在处理一个谐波序列,并乘以nherehere的更多详细信息。这将是O(n log n)