子集生成算法

来源:互联网 发布:3亿个精准客户数据库 编辑:程序博客网 时间:2024/05/22 05:19

子集生成的三种方法

  • 构造增量法
  • 位向量法
  • 二进制法
构造增量法:
要点定序,每次向子集中添加一个元素
代码:
#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 0