C++ 可以创建所有组合以及这些组合的所有组的算法
假设我有一组元素C++ 可以创建所有组合以及这些组合的所有组的算法,c++,algorithm,combinations,C++,Algorithm,Combinations,假设我有一组元素s={1,2,3,4,5,6,7,8,9} 我想创建3个组合,并将它们分组,使数字不会出现在多个组合中 以下是一个例子: {{3,7,9},{1,2,4},{5,6,8} 组中数字的顺序无关紧要,在整个示例中,组的顺序也无关紧要 简而言之,我想要原始集合中每个可能组合中的每个可能组合,不包括在多个组中出现数字的组合 我的问题:就运行时间和内存而言,这真的可行吗?我的样本量可能在30-50个左右 如果是这样,创建此算法的最佳方法是什么?是否最好创建所有可能的组合,并且仅当号码尚未出
s={1,2,3,4,5,6,7,8,9}
我想创建3个组合,并将它们分组,使数字不会出现在多个组合中
以下是一个例子:
{{3,7,9},{1,2,4},{5,6,8}
组中数字的顺序无关紧要,在整个示例中,组的顺序也无关紧要
简而言之,我想要原始集合中每个可能组合中的每个可能组合,不包括在多个组中出现数字的组合
我的问题:就运行时间和内存而言,这真的可行吗?我的样本量可能在30-50个左右
如果是这样,创建此算法的最佳方法是什么?是否最好创建所有可能的组合,并且仅当号码尚未出现时才选择分组
我在QT 5.6中写这个,它是一个基于C++的框架。 < P>一次取3个n的事物,可以使用3个嵌套循环:
for(k = 0; k < n-2; k++){
for(j = k+1; j < n-1; j++){
for(i = j+1; i < n ; i++){
... S[k] ... S[j] ... S[i]
}
}
}
(k=0;k{
对于(j=k+1;j
对于一次取k的n个事物的通用解决方案,您可以使用k个计数器的数组。我认为您可以通过使用动态规划的硬币更换问题来解决它,只要假设您正在寻找3的更改,数组中的每个索引都是硬币值1,然后只输出已找到的硬币(数组中的值)。
链接:如果在每个递归中固定第一个元素,并且只按顺序将值分成3组,则可以递归地执行此操作,并避免重复,例如:
{1,2,3,4,5,6,7,8,9}
将最低的元素放在第一个点(a),并保持在那里:
{a,b,c}={1,*,*}
对于第二个点(b),迭代从第二低到第二高的每个值:
{a,b,c}={1,2~8,*}
对于第三个点(c),迭代高于第二个值的每个值:
{1,2~8,b+1~9}
然后与其余的值一起递归
{1,2,3}{4,5,6}{7,8,9}
{1,2,3}{4,5,7}{6,8,9}
{1,2,3}{4,5,8}{6,7,9}
{1,2,3}{4,5,9}{6,7,8}
{1,2,3}{4,6,7}{5,8,9}
{1,2,3}{4,6,8}{5,7,9}
{1,2,3}{4,6,9}{5,7,8}
{1,2,3}{4,7,8}{5,6,9}
{1,2,3}{4,7,9}{5,6,8}
{1,2,3}{4,8,9}{5,6,7}
{1,2,4}{3,5,6}{7,8,9}
…
{1,8,9}{2,6,7}{3,4,5}
如果我说“按顺序”,那不必是任何特定的顺序(数字、字母…),它可以是输入的原始顺序。如果确保按接收顺序将其余值传递给下一个递归,则可以避免对每个递归的输入重新排序
递归的运行过程:
假设你得到输入{1,2,3,4,5,6,7,8,9}。作为组中的第一个元素,您从输入中获取第一个元素,对于其他两个元素,您迭代其他值:
{1,2,3}
{1,2,4}
{1,2,5}
{1,2,6}
{1,2,7}
{1,2,8}
{1,2,9}
{1,3,4}
{1,3,5}
{1,3,6}
…
{1,8,9}
确保第三个元素始终位于第二个元素之后,以避免重复,如:
{1,3,5}&lrarr;{1,5,3}
现在,让我们假设在某一点上,您已选择此作为第一组:
{1,3,7}
然后将其余值传递到下一个递归:
{2,4,5,6,8,9}
在这个递归中,您将应用与第一个组相同的规则:将第一个元素作为组中的第一个元素,并将其保留在那里,然后迭代第二个和第三个元素的其他值:
{2,4,5}
{2,4,6}
{2,4,8}
{2,4,9}
{2,5,6}
{2,5,8}
{2,5,9}
{2,6,7}
…
{2,8,9}
现在,让我们假设在某一点上,您已选择此作为第二组:
{2,5,6}
然后将其余值传递到下一个递归:
{4,8,9}
因为这是最后一组,所以只有一种可能,所以这个特殊的递归将以组合结束:
{1,3,7}{2,5,6}{4,8,9}
如您所见,只要按照接收顺序将值传递到下一个递归,就不必在任何时候对值进行排序。因此,如果您收到,例如:
{q,w,e,r,t,y,u,i,o}
您可以从该组中选择:
{q,r,u}
然后你应该继续:
{w,e,t,y,i,o}
下面是一个JavaScript片段,演示了该方法;它返回一个包含多组元素组合的3D数组。
(filter函数创建输入数组的副本,删除元素0、i和j。)
函数clone2D(数组){
var克隆=[];
对于(vari=0;i3){
var rest=input.filter(函数(元素,索引){
返回索引&&index!=i&&index!=j;
});
组(休息,步骤+1);
}
其他结果。推送(克隆2D(组合));
}
}
}
}
var结果=第三组([1,2,3,4,5,6,7,8,9]);
for(result中的var r)document.write(JSON.stringify(result