0

配列のすべての組み合わせを保存したい。したがって、[a、b、c]については、[ab、ac、ba、bc、ca、cb]を保存します。

私は現在この方法を使用しています:

for (coordinate in coordinates){
    for (coordinate2 in coordinates){
        if (coordinate != coordinate2){
            newposts.push([fbposts[fbpost].id, coordinates[coordinate], coordinates[coordinate2]]);
        }
    }
}

しかし、それはたくさんの重複を生成します。これを解決する最もスムーズな方法は何ですか?

4

3 に答える 3

1

カスタム関数またはおそらくカスタム関数のいずれかによって新しい配列に追加する前に、チェックを追加します

array.indexOf(...)

jQueryと同様のカスタム関数:

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

したがって、順列/組み合わせの新しい配列を構築しているときに(前回の統計クラスから13年以上経過している)、クイックチェックを実行し、trueの場合は追加しないでください。そうでない場合は、追加してください。配列のマージを実行すると、同様のパフォーマンスが得られると思います。

于 2012-07-15T11:33:22.277 に答える
1

修正されたバブルソートアルゴリズム を使用できます。

var result = [],
arr = 'abc'.split('');

// begin the bubble sort loop
for(var i=0,l=arr.length;i<l-1;i++)
    for(var j=i+1;j<l;j++)
        {
            result.push(arr[i]+arr[j]);
            result.push(arr[j]+arr[i]);
        }
console.log(result); //["ab", "ba", "ac", "ca", "bc", "cb"]

このように配列をループすることで、結果が重複しているかどうかを確認する必要がなくなります。これは、結果が生成されないためです。for..inところで、予期しない結果が生じる可能性があるため、配列をループするためにsynthaxを使用しないでください。

于 2012-07-15T11:39:32.507 に答える
1

プロパティを定義できるのは1回だけで、次のようなものがあるという事実を利用できます。

$(function() {
    var arr = ["a","b","c"];
    var permutations ={};
    $.each(arr, function(index1, val1) 
    {
        $.each(arr, function(index2, val2) 
        {
            permutations[val1+val2] = 0;
        });      

    });
    for(var prop in permutations)
    {
        //in prop you will have your elements: aa,ab...

    }        

});​

この場合、順列は辞書の役割を果たします

実行時間はn平方であるため、組み合わせを生成するロジックは最適ではありません。n個の要素の配列からk個の要素の組み合わせを生成するアルゴリズムについては、この質問を参照してください。

于 2012-07-15T11:50:01.490 に答える