给定两个数组,它们都有相同数量的元素,构造所有的哈希映射并返回

Given 2 arrays and both have same number of elements, construct all the hashed maps and return

本文关键字:元素 返回 映射 哈希 数组 两个      更新时间:2023-09-26

例如两个数组:

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。

好吧,这不是置换,而是两个向量的乘积。在Python Itertools中,有一个函数product可以处理这个问题。

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

结果是:[(‘汤姆’,‘吃’),(‘汤姆’,‘睡眠’),(‘汤姆’,‘笑’),("杰瑞","吃")("杰瑞","睡眠")("杰瑞","笑")("山姆","吃")("山姆","睡眠")("山姆","笑")]

实际上,两个向量的乘积是对vector1中的每个向量和vector2中的每个向量做一些"op",在这种情况下,"op"是组成一个元组。乘积操作相当于:

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!的列表,即使非常小的长度也将是巨大的。

我从这个链接得到了答案?

之后的方法可以这样做:

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;

}