0

セットに対して異なるサイズの一意のコレクションの組み合わせのリストを生成するのに苦労しています。たとえば、n = 6 [変数]

set = {2,3,4,5,6,7}

このようにjavascript(順序付きコレクション)を使用して、上記のセットのすべての一意の組み合わせを生成する必要があります

6C1  +  6C2  +  6C3  +   6C4   +   6C5   +   6C6

2       2,3    2,3,4   2,3,4,5  2,3,4,5,6  2,3,4,5,6,7
3       2,4    2,3,5   2,3,4,6  2,3,4,5,7 
4       2,5    2,3,6   2,3,4,7  
5       2,6    2,3,7            2,4,5,6,7
        2,7            2,4,5,6  
.              2,4,5   2,4,5,7  3,4,5,6,7
.       3,4    2,4,6            .
8       3,5    2,4,7   2,5,6,7  .
        3,6                     
        3,7    2,5,6   3,4,5,6 
               2,5,7   3,4,5,7
        4,5              
        4,6    2,6,7   3,5,6,7
        4,7    
               3,4,5   .
        5,6    3,4,6   .
        5,7    3,4,7   .
        .      
        .      3,5,6    
        6,7    3,5,7   4,5,6,7 

               3,6,7
               .       
               .       

               5,6,7 

ここで、これらの値をそれぞれアルファベット順に割り当てる必要があるときに複雑になります。順序は、最初に小文字 a、b、c..、次に大文字 A、B、C、..、その後 aA、aB、aC です。等々

a=2     h=2,3    o=2,3,4   I=2,3,4,5  2,3,4,5,6  2,3,4,5,6,7
b=3     i=2,4    p=2,3,5   J=2,3,4,6  2,3,4,5,7 
c=4     j=2,5    q=2,3,6   K=2,3,4,7  
d=5     k=2,6    r=2,3,7              2,4,5,6,7
        l=2,7              L=2,4,5,6  
.                s=2,4,5   M=2,4,5,7  3,4,5,6,7
.       m=3,4    t=2,4,6            .
g=8     n=3,5    u=2,4,7   N=2,5,6,7  .
        o=3,6                     
        p=3,7    v=2,5,6   O=3,4,5,6 
                 w=2,5,7   P=3,4,5,7
        q=4,5              
        r=4,6    x=2,6,7   Q=3,5,6,7
        s=4,7    
                 y=3,4,5   .
        t=5,6    z=3,4,6   .
        u=5,7    A=3,4,7   .
          .      
          .      B=3,5,6    
          6,7    C=3,5,7   W=4,5,6,7 

                 D=3,6,7
                 .       
                 .       

                 H=5,6,7 

通常のブルート フォースによるアプローチが問題の最も簡単な解決策であることはわかっていますが、値が大きい場合、これは非常に非効率的です。

この問題を解決するためのより効率的な方法を探しています。どんな良い解決策も大いに役立ちます。

前もって感謝します、ニール

4

2 に答える 2

2

関数生成の組み合わせ:

function generate(index, array, used, result)
{
    if (index == array.length && used.length > 0)
    {
         var a = new Array();
         for (var i = 0; i < used.length; i++)
            a.push(used[i]);

         result.push(a);
    }
    else {
       generate(index+1, array, used, result);

       used.push(a[index]);
       generate(index+1, array, used, result);
       used.pop();
    }
}

function generateAllCombinations(array)
{ 
    var result = new Array();
    generate(0, array, [], result);
    return result;
}

関数 generateAllCmobinations は、可能なすべての空でない組み合わせの配列を返します。ご希望であれば、長さ K のすべての組み合わせを返す関数を書きます ;-)

そして、より良いアルゴリズムを見つけることはできません. ソリューションの複雑さは常に O(C) であるため、C は組み合わせの総数です。したがって、配列のサイズに応じた複雑さは指数 O(2^N) になります。

于 2012-09-17T09:20:38.257 に答える
1

組み合わせごとに変数を作成する場合は、オブジェクトを使用することをお勧めします。Javascript では、オブジェクトの要素に次の 2 つの方法でアクセスできます。

var obj = {};
obj["element"] = "foo";
alert(obj.element);    // Will alert: "foo".

毎回文字列を書き込む代わりに、変数名を配列に保存し、この配列を使用して名前を割り当てることができます。

var names = ["a", "b", "c", "d"];
var obj = {};
for (var idx = 0; idx < names.length; idx++)
    obj[names[idx]] = idx;

alert(obj.a);          //Will alert: "0".
alert(obj.c);          //Will alert: "2".

グローバル変数を作成する必要がある場合は、 のwindow代わりに オブジェクトを使用できますobj。window オブジェクトをいじるのはお勧めしませんが。

上記のコードでわかるように、names 配列はプログラムで作成できます。したがって、「力ずくでハードコーディング」する必要はありません。

于 2012-09-17T08:54:25.373 に答える