美文网首页程序员
集合的整数表示

集合的整数表示

作者: 三川_8f54 | 来源:发表于2017-10-28 23:53 被阅读0次

有一类问题是需要表示包含N个索引数字集合S = {0,1,...,n-1}的某个子集,这种子集(假设有k个元素,k<=n)可以用一个整数表示:

SK = 2^a1 + 2^a2 +... + 2^ak

subs={a1,a2,...,ak}

SK是subs的整数表示,这种方法可以基于位操作快速的实现某些集合运算,在编程竞赛中常常用到。

1.判断某个索引数字i是否在集合里

2.吧数字i从集合中删除

3.增加数字i

4.求所有的子集

5.求所有含k个元素的子集

python source code:


#to encode a set into a integer will give a more concise representation of  a small set which only contains
#elements from range(0,n)

class IntegerEncodedSet(object):

    def __init__(self,num):
        self.n = num

    def setsize(self):
        l,r=0,31
        while r-l>1:
            e = (l+r)/2

            if (1 << e) == self.n:
                return e+1
            if (1<<e) < self.n:
                l = e
            else:
                r = e
        return r


    def contains(self, element):
        return  (self.n>>element & 1) == 1

    def add(self,element):
        self.n=self.n|(1<<element)

    def remove(self,element):
        self.n=self.n&~(1<<element)

    def allsubsets(self):
        allsubsetIntegers=[self.n]
        sub = (self.n -1)&self.n
        while sub!=self.n:
            allsubsetIntegers.append(sub)
            sub = (sub -1)&self.n
        return allsubsetIntegers


    def all_klength_subsets(self,k):
        if k>=self.n:
            return []
        m = (1<<k)-1
        k_length_subsets=[]
        n = self.setsize()

        while  ( m < (1<<n)):
            x = m & - m
            y = m + x
            m = ((m&~y)/x >> 1) | y  #lex order of binary format of encoded set
            if (m&self.n==m):
                k_length_subsets.append(m)

        return k_length_subsets

相关文章

  • 集合的整数表示

    有一类问题是需要表示包含N个索引数字集合S = {0,1,...,n-1}的某个子集,这种子集(假设有k个元素,k...

  • intset.c

    Redis中的intset,表示整数集合,用来存储整数,在set数据结构中用到。 intset的数据结构如下: 1...

  • 6.整数集合

    整数集合 1. 整数集合的实现 整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_...

  • lq_xunlian_Main10(集合运算)

    问题描述给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。输入格式第一行为一个整数n,表示集合A中的...

  • 第 6 章 整数集合

    整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的数量不多时,Redis 就会使用整数集合...

  • 整数集合

    整数集合 整数集合(intset)是 Redis 用于保存整数值的集合抽象数据结构, 它可以保存类型为 >int1...

  • 快速整明白Redis中的整数集合到底是个啥

    整数集合简介 整数集合(intset)是Redis集合数据类型的内部编码之一,当集合数据类型中的元素都是整数并且元...

  • 整数集合

    整数集合是用在我们在存储value集合,其中value是整数,当然数量过多的时候还是会变成链表。 在intset....

  • 整数集合

    整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,redi...

  • Redis-数据结构-整数集合、压缩列表

    一、整数集合 整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且元素数量不多,Red...

网友评论

    本文标题:集合的整数表示

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