使用javascript[高效方法]生成不同大小的唯一组合
我很难为一个集合生成不同大小的独特集合组合列表,例如,其中n=6[变量]使用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
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,这些组合是有序的,并将每个组合分配给变量。你不认为使用数组而不是变量是保存这些组合的更好方法吗?我需要将每个组合分配给一个变量。如何使用阵列实现这一点?