请简单解释一下为什么这个代码片段有O(n^4)的复杂度?

Please explain in simple terms why this code fragment has O(n^4) complexity?

评估以下代码片段的Big-Oh:

sum = 0
for( i = 1; i < n; ++i )
    for( j = 1; j < i * i; ++j )
        if( j % i == 0 )
            for( k = 0; k < j; ++k )
                ++sum

这是我的算法教科书中的作业问题class。教科书上的答案是O(n^4)。我试过很多方法来解决这个问题,但我总是得到 O(n^5)

我正在使用求和法并从最内层的嵌套循环向外进行数学计算。这里没有显示求和,因为我不知道如何在这个space中表达我的数学,但请按照我下面的工作。

这是我最内层循环的逻辑:

for( k = 0; k < j; ++k )

我的想法是内部循环进行 j+1 次迭代,它可以和 i*i 一样大,它本身可以和 n 一样大,所以这个循环作为一个O(n^2) 的上限。

这是我对中间循环的逻辑:

for( j = 1; j < i * i; ++j )

j 迭代高达 i^2 次,其本身可以高达 n,因此此循环的上限为 O(n^2)

这是我的外循环逻辑:

for( i = 1; i < n; ++i )

i 迭代高达 n 次,因此循环的上限为 O(n).

O(n * n^2 * n^2) = O(n^5)

同样,答案是 O(n^4)。请帮助我,使用数学循环来帮助您回答。请使用简单的语言。我对算法分析还是个新手。

诀窍就在这一行:

if( j % i == 0 )

这样做是为了确保内部循环仅在 ji 的整数倍时执行;否则没有工作完成。

所以您可以想到的一种快捷方式是说这是 O(n * n^2 / n * n^2) = O(n^4)

您可以考虑的另一种方式是,这相当于写作:

sum = 0
for( i = 1; i < n; ++i )
    for( j = 1; j < i * i; j += i )
        for( k = 0; k < j; ++k )
            ++sum

这是O(N^4)通过检查。