什么是嵌套循环的Big-O,其中内循环中的迭代次数由外循环的当前迭代确定?

时间:2008-12-12 06:45:53

标签: big-o nested-loops

以下嵌套循环的Big-O时间复杂度是什么:

for(int i = 0; i < N; i++) 
{
    for(int j = i + 1; j < N; j++)
    {
        System.out.println("i = " + i + " j = " + j);
    }

}

它仍然是 O(N ^ 2)吗?

7 个答案:

答案 0 :(得分:36)

是的,它仍然是O(n ^ 2),它有一个较小的常数因子,但这不会影响O表示法。

答案 1 :(得分:25)

是。回想一下Big-O的定义: O(f(n))按定义说运行时间 T(n) kf(n)对于某些常量 k 。在这种情况下,步数将是(n-1)+(n-2)+ ... + 0 ,其重新排列为0到n-1的总和;这是

T(N)=(N-1)((N-1)+1)/ 2

重新排列,您可以看到 T(n)总是≤1/ 2(n²);根据定义,因此 T(n)= O(n²)

答案 2 :(得分:12)

如果忽略System.out.println,则为N平方。如果你假设它所用的时间在它的输出中是线性的(当然它可能不是),我怀疑你最终得到O((N ^ 2)* log N)。

我提到这一点并不挑剔,但只是要指出你在制定复杂性时不仅需要考虑明显的循环 - 你需要考虑你所称的复杂性。 / p>

答案 3 :(得分:3)

是的,它将是N平方。如果我没有弄错的话,实际的步数是1到N的总和,即.5 *(N - 1)^ 2。 Big O只考虑最高的指数和没有常数,因此,这仍然是N平方。

答案 4 :(得分:3)

如果您的N = 10,则迭代次数为:10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1。 (这是:10次迭代加上9次迭代加上8次迭代......等等。)

现在,您需要找到添加N次的次数(示例中为10):

1:(10),2:(9 + 1),3:(8 + 2),4:(7 + 3),5:(6 + 4)。这是5次......并且有5次迭代。

现在你知道你有五十个+ 5:

10(5)+ 5

就f(n)(或N)而言,我们可以很容易地看出这将是:

f(n)= n(n / 2)+ n / 2 =(n ^ 2)/ 2 + n / 2 =(n ^ 2 + n)/ 2 ......这正是这些的复杂性嵌套循环。

但是,考虑到Big O的渐近行为,我们可以摆脱f(n)的不太重要的值,即单个n和分母。

结果:O(n ^ 2)

答案 5 :(得分:0)

AFAIL,从内部循环开始到外部循环,是计算嵌套循环复杂性的适当方法。 this MSDN

答案 6 :(得分:0)

对于给定程序:

for (int i = 0; i < n; i++)
    for (int j = i; j < n; j++)
        println(...);

考虑n = 3:

i的值为0、1和2。

For i = 0: println will execute 3 times
for i = 1: println will execute 2 times
for i = 2: println will execute 1 times

因此println函数将执行3 + 2 + 1次,即n(n + 1)/ 2次。

因此O(n(n + 1)/ 2)= O(n ^ 2)。