美文网首页python爱好者
Python数据结构实现Bitmap

Python数据结构实现Bitmap

作者: 狗子渣渣 | 来源:发表于2016-01-15 20:59 被阅读1672次

    Bitmap

    bitmap是很常用的数据结构,比如用于Bloom Filter中;用于无重复整数的排序等等。bitmap通常基于数组来实现,数组中每个元素可以看成是一系列二进制数,所有元素组成更大的二进制集合。

    Bitmap的定义

    bitmap是很常用的数据结构,比如用于Bloom Filter中;用于无重复整数的排序等等。bitmap通常基于数组来实现,数组中每个元素可以看成是一系列二进制数,所有元素组成更大的二进制集合。简单的来说,这种数据结构存储把原来的数转化成二进制储存,每一位占一个储存单元,我们操作bimap中的数据,就相当于操作一个位。对于Python来说,整数类型默认是有符号类型,所以一个整数的可用位数为31位。

    Bitmap的操作

    如果我们想操作某一位数,要先获取到操作数组的第几个元素,再获取相应的位索引,然后执行操作。操作的过程大致分为初始化bitmap、计算在数组中的索引、计算在数组中的位索引、相关位置1、测试相关位。

    初始化bitmap

    初始化bitmap也就是计算所需数组的大小,通常采用对最大数向上取整的方法,如果可以找到储存最大数的数组,那么其他数就不成问题了。

    class Bitmap():
        def __init__(self,max):
        self.size = int ((max + 31 - 1) / 31) #max需要传入的为要排序的最大数
    

    计算在数组中的索引

    计算在数组中的索引与初始化btimap不同的是采用向下取整的方法,其他相同。

    计算在数组中的位索引

    数组元素中的位索引可以通过取模运算来得到。令需存储的整数跟31取模即可得到位索引

    def bitindex(self,num):
        return num % 31
    

    相关位置1

    二进制位默认是0,将某位置1则表示在此位存储了数据

    def set_1(self,num):
        elemindex = num / 31
        byteindex = self.bitindex(num)
        ele = self.array[elemindex]
        self.array[elemindex] = ele | (1 << byteindex)
    

    测试相关位

    判断某位是否为1是为了取出之前所存储的数据

    def test_1(self,i):
        elemindex = i / 31
        byteindex = self.bitindex(i)
        if self.array[elemindex] & (1 << byteindex):
            return True
        return False
    

    源代码

    # -*- encoding:utf-8 -*-
    class Bitmap():
        def __init__(self,max):
            '确定所需数组个数'
            self.size = int ((max + 31 - 1) / 31)
            self.array = [0 for i in range(self.size)]
    
        def bitindex(self,num):
            '确定数组中元素的位索引'
            return num % 31
    
        def set_1(self,num):
            '将元素所在的位置1'
            elemindex = num / 31
            byteindex = self.bitindex(num)
            ele = self.array[elemindex]
            self.array[elemindex] = ele | (1 << byteindex)
    
        def test_1(self,i):
            '检测元素存在的位置'
            elemindex = i / 31
            byteindex = self.bitindex(i)
            if self.array[elemindex] & (1 << byteindex):
                return True
            return False
    if __name__ == '__main__':
        Max = ord('z')
        suffle_array = [x for x in 'qwelmfg']
        result = []
        bitmap = Bitmap(Max)
        for c in suffle_array:
            bitmap.set_1(ord(c))
        for i in range(Max+1):
            if bitmap.test_1(i):
                result.append(chr(i))
        print u'原始数组为:    %s' % suffle_array
        print u'排序后的数组为: %s' % result

    相关文章

      网友评论

      本文标题:Python数据结构实现Bitmap

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