2010-01-06 61 views
0

我使用这个网站作为一个资源 http://www.perlmonks.org/?node_id=573138与认识2 for循环

我想了解关于O符号,它给搜索两个数组的相同元素的两个例子。第一个例子的O(n^2)和第二个例子一样,但是第二个例子有一个增强,所以它运行得更快,但仍然保持相同的O符号,我将粘贴下面的代码示例。我想知道的是他们是如何工作的,我掌握的编程知识有限,在java中最舒服,我可以理解第一个我认为的,只有两个for循环和检查,类似;

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

但第二个作品是如何超越我,我只是不明白的“增强”的可能(i, j)值的矩形而言

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 
    } 
} 
+2

如果你的资源是PerlMonks和代码的Perl为什么这个标签的Java“? – pavium 2010-01-06 10:15:56

+1

如何用perl标记这个问题,因为它显然是你正在处理的perl。 – adamse 2010-01-06 10:20:03

+0

现在修复了。 – GaryF 2010-01-06 10:20:20

回答

6

想起来了。第一个循环比较对 - 所以它比较(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 
     } 
    } 
} 
+0

如果在循环中是奇怪的。我希望能够和数组中的值进行比较,而不是索引值 – Toad 2010-01-06 10:20:39

+2

+1,但是'i == j'不能在这种情况下成为正确的测试,总会产生'false'。 .. – hjhill 2010-01-06 10:21:02

+0

啊.....我现在看到....你复制了问题提问者给出的例子。很明显,这也是一个错误。 perl的例子显然是正确的。 – Toad 2010-01-06 10:21:38