问题描述
|
给定一个具有n个键的对象,需要查找每3个键的所有组合(数学上为nC3)
这是最有效的方法吗?
var x = {}; // object
x[\'00\'] = [1,7,9];
x[\'01\'] = [1,9];
x[\'02\'] = [6,8];
x[\'03\'] = [1,7];
x[\'04\'] = [1,5,8];
x[\'05\'] = [4,6,8,9];
var triples = [],c = [0,0]; // counter. keep track of the indexes when looping over objects
for(var i in x){
c[0]++;
c[1] = 0;
for(var j in x){ // loop to compare this x[i] array to all other arrays
c[1]++;
if( c[1] < c[0]+1 ) continue;
c[2] = 0;
for(var k in x){
c[2]++;
if( c[2] < c[1]+1 ) continue;
triples.push( [i,j,k] );
}
}
}
console.dir(triples);
解决方法
我猜,最好的选择是遍历各个键,然后根据这些键进行推送。这样一来,您就可以避免基本上需要进行一连串的字符串查找的过程-JS通常擅长此操作,但是却不如简单的数字迭代快。
就像这样:
var keys = []
for( var it in x ) keys.push(it);
var triples = []
var len = keys.length; //cache the value.
for( var i = 0; i < len; i++ )
for( var j = i + 1; j < len; j++ )
for( var k = j + 1; k < len; k++ )
triples.push( [ keys[ i ],keys[ j ],keys[ k ] ] );
, 不要使用for .. in ..
,它会很慢并且会带来问题。只需使用for
循环即可。
你为什么只深入三层?在您的示例中,您有一个包含4的集合。我希望有一些递归解决方案。
至于您的问题:这是最有效的方法吗?
如果您确实在寻找最有效的方法,则可能会为每个浏览器使用不同的脚本(或更确切地说是JavaScript引擎)。
我将重点放在有效的实现上,因为我认为它甚至现在都没有这样做。