两种求集合全部子集的方法

如果我们有一个求集合的所有子集(包括集合自身)的需求,即有一个集合s,包括两个元素 <a,b>,则其所有的子集为<a,ab,b>.

不难求得,子集个数sn与原集合元素个数n之间的关系为:sn=2^n-1。

 

本文分别讲述两种实现方法:

 

一:位图法:

1)构造一个和集合一样大小的数组A,分别与集合中的某个元素相应,数组A中的元素仅仅有两种状态:“1”和“0”,分别代表每次子集输出中集合中相应元素是否要输出。这样数组A能够看作是原集合的一个标记位图。

2)数组A模拟整数“加一”的操作,每“加一”之后,就将原集合中全部与数组A中值为“1”的相相应的元素输出。

设原集合为<a,b,c,d>。数组A的某次“加一”后的状态为[1,0,1,1],则本次输出的子集为<a,c,d>。

详细代码例如以下:

/*使用非递归的思想 假设有一个数组  大小为n那么就使用n 位的二进制 假设对应的位为1 那么就输出这个位 假设对应的位为0 那么就不输出这个位*//*使用位图的思想 构造一个位集合 大小和数组大小一样,假设位图中对应的位为1,表示能够输出这个数组中的元素 假设位图中对应位为0 表示数组中对应位不输出这里模拟位图使用的数组 ,这里的重点是模拟数组加1的操作*//*使用数组模拟位图加1的操作  数组能够一直加1  直到数组内全部元素都是1函数返回值为bool 数组初始化最高位为1*/
#define MAX_LEN 10
void bitmap(char str[],const int n)
{bitset<MAX_LEN> count;wang.set();int i=0;unsigned long value = wang.to_ulong();cout<<wang<<" "<<value<<endl;int count=0;while(value){bitset<MAX_LEN> bit(value--);for(i=0;i<bit.size();i++)if(bit[i])cout<<str[i];cout<<endl;count++;}cout<<count<<endl;
}

3)时间复杂度:O(n*2^n)。事实上,在遍历输出子集的过程中。能够对程序做进一步的优化。

比如。在第m次迭代中。仅仅须要遍历前k个元素,k=log2(m)+1。这样,不考虑数组模拟"加一"操作的话,总遍历次数为Sn=(n-2)*2^n+2,n>=2;Sn=1,n=1。尽管复杂度不变,但总执行时间会降低。

4)空间复杂度:该方法每次迭代都是独立进行,与上次迭代的结果没有不论什么关系。因此每次输出子集之后内存都能够被反复利用。

仅仅须要一个与原集合相同大小的数组。空间复杂度为O(n)。

 

 

二:递归迭代法:

1)採用递归迭代。详细步骤例如以下,

设。原始集合s=<a,b,c,d>,子集结果为r:

第一次迭代:

r=<a>

第二次迭代:

r=<a ab b>

第三次迭代:

r=<a ab b ac abc bc c>

第四次迭代:

r=<a ab b ac abc bc c ad abd bd acd abcd bcd cd d>

 

每次迭代,都是上一次迭代的结果+上次迭代结果中每一个元素都加上当前迭代的元素+当前迭代的元素。

详细代码例如以下:

/*上述方法不可用 明确递归的思想 以下每次都是输出back中的字符就可以 这次输出的子集就是上次输出的子集 +这次迭代的元素 + 这次迭代的元素的本身*/
#if 1
void print(char* str)
{/*使用两个数组。一个记录上次迭代的结果 一个记录这次须要输出的结果 vec记录的是下次迭代须要參考的子集back记录的是參考vec迭代以后生成新的子集*/int count=0;vector<char> vec;vector<char> back;int j;for(int i=0;i<strlen(str);i++){if(i == 0){vec.push_back(str[i]);vec.push_back(',');back=vec;}else{for(j=0;j<back.size();j++)if(back[j] == ','){back.insert(back.begin() +j,str[i]);j++;}back.push_back(str[i]);back.push_back(',');			}for(j=0;j<back.size();j++){if(back[j] == ','){printf("\r\n");count++;}elseprintf("%c",back[j]);if(i)vec.push_back(back[j]);}back=vec;}printf("sub_set count is %d \r\n",count);
}
#endif

