найти все комбинации из 3 ключей в объекте - PullRequest
0 голосов
/ 12 июня 2011

Учитывая объект с 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,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);

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

Ваша лучшая ставка, по моему мнению, состоит в том, чтобы перебирать клавиши и затем нажимать на основе этого. Таким образом вы избегаете того, что в основном составляет длинный ряд поисков String - что хорошо для 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 ] ] );
0 голосов
/ 12 июня 2011

Не используйте for .. in .., это медленно и может вызвать проблемы. Просто используйте петлю for.

Почему вы идете только на 3 глубины? В вашем примере у вас есть набор с 4. Я бы ожидал некоторого рекурсивного решения.

Что касается вашего вопроса: это самый эффективный способ?

Если вы действительно ищете наиболее эффективный способ, вы, вероятно, в конечном итоге создадите разные сценарии для каждого браузера (или, точнее, движка JavaScript).

Я бы сосредоточился на работающей реализации, потому что я не думаю, что она делает даже это прямо сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...