-1

たとえば、2 つの配列:

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

次のようなマップとして2つの配列を構築できる関数はありますか?

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

およびその他の3つ... 2つの配列が与えられた場合、返されるマップ番号はA33 = 6になるはずです.javascriptまたはpythonを使用すると、誰でもそれを実行できます。何か案は?


ウェブで検索したところ、これは割り当て問題であり、それを解決する方法はハンガリー法と呼ばれています。現在、javascript または python によるハンガリー語アルゴリズムの実装を探しています。

4

3 に答える 3

1

これは順列ではなく、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', 'Sleep'), ('Jerry', 'Laugh'), ('Sam', 'Eat'), ('Sam', 'Sleep'), ('Sam', 'Laugh')]

実際には、2 つのベクトルの積は、vector1 の各 1 つと vector2 の各 1 つに対していくつかの「op」を実行することです。この場合、「op」はタプルを作成することです。製品の操作は次のものと同等です。

for i = 0; i<length(vector1); ++i
    for j = 0; j<length(vector2); ++j
        vector1[i] 'op' vector2[j];
于 2014-05-29T10:42:47.273 に答える
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;

}

于 2014-05-29T10:10:27.370 に答える