给定2个数组并且两个数组具有相同数量的元素,构造所有散列映射并返回

时间:2014-05-29 09:07:04

标签: javascript python arrays hashmap hungarian-algorithm

例如两个数组:

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 个答案:

答案 0 :(得分:1)

好吧,这不是排列,而是2个载体的产物。在Python Itertools中,有一个功能产品可以解决这个问题。

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

结果是:[(&#39; Tom&#39;,&#39; Eat&#39;),(&#39; Tom&#39;,&#39; Sleep&#39;),(& #39;汤姆&#39;笑&#39;),(&#39; Jerry&#39;,&#39;吃&#39;),(&#39; Jerry&#39;,&# 39;睡眠&#39;),(&#39; Jerry&#39;,&#39;笑&#39;),(&#39; Sam&#39;,&#39; Eat&#39;),(& #39; Sam&#39;,&#39; Sleep&#39;),(&#39; Sam&#39;,&#39; Laugh&#39;)]

实际上,2个向量的产物是做一些&#39; op&#39;对于vector1中的每一个与vector2中的每一个,在这种情况下,&#39; op&#39;是制作一个元组。产品操作与以下方面相同:

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

答案 1 :(得分:0)

您希望将名称映射到第二个数组的每个可能的排列:

from itertools import permutations

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

请注意,permutations会返回长度为N!的列表,即使非常的长度很短,这个列表也会很大。

答案 2 :(得分:0)

我从这个链接Permutations in 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;

}