Arrays 一组元素数组的所有组合的算法

Arrays 一组元素数组的所有组合的算法,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,我想要一个这样的算法: choose(set, size) if (size <= 0) return set1 = set set2 = set choose(set1+1, size-1); choose(set2+1, size-1); set1 = ',' U set1+1 //set1+1 here denotes the subset starting at second position set2 = ' ' U se

我想要一个这样的算法:

choose(set, size)
    if (size <= 0) return
    set1 = set
    set2 = set
    choose(set1+1, size-1);
    choose(set2+1, size-1);
    set1 = ',' U set1+1  //set1+1 here denotes the subset starting at second position
    set2 = ' ' U set2+1
    add set1, set2 to the output group
考虑到一些因素:

A B C D E F
[A,B,C,D,E,F]
[AB,C,D,E,F]
[ABC,D,E,F]
[A,BC,D,E,F]
[A,B,C,DEF]
[ABCDEF]
该算法应生成包含这些元素的所有数组组合:

A B C D E F
[A,B,C,D,E,F]
[AB,C,D,E,F]
[ABC,D,E,F]
[A,BC,D,E,F]
[A,B,C,DEF]
[ABCDEF]
无效组合包括(例如):

也就是说,元素应该保持有序

编辑: 我想在英语句子中使用算法来检测复合名词

例如:

[AC,B,D,E,F]
[AB,BC,D,E,F]
[BC,DE,FA]
On the table is a water jug.
应被识别为以下词类的序列

Pronoun, Determiner, Noun, Verb, Determiner, Noun
但不是

Pronoun, Determiner, Noun, Verb, Determiner, Noun, Noun

将问题简化为以下问题:

对于
n
字母,它们之间有
n-1
个位置。 您需要选择是否在每个
n-1
位置放置分隔符

伪代码如下所示:

choose(set, size)
    if (size <= 0) return
    set1 = set
    set2 = set
    choose(set1+1, size-1);
    choose(set2+1, size-1);
    set1 = ',' U set1+1  //set1+1 here denotes the subset starting at second position
    set2 = ' ' U set2+1
    add set1, set2 to the output group
选择(设置、大小)

如果(size我认为这个问题可以用递归来解决。以A,B,C,D,E,F为例。我们可以把A和B组合成一个新元素AB,剩下的元素C,D,E,F可以看作是同一个问题,递归地解决。我们也可以把A,B,C组合成一个新元素ABC,剩下的元素是D,E,F。代码如下:

#include<iostream>
#include<string>
#include<vector>


using namespace std;

void sequential_combination(char input[],int start, int length,vector<string>& result)
{
     if(start>=length)
     {
        cout<<"[";
        for(int i=0;i<result.size()-1;++i)cout<<result[i]<<",";
        cout<<result[result.size()-1];
        cout<<"]";
        cout<<endl;
     }
     else
     {
         string prefix="";
         for(int i=start;i<length;++i)
         {
                 prefix+=input[i];
                 result.push_back(prefix);
                 sequential_combination(input,i+1,length,result);
                 result.pop_back();
         }
     }     
}

int main()
{

    char input[6]={'A','B','C','D','E','F'};
    vector<string> result;
    sequential_combination(input,0,6,result);
    getchar();
    getchar();
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
无效顺序_组合(字符输入[],整数开始,整数长度,向量和结果)
{
如果(开始>=长度)
{

这些不是组合,可能是分区或分组……您尝试过什么?这听起来是一个典型的家庭作业问题……请描述您尝试过什么,以及具体遇到了什么问题。@izomorphius它们可以被视为范围长度的组合,例如第一个可以用
1,1,1,1,1,1,1
表示,第二个
2,1,1,1,1,0
…范围长度的有效值池是
0-6
您有一个2^(n-1)状态供检查。但是如果您有一个正确的英语句子,那么您可以使用边界作为答案