Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可以创建所有组合以及这些组合的所有组的算法_C++_Algorithm_Combinations - Fatal编程技术网

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