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