【发布时间】:2016-09-20 13:52:57
【问题描述】:
我们有数组:
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--------|
我们可以看到有重复的对(在 cmets 中 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
但这需要额外的内存(对于更大的数组,它需要很多......)
有没有其他方法不存储任何额外的东西?
【问题讨论】:
-
简短的回答是......不
-
这些循环是否会达到数百万,因为如果不是,我看不到过早优化的理由。当这确实会导致可衡量的问题时,可能会有一个更有效的过滤器,我不是这方面的专家。即便如此,我怀疑它使用相同的内存,只是在代码中不太明显。
标签: javascript algorithm loops permutation