Учитывая 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!
в длину, которая будет огромной даже с очень маленькой длиной.