Java 3个嵌套循环的运行时间

Java 3个嵌套循环的运行时间,java,algorithm,Java,Algorithm,我很困惑这个算法的运行时间是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); int count=0; 对于(in

我很困惑这个算法的运行时间是
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);
int count=0;

对于(int i=0;iBig Omega是一个下界,因此说明您的算法有一个Ω(n2)就足够了,因为i、j和k都运行到某个n值的下界。

Big Omega是一个下界,所以说明您的算法有一个Ω(n2)考虑到i、j和k都与n的某个值绑定,这就足够了。

,重点是:

大O表示法是一种数学表示法,它描述了当参数趋向某个特定值或无穷大时函数的限制行为

考虑当n接近无穷大时会发生什么:你将取n-2个元素的总和。当n接近无穷大时,-2将成为一个无用的小项,因此你可以忽略它并乘以n

(*您没有正确地忽略它,但是存在一个常数k,这样您的外循环/求和将运行少于kn次,这意味着它仍然属于O(n)。)

根据类似的逻辑,你求和的表达式属于O(n²),因为尽管有i,你求和的项对于k的某个常量值将严格小于kn²。i可能在2和n-1之间变化,但这对(n-i)((n-i)+1)的方式没有任何影响/2随着n接近无穷大而变化;对于k的某个常量值,其增长仍小于kn²,因此函数仍为O(n²)

因为你要求O(n²)阶的O(n)值的总和,所以你的函数总体上是O(n³)。

,我的重点是:

大O表示法是一种数学表示法,它描述了当参数趋向某个特定值或无穷大时函数的限制行为

考虑当n接近无穷大时会发生什么:你将取n-2个元素的总和。当n接近无穷大时,-2将成为一个无用的小项,因此你可以忽略它并乘以n

(*您没有正确地忽略它,但是存在一个常数k,这样您的外循环/求和将运行少于kn次,这意味着它仍然属于O(n)。)

根据类似的逻辑,你求和的表达式属于O(n²),因为尽管有i,你求和的项对于k的某个常量值将严格小于kn²。i可能在2和n-1之间变化,但这对(n-i)((n-i)+1)的方式没有任何影响/2随着n接近无穷大而变化;对于k的某个常量值,其增长仍小于kn²,因此函数仍为O(n²)


因为你对O(n²)阶的O(n)值求和,所以你的函数总体上是O(n³)。

虽然杰夫·鲍曼的答案是正确的,但我觉得能够得出准确的公式很有趣,也很有用。你最后得到的公式是正确的,但你提到你想“去掉求和符号”,有效简化了公式。
在下文中,
sum{i=a}^{b}[y(i)]
表示
i
a
b
y(i)
之和
从你的公式开始:

count = sum_{i=2}^{n-1}[(n-i)*(n-i+1) / 2]
2*count = sum_{i=2}^{n-1}[(n-i)*(n-i+1)]
2*count = sum_{i=2}^{n-1}[(n-i)^2 + (n-i)]
2*count = sum_{i=2}^{n-1}[(n-i)^2] + sum_{i=2}^{n-1}[(n-i)]
2*count = sum_{i=1}^{n-2}[i^2] + sum_{i=1}^{n-2}[i]
2*count = (n-2)(n-1)(2*(n-2)+1)/6 + (n-2)(n-1)/2
12*count = (n-2)(n-1)(2*n-4+1) + (n-2)(n-1)*3
count = (n-2)(n-1)(2*n)/12
count = (n-2)(n-1)(n)/6

你可以清楚地看到,
count
O(n^3)
中,而不是在
O(n^2)
虽然杰夫·鲍曼的答案是正确的,但我觉得能够想出准确的公式很有趣,也很有用。你最后得到的公式是正确的,但你提到你想“去掉求和符号”,有效简化了公式。
在下文中,
sum{i=a}^{b}[y(i)]
表示
i
a
b
y(i)
之和
从你的公式开始:

count = sum_{i=2}^{n-1}[(n-i)*(n-i+1) / 2]
2*count = sum_{i=2}^{n-1}[(n-i)*(n-i+1)]
2*count = sum_{i=2}^{n-1}[(n-i)^2 + (n-i)]
2*count = sum_{i=2}^{n-1}[(n-i)^2] + sum_{i=2}^{n-1}[(n-i)]
2*count = sum_{i=1}^{n-2}[i^2] + sum_{i=1}^{n-2}[i]
2*count = (n-2)(n-1)(2*(n-2)+1)/6 + (n-2)(n-1)/2
12*count = (n-2)(n-1)(2*n-4+1) + (n-2)(n-1)*3
count = (n-2)(n-1)(2*n)/12
count = (n-2)(n-1)(n)/6

您可以清楚地看到
count
位于
O(n^3)
中,但不在
O(n^2)中

很有意义,谢谢!进一步思考让我想知道如何去掉求和符号。你能帮我吗?你从来都不需要用大的欧米茄符号。事实上不是这样,对此我很抱歉。我有点困惑。有意义,谢谢!进一步思考让我想知道如何去掉求和符号gn.你能帮我吗?你从来都不需要用大的欧米茄符号。事实上不是这样,很抱歉。我有点困惑。它是O(N^3)。你明白为什么吗?我很乐意写一个答案…你可以简单地分析不同N的代码。我知道它可以是O(N^3),但我想知道-不是O(N^2)同样正确吗?谢谢!@selbie^^你能解释一下它是否可以是O(N^2)?:-)它是O(N^3)。你明白为什么吗?我很乐意写一个答案…你可以简单地为不同的n配置代码。我看到它可以是O(n^3),但我想知道-O(n^2)也正确吗?谢谢大家!@你能解释一下它是否可以是O(N^2)吗?:-)啊,有道理!非常感谢你!我确实花了很多时间来理解这一点,这澄清了这一点。啊,这是有道理的!非常感谢你!我确实花了很多时间来理解这一点,这就把它弄清楚了尼斯,是的,这就是我想要的:-)但是我有一个问题:你如何得到“12*计数”?当你把总和去掉的时候会发生,但我真的不明白你怎么会得到12?谢谢你的回答<代码>2*a=b/6+c/2
->
12*a=b+c*3
。每边乘以6。很好,是的,这就是我想要的:-)我有一个问题:你怎么得到“12*计数”?当你把总和去掉的时候会发生,但我真的不明白你怎么会得到12?谢谢你的回答<代码>2*a=b/6+c/2->
12*a=b+c*3
。每边乘以6。