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。雖然我不建議搞亂窗口對象。

和上面的代碼中可以看到的名稱數組可以以編程方式創建。所以,不需要「蠻力硬編碼」。

相關問題