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算法去重的资料请关注脚本之家其它相关文章!

相关文章

  • python样条插值的实现代码

    python样条插值的实现代码

    这篇文章主要为大家详细介绍了python样条插值的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)

    Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)

    这篇文章主要介绍了Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 用代码帮你了解Python基础(1)

    用代码帮你了解Python基础(1)

    这篇文章主要用代码帮你了解Python基础,使用数据类型和变量以及字符串和格式化的示例代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • python定向爬虫校园论坛帖子信息

    python定向爬虫校园论坛帖子信息

    这篇文章主要为大家详细介绍了Python定向爬虫校园论坛帖子信息的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Python jieba结巴分词原理及用法解析

    Python jieba结巴分词原理及用法解析

    这篇文章主要介绍了Python jieba结巴分词原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • python实现查找excel里某一列重复数据并且剔除后打印的方法

    python实现查找excel里某一列重复数据并且剔除后打印的方法

    这篇文章主要介绍了python实现查找excel里某一列重复数据并且剔除后打印的方法,涉及Python使用xlrd模块操作Excel的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Python实现周日历与时间相互转换

    Python实现周日历与时间相互转换

    周日历是日常生活中不常用到的历法系统,一般用于政府、商务的会计年度或者学校教学日历中。本文为大家介绍了如何利用Python语言实现周日历与时间相互转换,感兴趣的可以学习一下
    2022-07-07
  • Python实现CET查分的方法

    Python实现CET查分的方法

    这篇文章主要介绍了Python实现CET查分的方法,实例分析了Python操作链接查询的技巧,需要的朋友可以参考下
    2015-03-03
  • Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)

    Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)

    本文主要简单的介绍使用Python处理txt汉字文字、二维列表排序和获取list下标的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • PyAutoGUI图形用户界面自动化的超详细教程

    PyAutoGUI图形用户界面自动化的超详细教程

    PyautoGUI是一个纯Python的自动化工具,能实现用程序自动控制鼠标和键盘操作,下面这篇文章主要给大家介绍了关于PyAutoGUI图形用户界面自动化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04

最新评论