Python数据结构实现Bitmap

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
    原文作者:狗子渣渣
    原文地址: https://www.jianshu.com/p/808706862738
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