使用javascript生成不同大小的独特组合[有效方法]

时间:2012-09-17 07:57:47

标签: javascript algorithm combinations

我很难为一组产生不同大小的独特收藏组合列表,例如,其中n = 6 [变量]

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

我需要使用javascript(Ordered collection)生成上述集合的所有唯一组合,如此

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 

我知道正常的蛮力方法是解决问题的最简单方法,但对于较大的值,这将是非常低效的。

我正在寻找一种更有效的方法来解决这个问题。任何好的解决方案都会有很大的帮助。

先谢谢, 尼尔

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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。虽然我不建议弄乱窗口对象。

并且可以通过编程方式在上面的代码中看到名称数组。所以,不需要“强力硬编码”。