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 中,可以通过两种方式访问​​对象的元素:

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. 虽然我不建议弄乱窗口对象。

您可以在上面的代码中看到名称数组可以通过编程方式创建。因此,无需“蛮力硬编码”。

于 2012-09-17T08:54:25.373 回答