使用javascript[高效方法]生成不同大小的唯一组合

使用javascript[高效方法]生成不同大小的唯一组合,javascript,algorithm,combinations,Javascript,Algorithm,Combinations,我很难为一个集合生成不同大小的独特集合组合列表,例如,其中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

我很难为一个集合生成不同大小的独特集合组合列表,例如,其中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 
我知道一个普通的蛮力方法是解决这个问题的最简单的方法,但是对于大的值来说,这是非常低效的

我正在寻找一种更有效的方法来解决这个问题。任何好的解决办法都会大有裨益

提前感谢,,
Neal

如果要为每个组合创建变量,我建议使用对象。 在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".
var name=[“a”、“b”、“c”、“d”];
var obj={};
对于(var idx=0;idx
如果需要创建全局变量,可以使用
窗口
对象而不是
obj
。尽管我不建议随意使用窗口对象


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

如果要为每个组合创建变量,我建议使用对象。 在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".
var name=[“a”、“b”、“c”、“d”];
var obj={};
对于(var idx=0;idx
如果需要创建全局变量,可以使用
窗口
对象而不是
obj
。尽管我不建议随意使用窗口对象


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

函数生成组合:

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;
}
函数生成(索引、数组、已用、结果)
{
if(index==array.length&&used.length>0)
{
var a=新数组();
对于(变量i=0;i
函数generateAllCmobinations将返回所有可能的非空组合的数组。 如果您愿意,我将编写函数,它将返回长度K的所有组合;-)


你找不到更好的算法。因为解总是有复杂度O(C),其中C是总组合数。因此,根据数组大小的复杂性是指数O(2^N)

函数生成组合:

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;
}
函数生成(索引、数组、已用、结果)
{
if(index==array.length&&used.length>0)
{
var a=新数组();
对于(变量i=0;i
函数generateAllCmobinations将返回所有可能的非空组合的数组。 如果您愿意,我将编写函数,它将返回长度K的所有组合;-)


你找不到更好的算法。因为解总是有复杂度O(C),其中C是总组合数。因此,根据数组大小的复杂性是指数O(2^N)

我不太明白您想做什么…我正在生成唯一的组合nCr,这些组合是有序的,并将每个组合分配给一个变量。您不认为使用数组而不是变量是保存这些组合的更好方法吗?我需要将每个组合分配给一个变量。如何使用数组来实现这一点?我不太明白你想做什么…我正在生成唯一的组合nCr,这些组合是有序的,并将每个组合分配给变量。你不认为使用数组而不是变量是保存这些组合的更好方法吗?我需要将每个组合分配给一个变量。如何使用阵列实现这一点?