两个嵌套的/循环没有重复的对

时间:2016-09-20 13:52:58

标签: javascript algorithm loops permutation

我们有阵列:

var arr = [0,1,2];

和循环:

for ( var i=0; i<arr.length; i++ ) {
    for ( var j=0; j<arr.length; j++ ) {
        if ( arr[i] == arr[j] ) continue;
        console.log(arr[i], arr[j]);
    }
}

并输出:

0,1 //a--|
0,2 //b--|--|
1,0 //a--|  |
1,2 //c-----|--|
2,0 //b-----|  |
2,1 //c--------|

我们可以看到有重复的对(在注释a,b和c中出现两次)

我们摆脱重复对的唯一方法是在某种记忆中存储已经“匹配”的对吗?

var mem = {};

for ( var i=0; i<arr.length; i++ ) {
    for ( var j=0; j<arr.length; j++ ) {
        var left = i;
        var right = j;
        if ( left > right ) {
            var temp = right;
            right = left;
            left = temp;
        }

        if ( arr[i] == arr[j] || mem[arr[left]+","+arr[right]] ) continue;

        console.log(arr[i], arr[j]);
        mem[arr[left]+","+arr[right]] = true;
    }
}

并输出:

0,1
0,2
1,2

但这需要额外的内存(对于更大的数组,它需要很多...)

有没有其他方法可以不存储任何其他内容?

3 个答案:

答案 0 :(得分:6)

如果您的输入数组是唯一的,为什么不从i + 1

开始你的j
for ( var i=0; i<arr.length; i++ ) {
    for ( var j= i + 1 ; j<arr.length; j++ ) {
        console.log(arr[i], arr[j]);
    }
}

答案 1 :(得分:1)

一种可能的算法如下:

  1. 对数组进行排序。

  2. 为数据中的每个值x删除数组中的重复值(保留1),输出(x,x)

  3. 对于每对索引iji < j,输出相应的对(i,j)

  4. 虽然这可能不会产生排序输出,但它会处理重复值和未排序的输入数组。

答案 2 :(得分:1)

for ( var i=0; i<arr.length; i++ ) {
    for ( var j=0; j<arr.length; j++ ) {
        if ( arr[i] == arr[j] || j<i) continue;
        console.log(arr[i], arr[j]);
    }
}

这应该有用。

说明: 如果j小于i,则可以切换i和j以获得具有相同两个值的另一个输出。但是如果你在数组中保持j“领先”,那么就不会输出重复数据。

它看起来如何:

o =数组值

X = ARR [I]

| = ARR [j]的

- = arr [i]和arr [j]都在这个地方

-oooo //继续

X | OOO

XO | oo的

白叶枯病| O xooo |

然后,没有改变:

| xooo //已输出!与行(/步骤)2相同!

o-ooo //继续

牛| oo的

随着变化: | xooo // j在i之前,所以不要输出。避免重复行(/步骤)2。

o-ooo //继续

牛| oo的