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

 更新时间:2024年01月05日 10:33:41   作者:繁华落尽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算法去重的资料请关注脚本之家其它相关文章!

相关文章

  • 解决pip install xxx报错SyntaxError: invalid syntax的问题

    解决pip install xxx报错SyntaxError: invalid syntax的问题

    今天小编就为大家分享一篇解决pip install xxx报错SyntaxError: invalid syntax的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • 一篇文章弄懂Python中所有数组数据类型

    一篇文章弄懂Python中所有数组数据类型

    这篇文章主要给大家介绍了关于Python中所有数组数据类型的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Python面向对象封装操作案例详解 II

    Python面向对象封装操作案例详解 II

    这篇文章主要介绍了Python面向对象封装操作,结合案例形式详细分析了Python面向对象在游戏中封装角色的属性、动作相关原理与使用技巧,需要的朋友可以参考下
    2020-01-01
  • Python龙贝格法求积分实例

    Python龙贝格法求积分实例

    今天小编就为大家分享一篇Python龙贝格法求积分实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python安装教程全过程(2022最新)

    Python安装教程全过程(2022最新)

    这篇文章主要介绍了Python安装教程全过程(2022最新版本),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 详解Python如何利用Pandas与NumPy进行数据清洗

    详解Python如何利用Pandas与NumPy进行数据清洗

    许多数据科学家认为获取和清理数据的初始步骤占工作的 80%,花费大量时间来清理数据集并将它们归结为可以使用的形式。本文将利用 Python 的 Pandas和 NumPy 库来清理数据,需要的可以参考一下
    2022-04-04
  • Python如何将list中的string转换为int

    Python如何将list中的string转换为int

    这篇文章主要介绍了Python如何将list中的string转换为int,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • django-crontab 定时执行任务方法的实现

    django-crontab 定时执行任务方法的实现

    这篇文章主要介绍了django-crontab 定时执行任务方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Tkinter组件实现Radiobutton的示例

    Tkinter组件实现Radiobutton的示例

    Radiobutton组件用于实现多选一的问题,本文主要介绍了Tkinter组件实现Radiobutton的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Pytorch反向传播中的细节-计算梯度时的默认累加操作

    Pytorch反向传播中的细节-计算梯度时的默认累加操作

    这篇文章主要介绍了Pytorch反向传播中的细节-计算梯度时的默认累加操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论