найти все комбинации из 3 ключей в объекте

#javascript #math

#javascript #математика

Вопрос:

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

Комментарии:

1. Не могли бы вы показать желаемый результат?

2. то, что я опубликовал, уже является желаемым результатом… Я просто хочу знать, есть ли лучший способ

3. нет, вы не опубликовали желаемый результат. вы опубликовали программу, которую мы должны запустить, если хотим увидеть, что она выводит, и мы должны предположить, что ее вывод делает то, что вы хотите, чтобы она делала. Подумайте о том, чтобы избавить нас от хлопот и опубликовать желаемый результат напрямую.

4. вывод слишком длинный для публикации, поэтому я этого не делал, учитывая надлежащую читаемость. также обратите внимание, что этот вопрос очень ясен для типа (найдите nCr в наборе массивов). если кто-то этого не понимает … он, вероятно, не подходит для этой работы.

Ответ №1:

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

Комментарии:

1. действительно, очень умно 🙂 вы преобразовали объект в массив словаря, таким образом, можно использовать обычные for циклы и пропускать элементы

2. будете ли вы настолько королем, чтобы показать пример использования рекурсивного метода?

Ответ №2:

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

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

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

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

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

Комментарии:

1. но это работает отлично. как вы можете использовать что-либо, КРОМЕ for...in цикла для объекта? не имеет смысла.. Мне нужно, чтобы это было быстро, потому что это часть чего-то большого, что будет выполняться много раз

2. Тогда я не понимаю ваш алгоритм.

3. как вы можете не понимать ~ 10 строк простых циклов, которые хорошо работают ..?