2)时间复杂度

依据上述过程,不难求的。第k次迭代的迭代次数为:2^k-1。

n>=k>=1。迭代n次,总的遍历次数为:2^(n+1)-(2+n),n>=1。

则时间复杂都为O(2^n)。

 

3)空间复杂度

因为该算法。下一次迭代过程都须要上一次迭代的结果,而最后一次迭代之后就没有下一次了。

因此如果原始集合有n个元素。则在迭代过程中,总共须要保存的子集个数为2^(n-1)-1,n>=1。

但须要注意的是,这里之考虑了子集的个数,每一个子集元素的长度都视为1,这点要注意。

总结:

递归是非常耗时的。由于是递归,在第一种方法时,使用了C++中的bitset,这种方法效率非常高,在第二个方法中,使用两个向量的目的是,一个向量记录了这次迭代须要输出的集合,一个向量是为了这次迭代须要參考上次输出的情况。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ch341a编程和ttl刷机区别_土豪金CH341a编程器 开箱晒物

土豪金CH341a编程器 开箱晒物2019-07-20 11:00:0025点赞119收藏7评论你是AMD Yes党&#xff1f;还是intel和NVIDIA的忠实簇拥呢&#xff1f;最新一届#装机大师赛#开始啦&#xff01;本次装机阵营赛分为3A红组、intel NVIDIA蓝绿组、混搭组还有ITX组&#xff0c;实体or虚拟装机都…

python爬虫爬取百度首页

import requests #导入requests模块 #利用爬虫代码爬去百度首页 #如果当前python文件作为入口程序执行时&#xff0c;则执行if语句下的代码 if __name____main__:# 指定URLurl https://www.baidu.com# 进行UA伪装&#xff0c;模拟浏览器,注意要将相应的User-Agent封装在一个…

最大后验估计_PR Ⅱ:贝叶斯估计/推断及其与MAP的区别

Probabilistic in Robotics Ⅱ: Bayesian Estimation/Inference统计推断旨在根据可观察到的事物来了解不可观察到的事物。即&#xff0c;统计推断是基于一个总体或一些样本中的某些观察变量&#xff08;通常是影响&#xff09;得出结论的过程&#xff0c;例如关于总体或样本中某…

POJ 2187 Beauty Contest

旋转卡壳求最远点对&#xff1b; #include<iostream> #include<cmath> using namespace std; int n,k; double dt; typedef struct point {double x,y;point(double xx0,double yy0):x(xx),y(yy){} }vector; point p[50010],q[50010]; struct line {vector v; }li,…

深入理解并行编程-分割和同步设计(四)

原文链接 作者&#xff1a;paul 译者&#xff1a;谢宝友&#xff0c;鲁阳&#xff0c;陈渝 图1.1&#xff1a;设计模式与锁粒度 图1.1是不同程度同步粒度的图形表示。每一种同步粒度都用一节内容来描述。下面几节主要关注锁&#xff0c;不过其他几种同步方式也有类似的粒…

XHTML标签的嵌套规则

XHTML 的标签有许多&#xff1a;div、ul、li、dl、dt、dd、h1~h6、p、a、addressa、span、 strong……我们在运用这些标签搭建页面结构的时候&#xff0c;是可以将它们无限嵌套的&#xff0c;但是&#xff0c;嵌套也需要有一定规则&#xff0c;不能任由网站设计师的个人习惯胡乱…

python爬虫实现网页采集器

import requests #导入requests模块 #UA&#xff1a;User-Agnet:请求载体身份标识 #UA检测&#xff1a;各大门户网站的服务器都会检测请求载体的身份标识&#xff0c;如果请求载体的身份标识为某一款服务器&#xff0c; #则该请求为正常请求&#xff0c;如果请求载体的身份标识…

mongodb备份oplog_MongoDB 备份(mongodump)与恢复(mongorestore)

MongoDB 备份(mongodump)与恢复(mongorestore)MongoDB数据备份在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。mongodump命令可以通过参数指定导出的数据量级转存的服务器。语法mongodump命令脚本语法如下&#xff1a;>mongodump…

