坚持理解2 for循环

时间:2010-01-06 10:12:09

标签: java perl

我正在使用此网站作为资源 http://www.perlmonks.org/?node_id=573138

我试图理解O符号,它给出了两个为同一元素搜索两个数组的例子。第一个例子和第二个一样有O(n ^ 2),但是第二个例子有一个增强,所以它运行得更快,但仍保持相同的O表示法,我将粘贴下面的代码示例。我想知道的是它们是如何工作的,我的编程知识有限,而且我最熟悉java,我能理解第一个我想的,只有两个用于循环和检查,类似的东西;

for (int i = 0; i < arrarysize ; i++){
    for (int j = 0; j < arraysize; j++){
        if(getElementFromArray(i).equals(getElementFromArray(j))){
            //do something
        }
    }
}

但是第二部作品是如何超越我的,我只是没有得到“增强”

for my $i (0 .. $#array) {
    for my $j (0 .. $#array) {
        next if $j == $i;
        # Compare $i, $j
    }
}

for my $i (0 .. $#array - 1) {
    for my $j ($i + 1 .. $#array) {
        # Compare $i, $j
    }
}

1 个答案:

答案 0 :(得分:6)

根据可能的(i, j)值的矩形来考虑它。第一个循环比较每个对 - 所以它比较(5,0),然后比较(0,5),这显然会产生相反的结果。

第二个循环将该矩形分成两半 - 基本上它只检查它的一个“三角形” - 每个值j > i所以它将检查(0,5)而不是(5,0)。这避免了冗余 - 但这只是意味着它正在检查n*(n-1)/2值而不是n^2值 - 它仍然是O(n^2)

Java中的第二个循环是:

for (int i = 0; i < arraysize - 1; i++) {
    for (int j = i + 1; j < arraysize; j++){
        if(i == j) {
            //do something
        }
    }
}