技术标签: 算法
本篇介绍子集生成算法:给定一个集合,枚举所有可能的子集。为了简单起见,本节讨论的集合汇总没有重复元素。
输入:整数n。
输出:对于集合{0,1,.....n-1},枚举所有可能的子集。
运行结果:
增量构造法。
第一种思路是一次选出一个元素放到集合中。
void print_subset_add(int n,int *A,int cnt)
{
//增量构造法
//每次都选一个元素放入集合中
int i;
for(i=0;i<cnt;i++) //打印当前集合
printf("%d ",A[i]);
printf("\n");
int s=cnt?A[cnt-1]+1:0; //确定当期集合的最小值
for(i=s;i<n;i++)
{
A[cnt]=i;
print_subset_add(n,A,cnt+1); //递归构造子集
}
}
和前面不同,由于A中的元素个数不确定,每次递归调用都要输出当前集合。另外,递归边界也不需要显示确定-如果无法继续添加元素,自然就不会再递归了。
上面的代码用到了定序的技巧:规定集合A中所有元素的编号从小到大排列,就不会把集合{1,2}按照{1,2}和{2,1}输出两次了。
在枚举子集的增量法宏中,需要使用定序的技巧,避免同一个集合枚举两次。
位向量法。
第二种思路是构造一个位向量B[i],而不是直接构造子集A本身,其中B[i]=1,当且仅当i在子集A中,递归实现如下:
void print_subset_B(int n,int *B,int cnt)
{
//位向量法
//构造一个位向量B[i] 而不是直接构造子集A本身,其中B[i]=1当且仅当i在
//子集A中
if(cnt==n)
{
for(int i=0;i<cnt;i++) //打印当前集合
if(B[i])
printf("%d ",i);
printf("\n");
}
else
{
B[cnt]=1;
print_subset_B(n,B,cnt+1);
B[cnt]=0;
print_subset_B(n,B,cnt+1);
}
}
必须当所有元素是否选择全部确定完毕后才是一个完整的子集,因此仍然像以前那样当 if(cur ==n )成立时才输出。
二进制法。
另外,还可以用二进制来表示{0,1,2,....,n-1}的子集S:从右往左第i位(各位从0开始编号)表示元素i是否在集合S中。
为了处理方便,最右边的位总是对应元素9,而不是元素1.
可以用二进制表示子集,其中从右往左第i位(从0开始编号)表示元素i是否在集合中(1表示“在”,0表示“不在”)
此时仅表示出集合是不够的,还需要对集合进行操作。幸运的是,常见的集合运算都可以用位运算符简单实现。
当用二进制表示子集时,位运算中的按位与,或,异或对应集合的交、并和对称差。
这样,不难用下面的程序输出子集S对应的各个元素:
void print_subset_binary(int n,int s)
{
//二进制法
for(int i=0;i<n;i++) //打印子集S
if(s&(1<<i))
printf("%d ",i);
printf("\n");
}
而枚举子集和枚举整数一样简单:
for(int i=0;i<(1<<n);i++) //枚举各子集对应的编码0,1,....2^n-1;
print_subset_binary(n,i);
从代码量看,枚举子集的最简单方法是二进制法。
媒体查询需要一层层查找下去修改,否则无效当屏幕宽度小于1024的时候,.time-box里头的.data内容被隐藏 &lt;li class="time-box"&gt; &lt;div class="time"&gt;{{systemTime}}&lt;/div&gt; &lt;div class="date"&
文章目录5 CSS 引入方式5.1 CSS的三种样式表5.2 内部样式表5.3 行内样式表5.4 外部样式表5.5 CSS引入方式总结5 CSS 引入方式5.1 CSS的三种样式表前面例子在写CSS时都是写在style中,但是并不是都写在里面的按照CSS样式书写的位置(或者引入的方式),CSS样式表可以分为三大类:行内样式表(行内式)内部样式表(嵌入式)外部样式表(链接式)5.2 内部样式表内部样式表(内嵌样式表)是写到html页面内部。是将所有的CSS代码抽取出来,单独放到一个*
EasyRTMP是一套调用简单、功能完善、运行高效稳定的RTMP推流功能组件,支持RTMP推送断线重连、环形缓冲、智能丢帧、网络事件回调,支持Windows、Linux、ARM、Android、iOS平台,支持市面上绝大部分的RTMP流媒体服务器,能够完美应用于各种行业的直播需求,手机直播、桌面直播、摄像机直播、课堂直播等方面。EasyRTMP推流功能特点- 调用简单无论是个...
我的Freebuf:https://www.freebuf.com/author/MrAnonymous我的博客:https://whoamianony.top/文章目录Windows 操作系统常见持久性后门Windows系统隐藏账户Shift 粘滞键后门(1)手动制作(2)Empire 下的利用注册表键后门(1)手动制作(2)Metasploit 下的利用(3)Empire 下的利用Windows 计划任务后门(1)利用 at 命令(2)利用 schtasks 命令(3)利用SharPersist工.
可视化 nlpMy data science experience has, thus far, been focused on natural language processing (NLP), and the following post is neither the first nor last which will include the novel Ulysses, by James ...
本手册为chm格式,查询C语言常用函数非常方便字符串函数bcmp,bcopy,bzero,memccpy,memchr,memcmp,memcpy,memicmp,memmove,memset,movmem,setmem,stpcpy,strcat,strchr,strcmp,strcmpi,strcpy,strcspn,strdup,stricmp,strlen,strlwr,strncat,s...
【1】Fragment是什么?相关介绍:Google官网给的解释是:Fragment 表示 FragmentActivity 中的行为或界面的一部分。您可以在一个 Activity 中组合多个片段,从而构建多窗格界面,并在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或移除片段(这有点像可以在不同 Activity 中重复使用的“子 Activity”...
要搞清楚什么是虚拟环境,首先要清楚Python的环境指的是什么。python哪里来?这个主要归功于配置的系统环境变量PATH,当我们在命令行中运行程序时,系统会根据PATH配置的路径列表依次查寻是否有可执行文件python(在windows中,省略了后缀.exe),当查寻到该文件时,执行该文件;'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。test.py代码中import的模块在哪里找?import的模块包含两类,一类称为标准库,随着python的安装而安装;
使用背景:今天在spring-cloud项目中,使用多线程异步调用微服务出现的错误Nothread-boundrequestfound:Areyoureferringtorequestattributesoutsideofanactualwebrequest,orprocessingarequestoutsideoftheoriginallyr...
传统信用评分中的评分卡中的A卡、B卡和C卡是什么意思。
# f-strings的目的:对字符串里面的动态数据进行设置# f字符串绑定数据的时候,需要使用{相关的数据/变量}# name = input("请输入姓名:")# age = input("请输入年龄:")## # 提示: fstrings设置数据使用: {数据/变量}# msg = f"姓名: {name} 年龄: {age}"# print(msg, type(msg))# 需求: 3 + 4 = 7num1 = float(input("请输入第一个数字:"))num.
Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。 本文主要解决问题:Homebrew常规安装太慢;以及通过brew install安装软件太慢,还有时不时的自动updating巨耗时的问题。