子集枚举(S0=(S0-1)&S)

S是一个二进制数,表示一个集合,可以用S0=S(初始),S0=(S0-1)&S(下一个)这种方法枚举遍S的所有子集。
注意到这种枚举方法是二进制数值上从大到小枚举子集的。用归纳法证明合理性,假设枚举到某个S0,大于它的所有S子集都枚举过了,下一个枚举S1=(S0-1)&S,需要证明S1是S0紧挨着的下一个子集,才能保证枚举不漏,也就是要证明区间(S1,S0)里不存在S的其他子集。
设S0以k(k=0,1,2…)个0结尾,S0=xxxx10...0,则S0-1=xxxx01...1,S1=(S0-1)&S,易见S1是以xxxx0开头的最大子集,而S0是以xxxx1开头的最小子集,如果存在某子集S1<Sx<S0,Sx要么以xxxx0开头,要么以xxxx1开头,无论哪种情况,都会出现矛盾。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 各位小伙们,我所在的城市正在下雨,雨中的月季,叶子似乎也更青翠欲滴,雨水滴落在叶子上,花蕾上,晶莹剔透犹如露珠,月...
    乘格帆阅读 1,255评论 4 3
  • 今天晚上一直陷入了抱怨模式当中。主要的起因是因为老公給孩子换衣服的时候,孩子不配合,老公就动手打了孩子。正是因为这...
    薛成成阅读 871评论 0 1
  • 当坚持成为习惯
    万十千阅读 119评论 0 0