2012-09-17 36 views
0

我有一个硬时间来生成的一组不同尺寸的独特集合的组合的明细表,比方说,其中n = 6 [变量]不同尺寸的独特组合生成使用javascript [有效的方法]

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 

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

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

由于事先 尼尔

+0

我不太明白你在做什么...... – elclanrs

+0

我正在生成独特的组合nCr,它们是按顺序排列的,并将每个组合分配给一个变量 – Neal

+0

难道你不认为使用数组而不是变量是保存这些组合的更好方法吗? – Nippey

回答

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

如果你想创建的每个组合的变量,我建议使用的对象。 在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。虽然我不建议搞乱窗口对象。

和上面的代码中可以看到的名称数组可以以编程方式创建。所以,不需要“蛮力硬编码”。