我很困惑这个算法的运行时间是O(n^2)还是O(n^3)。程序如下所示:

int count=0;

for (int i =0; i<n; i++){
    for (int j =i+1; j<n; j++){
        for (int k =j+1; k<n; k++){
            count++;
        }
    }
}

System.out.print("count: " + count);

我用了一个n=7的例子这给了我一个35的结果(计数)。我知道i和j循环的运行时间是高斯和,即1+2+3...n=O(n^2)。我做了一些计算,试图计算出所有3个循环的完整运行时间。
我使用了高斯和公式:java - 3个嵌套循环的运行时间-LMLPHP
我发现,把高斯和相加得到的结果是正确的(从i=2开始直到i=n-1),我得到的公式是:
java - 3个嵌套循环的运行时间-LMLPHP
我怎样才能去掉求和符号,得到一个规则的“公式”?
谢谢你抽出时间!

最佳答案

From Wikipedia,强调我的:
大o表示法是一种数学表示法,用于描述当参数趋向于某一特定值或无穷大时函数的极限行为。
考虑当n接近无穷大时会发生什么:取n-2个元素的总和。当n接近无穷大时,-2将变成一个无用的小项,所以你可以忽略它并乘以n。
(*你并没有完全忽略它,但是存在一个常数k,使得你的外循环/求和将少于kn倍,这意味着它仍然属于O(n))。
根据类似的逻辑,你要求和的表达式属于o(n~2),因为尽管有i,但对于某些常数k,你要求和的项将严格小于kn~2。i可能在2和n-1之间变化,但当n接近无穷大时,这对(n-i)(n-i)+1)/2的趋势没有任何影响;对于某些常数k,它的增长仍然小于k n平方,因此该函数仍为O(n平方)。
因为你取的是o(n)阶的o(n)值的总和,所以你的函数总体上是o(n 3)。

09-30 17:53
查看更多