子集生成算法
来源:互联网 发布: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
- 子集生成算法
- 子集生成算法
- 子集生成算法
- 算法--生成子集
- 子集生成算法
- 子集生成算法
- (子集生成算法)
- 子集生成算法
- 子集生成算法
- 子集生成算法
- 子集生成各算法
- 子集生成算法
- 子集生成算法
- 子集生成算法合集
- 子集生成--《算法入门经典》
- 子集生成之递归算法
- 算法03:子集生成算法总结
- 集合中子集的生成算法
- 83. Remove Duplicates from Sorted List
- 数据结构-Hash法-静态Hash法
- maven多模块开发配置
- SaaS服务的软件研发型组织技术发展困局
- (HDU 5922)Minimum’s Revenge 思维水题 <2016CCPC东北地区大学生程序设计竞赛 - 重现赛 >
- 子集生成算法
- Toolbar的常规设置(包括标题样式,菜单样式等)
- 数字加减多线程
- Rsync使用非ssh默认端口从远程服务器同步文件到本地
- [POJ1873]The Fortified Forest(dfs+凸包)
- Go语言:前后端对接
- 用DP解决最长子序列问题
- bat定时检测系统服务是否开启
- HDU 3315 My Brute(KM算法)