国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python實現bitmap數據結構詳解

2020-02-23 05:11:49
字體:
來源:轉載
供稿:網友

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 個數組元素上。

所以獲取最大整數很重要,否則有可能創建的數組容納不下某些數據。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德阳市| 吴江市| 集贤县| 青铜峡市| 阿巴嘎旗| 满洲里市| 辰溪县| 获嘉县| 英吉沙县| 凤凰县| 宣武区| 湖口县| 无棣县| 金昌市| 麦盖提县| 鸡东县| 甘谷县| 武鸣县| 仁怀市| 红原县| 济阳县| 阜新市| 威宁| 雷山县| 沧源| 黄骅市| 隆安县| 朝阳区| 土默特右旗| 肇州县| 宝清县| 漠河县| 方城县| 成武县| 湖州市| 辛集市| 瑞昌市| 夏邑县| 红原县| 谢通门县| 青浦区|