Учитывая 2 массива и оба имеют одинаковое количество элементов, построить все хешированные карты и вернуть

Например, два массива:

var names = ['Tom','Jerry','Sam'];
var hobbies = ['Eat','Sleep','Laugh'];

Есть ли функция, которая может построить два массива в виде карт:

{'Tome':'Eat','Jerry':'Sleep','Sam':'Laugh'}
{'Tome':'Sleep','Jerry':'Eat','Sam':'Laugh'}
{'Tome':'Laugh','Jerry':'Eat','Sam':'Laugh'}

и еще 3... В целом, учитывая два массива, возвращаемое число карт должно быть A33 = 6. С помощью javascript или python любой может это сделать. Есть идеи?


После поиска в Интернете это проблема назначения, и способ ее решения называется венгерским методом. Сейчас я ищу реализацию венгерского алгоритма с помощью javascript или python.

3 ответа

Решение

Я получил ответ по этой ссылке Перестановки в JavaScript?,

После этого метод можно сделать так:

function permute(input) {
var permArr = [],
usedChars = [];
function main(){
    var i, ch;
    for (i = 0; i < input.length; i++) {
        ch = input.splice(i, 1)[0];
        usedChars.push(ch);
        if (input.length == 0) {
            permArr.push(usedChars.slice());
        }
        main();
        input.splice(i, 0, ch);
        usedChars.pop();
    }
    return permArr;
}
return main();

}

function mapFromArrays(source,target){
var targets = permute(target);
var returns = [];

for(var t in targets){
    var map = {};
    for(var i=0;i<source.length;i++){
        map[source[i]] = targets[t][i];
    }
    returns.push(map);
}

return returns;

}

Ну, это не перестановка, а произведение 2 векторов. В Python Itertools есть функциональный продукт, с которым можно справиться.

import itertools as itls
names = ['Tom','Jerry','Sam']
hobbies = ['Eat','Sleep','Laugh']
print list(itls.product(names, hobbies))

результат: [('Tom', 'Eat'), ('Tom', 'Sleep'), ('Tom', 'Laugh'), ('Jerry', 'Eat'), ('Jerry', "Спи"), ("Джерри", "Смейся"), ("Сэм", "Ешь"), ("Сэм", "Спи"), ("Сэм", "Смейся")]

На самом деле, произведение двух векторов состоит в том, чтобы сделать несколько операций для каждого из вектора vector1 с каждым из вектора vector2, в этом случае операция состоит в создании кортежа. Работа продукта эквивалентна:

for i = 0; i<length(vector1); ++i
    for j = 0; j<length(vector2); ++j
        vector1[i] 'op' vector2[j];

Вы хотите отобразить имена на каждую возможную перестановку второго массива:

from itertools import permutations

hashmaps = [dict(zip(names, perm)) for perm in permutations(hobbies)]

Обратите внимание, что permutations возвращает список, который N! в длину, которая будет огромной даже с очень маленькой длиной.

Другие вопросы по тегам