在嵌套的for循环中,使用j = i + 1 vs j = 1?

时间:2016-11-30 20:39:34

标签: algorithm pseudocode

我很难写出这个问题。所以我将用一个例子来说明。

假设我有以下数组:A = {5,8,1,3,2,6},其大小为n = 6,索引为A [0 ... 5]。

我希望运行某种扫描,以便在从左到右遍历中将每个值与其相邻的值进行比较。以下2个运行嵌套for循环的代码片段有什么区别?

// snippet 1, using i to take the first and j to take whatever is next to i.
for i <- 0 to n-2 do
    for j <- i+1 to n-1 do
       // do the scanning, comparing, etc.... 


//snippet 2 using i to take the first and j to take the second. 
for i <- 0 to n-2 do
        for j <- 1 to n-1 do
           // do the scanning, comparing, etc.... 

我认为它们完全相同,并且在我所做的笔/纸测试中找不到任何差异。有吗?

3 个答案:

答案 0 :(得分:3)

在第一个中,ji的下一个值开始计算。

示例:i = 1, j = 2 | i = 2, j = 3等。

在第二个中,无论i的值如何,您都将从1开始计算。换句话说,变量i对变量j没有影响。

两者都有它们的用途,但这一切都取决于你如何使用它们来获取数组元素。

答案 1 :(得分:2)

好的,让我们来看看n = 3

的跑步
// snippet 1, using i to take the first and j to take whatever is next to i.
for i <- 0 to n-2 do
    for j <- i+1 to n-1 do
       // do the scanning, comparing, etc.... 

第一次迭代(最外层循环):

i = 0j = 1

i = 0j = 2

第二次迭代:

i = 1j = 2

完成!

//snippet 2 using i to take the first and j to take the second. 
for i <- 0 to n-2 do
        for j <- 1 to n-1 do
           // do the scanning, comparing, etc.... 

第一次迭代:

i = 0j = 1

i = 0j = 2

第二次迭代:

i = 1j = 1

i = 1j = 2

请注意代码段2的第二次迭代的区别?

答案 2 :(得分:1)

两者都构建了数组元素对。定义不同对是有两种不同的想法:

1)只有当它包含不同的元素时,它才是唯一的。 (A[i], A[j]) == (A[j], A[i])

2)如果元素的顺序不同,则对是唯一的。 (A[i], A[j]) <> (A[j], A[i])

此外,代码段2还将(A[i], A[i])视为一对(i == j时),不包括(A[0], A[0])(A[n - 1], A[n - 1])