子集生成的三种方法
- 构造增量法
- 位向量法
- 二进制法
构造增量法:
要点:定序,每次向子集中添加一个元素
代码:
#include<iostream>
using namespace std;
int bit=0;
int arr[4]={0};
void sub_set(int cur,int *arr,int n)//cur为当前下标位置,n为位向量长度
{
for(int i=0;i<cur;i++)
cout<<arr[i]<<' ';
cout<<endl;
int s=(cur?arr[cur-1]+1:0);//选择一个最小的元素下标添加(这里即前一个元素+1)
for(int i=s;i<n;i++){//无法添加即终止递归了
arr[cur]=i;
sub_set(cur+1,arr,n);
}
}
int main()
{
sub_set(0,arr,4);
}
位向量法:
要点:用数组下标代表所有元素,数组值0或1表示取或不取该元素
代码:
代码:
#include<iostream>
using namespace std;
int bit=0;
int arr[4]={0};
void sub_set(int cur,int *arr,int n)//cur为当前下标位置,n为位向量长度
{
if(cur==n)
{
for(int i=0;i<n;i++)
if(arr[i])
cout<<i<<' ';
cout<<endl;
return;
}
arr[cur]=1;
sub_set(cur+1,arr,n);
arr[cur]=0;
sub_set(cur+1,arr,n);
}
int main()
{
sub_set(0,arr,4);
}
二进制法:
要点:类似位向量法,只是用bit位代替每个数组下标
代码:
void sub_set(int cur,int n)
{
int bit=0;
for(int j=0;j<(1<<n);j++){
for(int i=0;i<n;i++)
if(bit&(1<<i))//遍历所有位,与运算为1的位下标在该子集中
cout<<i<<' ';
cout<<endl;
bit++;
}
}
子集生成三方法
本文介绍了子集生成的三种常用方法:构造增量法、位向量法和二进制法,并给出了每种方法的实现代码。构造增量法通过逐个添加元素来构建子集;位向量法使用数组下标代表元素,数组值0或1表示是否选取;二进制法则利用二进制位来表示元素的选择状态。
190

被折叠的 条评论
为什么被折叠?



