美文网首页
子集枚举(S0=(S0-1)&S)

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

作者: kinoud | 来源:发表于2018-10-26 07:43 被阅读0次

    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开头,无论哪种情况,都会出现矛盾。

    相关文章

      网友评论

          本文标题:子集枚举(S0=(S0-1)&S)

          本文链接:https://www.haomeiwen.com/subject/ybnhtqtx.html