python BitMap算法处理20亿随机整数去重
作者:繁华落尽chen
前言
对于大量的随机整数,如何做到去重?BitMap是个很不错的选择,本篇文章就带大家认识BitMap的奇妙之处
什么是BitMap
BitMap的基本原理是用一个 bit 来标记某个元素对应的 Value,而 Key 即是该元素。由于采用一 个bit 来存储一个数据,因此可以大大的节省空间。
普通数据储存
我们知道,当我们随意向计算机输入一个数字,这个数字绝对不是以其本身的数值形式储存在计算机内存中的,而储存形式就是二进制。
比如我们输入8,那么计算机中会储存为1000。每种计算机中的字符的最小储存单位就是字节,一个字节有8位,所以至少也是00001000。也正因此一个字节最大能储存11111111这个二进制数值(代表255)。这样看一个字节绝对不够用啊,所以一般还需要更多的字节来储存大一点的数字。
在每种编程语言中所用于储存数字的字节数可能不同,在Python3版本中int类型是动态长度的,因此理论可以存非常大的数字了。
BitMap储存方式
BitMap的作用是为了达到数据去重或者储存,那么肯定是将要存储的东西变得越少越好,在BitMap思想中使用bit来储存每一个值。一起来看下面这张图:
上图只画了四个位,可以看到框内的是分别的四个位,四个位上有的地方为1,有的地方为0,之后这几个位综合起来形成一个我们熟知的十进制数值。这个十进制数值就储存着BitMap储存的数值。比如上面的5可以存储1,3两个数,15可以存储1,2,3,4这几个数。这下懂了吧,实际上就是在哪个位上有一个1就是代表这里存储了一个数字,这就是BitMap储存数据的原理
为什么BitMap可以对大数据进行去重
在BitMap思想中使用bit来储存每一个值。如果要储存相同的数字,那么在BitMap中这些数字会被储存在同一个位置,这样就会导致数据重复,无法达到去重的目的。因此,BitMap不能储存相同的数字,利用这个特性,BitMap可以对大数据进行去重。
下面是使用Python实现最基础的BitMap算法的代码:
import array class BitMap: def __init__(self, max_num): self.max_num = max_num self.arr = array.array('B', [0] * (max_num // 8 + 1)) def set(self, num): index = num // 8 bit = num % 8 self.arr[index] |= 1 << bit def get(self, num): index = num // 8 bit = num % 8 return self.arr[index] & (1 << bit) != 0 def remove_duplicates(self, nums): for num in nums: if self.get(num): continue self.set(num) yield num
这个类中,我们定义了三个方法:__init__、set和get。__init__方法初始化了一个数组,用于存储BitMap的数据。set方法用于设置某个数字的状态,get方法用于获取某个数字的状态。remove_duplicates方法用于对数据进行去重。这里我们使用了Python中的array库来直接操作bit数组。
这是一个最基础的BitMap算法的实现,如果您想要更深入地了解BitMap算法,可以参考其他更高级的实现方式。
更多关于python BitMap算法去重的资料请关注脚本之家其它相关文章!