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)状态供检查。但是如果您有一个正确的英语句子,那么您可以使用边界作为答案