[转]MVC中如何使用RDLC报表

本文转自&#xff1a;http://www.cnblogs.com/BlueWoods/archive/2009/04/27/1444311.html 在用MVC开发项目的时候遇到了一个问题&#xff0c;如何运用RDLC报表&#xff1f; 首先想到的是在Controller返回DataSet,然后在View绑定值&#xff0c;但是遇到一个异常&#xff1a;...…

关于javascript作用域

今天一个挚友给我出了道javascript笔试题&#xff0c;代码如下&#xff1a; function test(){var a b 2; } test(); alert(b); alert(a);我看到这段代码&#xff0c;我笑了&#xff0c;很自信的回答道&#xff0c;会报错&#xff0c;因为a,b都是局部变量&#xff0c;所以a an…

string类的实现(构造函数,析构函数,运算符重载)

String类的代码&#xff1a;class String { public:String(char* str""){_str new char[strlen(str) 1];strcpy(_str, str);}String(const String& str){_str new char[strlen(str._str) 1];strcpy(_str, str._str);}~String(){delete[] _str;}String& o…

html网页设计一个简单的用户登录页面

结果 代码 login.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>用户登录页面</title><link rel"stylesheet" href"./css/login.css"><script src"j…

python url模块介绍_python 中 urlparse 模块介绍

urlparse模块主要是用于解析url中的参数 对url按照一定格式进行 拆分或拼接1.urlparse.urlparse将url分为6个部分&#xff0c;返回一个包含6个字符串项目的元组&#xff1a;协议、位置、路径、参数、查询、片段。import urlparseurl_change urlparse.urlparse(https://i.cnbl…

欢迎光临CAX软件二次开发开源社区!

欢迎光临CAX软件二次开发开源社区&#xff01; http://uucax.uueasy.com转载于:https://www.cnblogs.com/uucax/archive/2011/02/20/1959265.html

ORA-20446: The owner of the job is not registered ORA-06512: at SYSMAN.MGMT

Login as sysman user to the database and execute the following :execute MGMT_USER.MAKE_EM_USER(ARCER);//标红处为需要导出导入权限的用户的用户名 备注:假如你没有开启SYSMAN用户&#xff0c;自行开启&#xff1b;转载于:https://www.cnblogs.com/arcer/archive/2013/06…

ip聚合简介

练习一 本题选择&#xff1a;D 解释如下&#xff1a; 人事部 205.67.159.1110 0000 /27 培训部 205.67.159.1101 0000 /28 销售部 205.67.159.1100 0000 /28 先是培训部与销售部做IP聚合&#xff08;只有网络前缀位数相同才可以做ip聚合&#xff09; 保留相同的位数&…

css编写的技巧效果总结

1. 垂直对齐 如果你之前遇到过这个问题&#xff0c;你就应该知道它是多么的烦人&#xff0c;幸运的是&#xff0c;现在你可以使用CSS3变换来解决这个问题&#xff1a; .vc{ position: relative; top: 50%; -webkit-transform: translateY(-50%); -o-transform: translateY(-50%…

微信公众平台消息接口开发(34)桃花运测试

微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 桃花运 作者&#xff1a;方倍工作室 原文&#xff1a;http://www.cnblogs.com/txw1958/archive/2013/06/06/weixin-if34-peach-blossom-luck.html 桃花运&#xff0c;一般指得到异性缘的运气。而这种运气又常常蕴涵在…

sharepoint 2013 个人站点母版

最近做了个项目&#xff0c;&#xff0c;sharepoint 个人站点要求定制&#xff0c;&#xff0c;搞了好久不知引用的模板 在何位置&#xff0c;查了好多资料还是没有办法解决&#xff0c;&#xff0c;经过不懈的努力&#xff0c;终于找到了&#xff0c;现在记录下&#xff0c;做…

telnet不是内部或外部命令解决方法

在使用window系统在使用telnet命令时&#xff0c;会出现“telnet不是内部或外部命令”的错误。 这是因为windows默认没有开启telnet client 开启window的telnet客户端功能&#xff0c;命令就可以使用了。 1.打开控制面板 2.选择程序 3.选择启用或关闭windows功能 4.将telnet…