用什么算法可以快速检索数据?Bitmap了解一下( 二 )


同样是刚才的例子,我们给出“90后”用户的Bitmap,再给出一个全量用户的Bitmap 。最终要求出的是存在于全量用户,但又不存在于“90后”用户的部分 。

用什么算法可以快速检索数据?Bitmap了解一下

文章插图
 
实现方式长度计算公式
int nSize = (width * bitPixel + 64) / 64 ;
(高效写法是(((width * bitPixel + 64)>>6)) )
【用什么算法可以快速检索数据?Bitmap了解一下】通过位移操作,可以很方便的扩容
而且越往上就是指数扩容,满足过亿级别数据量的时间复杂度也是O(1)
class MyBitmap:def __init__(self,size):self.words=[0]*(self.get_word_index(size-1)+1)self.size=sizedef get_bit(self,bit_index):if bit_index<0 or bit_index>self.size-1:raise Exception("超过Bitmap有效范围!")word_index=self.get_word_index(bit_index)return (self.words[word_index]&(1<<bit_index))!=0def set_bit(self,bit_index):if bit_index<0 or bit_index>self.size-1:raise Exception("超过Bitmap有效范围!")word_index=self.get_word_index(bit_index)self.words[word_index] |=(1<<bit_index)def get_word_index(self,bit_index):#右移6位,相当于除以64return bit_index>>6bitMap=MyBitmap(128)bitMap.set_bit(126)bitMap.set_bit(75)print(bitMap.get_bit(126))print(bitMap.get_bit(78))



推荐阅读