#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 строк простых циклов, которые хорошо работают ..?