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
(編輯:部分內容來互聯網)