bitmap是很常见的算法设计,例如用以Bloom Filter中;用以无反复整数金额的排列这些。bitmap一般根据数组来完成,数组中每一个原素能够当做是一系列二进制数,全部元素组成更高的二进制结合。针对Python而言,整数金额种类默认设置是有标记种类,因此 一个整数金额的能用十位数为31位。
bitmap完成构思
bitmap是用以对每一位开展实际操作。举例来说,一个Python数组包括4个32位系统有标记整形,则一共能用位为4 * 31 = 124位。假如要在第90个二进制位上实际操作,则要先获得到实际操作数组的第几个原素,再获得相对的位数据库索引,随后实行实际操作。
图中所显示为一个32位系统整形,在Python中默认设置是有标记种类,最大位为标记位,bitmap不可以应用它。左侧是上位,右侧是底位,最少位为第0位。
bitmap是用以对每一位开展实际操作。举例来说,一个Python数组包括4个32位系统有标记整形,则一共能用位为4 * 31 = 124位。假如要在第90个二进制位上实际操作,则要先获得到实际操作数组的第几个原素,再获得相对的位数据库索引,随后实行实际操作。
复位bitmap
最先必须复位bitmap。拿90这一整数金额而言,由于单独整形只有应用31位,因此 90除于31并向上取整则可获知必须好多个数组原素。编码以下:
编码以下:
#!/usr/bin/env python
#coding: utf8
class Bitmap(object):
def __init__(self, max):
self.size = int((max 31 – 1) / 31) #向上取整
if __name__ == ‘__main__’:
bitmap = Bitmap(90)
print ‘必须 %d 个原素。’ % bitmap.size
编码以下:
$ python bitmap.py
必须 3 个原素。
测算在数组中的数据库索引
测算在数组中的数据库索引实际上是跟以前测算数组尺寸是一样的。只不过是以前是对最大值测算,如今换为任一必须储存的整数金额。可是有一点不一样,测算在数组中的数据库索引是向下取整,因此 必须改动calcElemIndex方式的完成。编码改成以下:
编码以下:
#!/usr/bin/env python
#coding: utf8
class Bitmap(object):
def __init__(self, max):
self.size = self.calcElemIndex(max, True)
self.array = [0 for i in range(self.size)]
def calcElemIndex(self, num, up=False):
”’up为True则为向上取整, 不然为向下取整”’
if up:
return int((num 31 – 1) / 31) #向上取整
return num / 31
if __name__ == ‘__main__’:
bitmap = Bitmap(90)
print ‘数组必须 %d 个原素。’ % bitmap.size
print ’47 应储存在第 %d 个数组原素上。’ % bitmap.calcElemIndex(47)
编码以下:
$ python bitmap.py
数组必须 3 个原素。
47 应储存在第 1 个数组原素上。
因此 获得较大 整数金额很重要,不然有可能建立的数组容下下不来一些数据信息。
测算在数组原素中的位数据库索引
数组原素中的位数据库索引能够根据取模运算来获得。令需储存的整数金额跟31牙模型就可以获得位数据库索引。编码改成以下:
编码以下:
#!/usr/bin/env python
#coding: utf8
class Bitmap(object):
def __init__(self, max):
self.size = self.calcElemIndex(max, True)
self.array = [0 for i in range(self.size)]
def calcElemIndex(self, num, up=False):
”’up为True则为向上取整, 不然为向下取整”’
if up:
return int((num 31 – 1) / 31) #向上取整
return num / 31
def calcBitIndex(self, num):
return num % 31
if __name__ == ‘__main__’:
bitmap = Bitmap(90)
print ‘数组必须 %d 个原素。’ % bitmap.size
print ’47 应储存在第 %d 个数组原素上。’ % bitmap.calcElemIndex(47)
print ’47 应储存在第 %d 个数组原素的第 %d 位上。’ % (bitmap.calcElemIndex(47), bitmap.calcBitIndex(47),)
别忘记是以第0位算起哦。
置1实际操作
二进制位默认设置是0,将某部位1则表明在这里位储存了数据信息。编码改成以下:
编码以下:
#!/usr/bin/env python
#coding: utf8
class Bitmap(object):
def __init__(self, max):
self.size = self.calcElemIndex(max, True)
self.array = [0 for i in range(self.size)]
def calcElemIndex(self, num, up=False):
”’up为True则为向上取整, 不然为向下取整”’
if up:
return int((num 31 – 1) / 31) #向上取整
return num / 31
def calcBitIndex(self, num):
return num % 31
def set(self, num):
elemIndex = self.calcElemIndex(num)
byteIndex = self.calcBitIndex(num)
elem = self.array[elemIndex]
self.array[elemIndex] = elem | (1 byteIndex)
if __name__ == ‘__main__’:
bitmap = Bitmap(90)
bitmap.set(0)
print bitmap.array
由于从第0位算起,因此 如必须储存0,则必须把第0部位1。
清0实际操作
将某部位0,也即丢掉已储存的数据信息。编码以下:
编码以下:
#!/usr/bin/env python
#coding: utf8
class Bitmap(object):
def __init__(self, max):
self.size = self.calcElemIndex(max, True)
self.array = [0 for i in range(self.size)]
def calcElemIndex(self, num, up=False):
”’up为True则为向上取整, 不然为向下取整”’
if up:
return int((num 31 – 1) / 31) #向上取整
return num / 31
def calcBitIndex(self, num):
return num % 31
def set(self, num):
elemIndex = self.calcElemIndex(num)
byteIndex = self.calcBitIndex(num)
elem = self.array[elemIndex]
self.array[elemIndex] = elem | (1 byteIndex)
def clean(self, i):
elemIndex = self.calcElemIndex(i)
byteIndex = self.calcBitIndex(i)
elem = self.array[elemIndex]
self.array[elemIndex] = elem (~(1 byteIndex))
if __name__ == ‘__main__’:
bitmap = Bitmap(87)
bitmap.set(0)
bitmap.set(34)
print bitmap.array
bitmap.clean(0)
print bitmap.array
bitmap.clean(34)
print bitmap.array
清0和置1是互反实际操作。
检测一位是不是为1
分辨一位是不是为1是为了更好地取下以前所储存的数据信息。编码以下:
编码以下:
#!/usr/bin/env python
#coding: utf8
class Bitmap(object):
def __init__(self, max):
self.size = self.calcElemIndex(max, True)
self.array = [0 for i in range(self.size)]
def calcElemIndex(self, num, up=False):
”’up为True则为向上取整, 不然为向下取整”’
if up:
return int((num 31 – 1) / 31) #向上取整
return num / 31
def calcBitIndex(self, num):
return num % 31
def set(self, num):
elemIndex = self.calcElemIndex(num)
byteIndex = self.calcBitIndex(num)
elem = self.array[elemIndex]
self.array[elemIndex] = elem | (1 byteIndex)
def clean(self, i):
elemIndex = self.calcElemIndex(i)
byteIndex = self.calcBitIndex(i)
elem = self.array[elemIndex]
self.array[elemIndex] = elem (~(1 byteIndex))
def test(self, i):
elemIndex = self.calcElemIndex(i)
byteIndex = self.calcBitIndex(i)
if self.array[elemIndex] (1 byteIndex):
return True
return False文章内容来源于:www.seo-7.comwww.sEo-6.comhttp://www.seo-6.com/seoyh/seojichurm/118357.html
(编辑:部分内容来互联网)