python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python BitMap算法去重

python BitMap算法处理20亿随机整数去重

作者:繁华落尽chen

这篇文章主要为大家介绍了python BitMap算法处理20亿随机整数去重,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

对于大量的随机整数,如何做到去重?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算法去重的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文