bitmap数据结构的原理、适用场景以及优缺点等在下链接中有详细说明,在此不再赘述。
https://blog.csdn.net/pipisorry/article/details/62443757?utm_source=itdadao&utm_medium=referral
最近在学python时,学到bitmap算法,于是搜了相关资料,看大家都在说原理及适用场景等,代码给的比较简略,仅给出bitmap数据结构最常用的方法,即排序、去重、查找的代码。在弄懂原理后,自己把实现代码写了一遍,与搜到的资料相比。增加了集合的相关操作方法(and_、or_、andNot、xor),相关用法参见注释。在此做下笔记,也供大家参考。
有三种初始化的方式:
1、bitmap = Bitmap()
不指定数据,也不指定最大值,通过bitmap.set(num)来增加数据,此方式为实际使用时的初始化方式,因为bitmap适用的场景是海量数据,也就是说无法一次性将数据加载到内存中,因此,也无法获取最大值,更无法获取全部的数据列表
2、bitmap = Bitmap(array=list)
以数据列表list初始化bitmap,此方式一般用于测试初始化
3、bitmap = Bitmap(maxValue=max)
指定最大值初始化,后续也是通过bitmap.set(num)来增加数据,如果大概知道要处理数据最大值时,可通过此方式初始化,避免在增加数据时频繁地改变数组大长度,提高性能。此方式指定的值即使不是数据中的最大值班也没关系,遇到最大值时,会自动地去改变数组的长度。
因此,推荐使用第3种方式初始化,但max的值要相对合理。
class Bitmap:
def __init__(self, maxValue=31,array=None):
if maxValue < 0 :
raise BaseException("最大值不能小于0。")
self.max = maxValue
if array:
self.max = int(max(array))
self.size = self.__getIndex(self.max)[0] + 1
self.array = [0] * self.size
if array:
for i in ran