从另一个角度看大数据量处理利器 布隆过滤器

思路:从简单的排序谈到BitMap算法,再谈到数据去重问题,谈到大数据量处理利器:布隆过滤器

情景1:对无重复的数据进行排序

@给定数据(2,4,1,12,9,7,6)如何对它排序?

方法1:基本的排序方法包括冒泡,快排等。

方法2:使用BitMap算法

方法1就不介绍了,方法2中所谓的BitMap是一个位数组,跟平时使用的数组的唯一差别在于操作的是位。

首先是开辟2个字节大小的位数组,长度为16(该长度由上述数据中最大的数字12决定的)如图


 
      然后,读取数据,2存放在位数组中下标为1的地方,值从0改为1,4存放在下标为3的地方,值从0改为1....结果如图

最后,读取该位数组,得到排好序的数据是:(1,2,4,6,7,9,12)

比较方法1和方法2的差别:方法2中,排序需要的时间复杂度和空间复杂度很依赖与数据中最大的数字比如12,因此空间上讲需要开2个字节大小的内存,时间上需要遍历完整个数组。当数据类似(1,1000,10万)只有3个数据的时候,显然用方法2,时间复杂度和空间复杂度相当大,但是当数据比较密集时该方法就会显示出来优势。

情景2:对有重复的数据进行判重

数据(2,4,1,12,2,9,7,6,1,4)如何找出重复出现的数字?

首先是开辟2个字节大小的位数组,长度为16(该长度由上述数据中最大的数字12决定的)如图

当读取完12后,数组中的数据如下图:

当读取2的时候,发现数组中的值是1,则判断出2是重复出现的。

应用

应用1:某文件中包含一些8位的电话号码,统计出现的号码的个数?(判断有谁出现)

8为最大是99 999 999,大约是99M的bit,12.5MB的内存,就可以统计出来出现的号码。

应用2:某文件中包含一些8位的电话号码,统计只出现一次的号码?(判断有谁出现并且指出现1次)

需要扩展一下,可以用两个bit表示一个号码,0代表没有出现过,1代表只出现过1次,2代表至少出现2次。

应用3:有两个文件,文件1中有1亿个10位的qq号码,文件2中有5千万个10位qq号码,判断两个文件中重复出现的qq号。

首先建立10的10次方个大小的位数组(占用内存大约是1.25G),全部初始化为0,读取第一个文件,对应的qq号存放到对应的未知,数值改为1,如果重复出现仍是1.读取完毕第一个文件后,读取第二个文件,对应的位置为1则表示重复出现。

应用4:有两个文件,文件1中有1亿个15位的qq号码,文件2中有5千万个15位的qq号码,判断两个文件中重复出现的qq号。

应用4中,qq号码上升为15位的时候,显然内存是不够用了,这个时候怎么办?使用Bloom
Filter(布隆过滤器)

Bloom Filter(布隆过滤器):

对于Bit-Map分析一下,每次都会开辟一块表示最大数值大小的bit数组,比如情景1中的16,将对应的数据经过映射到bit数组的下标,这其实是一种最简单的hash算法,对1去模。在上述应用4中,当qq号码改为15位的时候,Bit-Map就不太好用了,如何改进呢?解决办法:减少bit数组的长度,但是增加hash函数的个数

对于每一个qq号码,我用K个hash函数,经过k次映射,得到k个不同位置,假设k=3,那么对于一个qq号码,映射到位数组中3个不同的位置

当读取第二个包含5千万个qq号码的文件的时候,使用同样的3个hash函数进行映射,当3个位置全部是1的时候才表示出现过,否则表示没有出现过。

有什么疑问吗?

显然,对于一个qq号码,如果它在第一个文件中没有出现过,但是它映射的3个位置已经全部是1的情况会有吗?答案是会的,但是这种概率是可控的,可控的意思是:这种误差跟hash函数的个数和质量是有关系的,可以通过控制hash函数的个数和位数组的大小来控制误差概率。至于表示3者之间的关系精确的数学公式就不再详细研究了。

可以这样讲,布隆过滤器是Bit-Map的进一步扩展,对于大数据量判重,布隆过滤器可以在内存中进行判断,避免了对磁盘的读写,效率是很高的。以上是自己关于两者的理解,有错误望指教。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/kwincaq/p/10432118.html

时间: 2024-08-08 11:08:09

从另一个角度看大数据量处理利器 布隆过滤器的相关文章

一个坑poi大数据量导入时的java.lang.IllegalStateException: Zip File is closed

本帖子没有答案,只是说一下坑,余下的自己决定. Caused by: java.lang.IllegalStateException: Zip File is closed at org.apache.poi3.openxml4j.util.ZipFileZipEntrySource.getEntries(ZipFileZipEntrySource.java:45) at org.apache.poi3.openxml4j.opc.ZipPackage.getPartsImpl(ZipPacka

[算法系列之十]大数据量处理利器:布隆过滤器

[引言] 在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中.比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断 它是否在已知的字典中):在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上:在网络爬虫里,一个网址是否被访问过等等.最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新 元素时,将它和集合中的元素直接比较即可.一般来讲,计算机中的集合是用哈希表(hash table)来存储的.它的好处是快速准确,缺点是费存储空间.当集合比较小时,这个问题

企业级控件库之大数据量分页控件(转)

在上篇:我介绍了原创企业级控件库之组合查询控件,这篇我将给大家介绍:企业级控件库之大数据量分页控件.  摘要  说到分页,大家采用的方法各有千秋,分页在一个中大型软件项目中对数据的快速呈现起到很关键的作用,试想一个数据量上几十万或者几百万的数据表,要是没有分页功能会是一个什么样的效果.总的说来,大家采用的分页方法大同小异,但到底那种方法才是最佳的呢,各有各的看法,让数据说话最有效.今天我给大家分享一个WinForm下大数据量分页控件(当然分页思想也可用于WebForm).虽然不能说是最佳的,但在

大数据量下高并发同步的讲解(不看,保证你后悔)

对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步吧. 为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步    1.同步和异步的区别和联系          所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到 返回的值或消息后才往下执行其它的命令. 异步

大数据量下高并发同步的讲解(不看,保证你后悔!)

偶然的机会在网上看到了这篇blog,觉得作者写得挺不错的(虽然自己并没有怎么看懂...),所以就转来跟大家分享分享吧~~~ 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步吧. 为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步    1.同步和异步的区别和联系          所谓同步,可以理解为在执行完

解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接

开发中所用的数据需要通过WCF进行数据传输,结果就遇到了WCF大量传输问题 也就是提示System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接 网上解决方案都是千篇一律互相转发的,并且没有明确的解决方案或者按照,各个博客中的解决方案都没能解决这个问题. 为此我整整浪费了一天时间用来解决这个问题,而且用了最笨的办法一点点的尝试网上所查到的方案.对于精研WCF来说的这可能是一个小问题,但是对于仅仅了解wcf,一知半解的会很困惑.将解决方案贴出来希望能帮

数据库水平分表(一个大数据量的表)

一.当一张表很大时,比如微信账号.facebook账号.QQ号.谷歌账号系统等,都是大数据量的一张表结构.那么必然需要进行拆分,即水平拆分. 二.表的水平拆分规则. 原文地址:https://www.cnblogs.com/igoodful/p/8974988.html

并发问题:大数据量的訪问

今天突然关注到这个问题,从网上看了非常多,受益良多.记录下来,以后回想~ 之前在工作中就遇到过这样的情况.两个用户同一时候操作一条记录,A用户查询某条记录,B用户把这条记录删除,A用户将查询的某条记录的某些值保存到其它的表里.这个bug也是困扰了好久,由于A用户的这种方法特别复杂,运行的时间比較长,所以这个问题出现的概率还非常高的呢.后来的解决方法是,A用户在最后保存前,再查一下这条记录.是从代码逻辑方面解决的这个问题,确实好了非常多,但始终认为是治标不治本. 今天看完以后认为有更好的解决方法的

并发问题:大数据量的访问

今天突然关注到这个问题,从网上看了很多,受益良多.记录下来,以后回顾~ 之前在工作中就遇到过这种情况,两个用户同时操作一条记录,A用户查询某条记录,B用户把这条记录删除,A用户将查询的某条记录的某些值保存到其他的表里.这个bug也是困扰了好久,因为A用户的这个方法特别复杂,执行的时间比较长,所以这个问题出现的概率还很高的呢.后来的解决方法是,A用户在最后保存前,再查一下这条记录.是从代码逻辑方面解决的这个问题,确实好了很多,但始终觉得是治标不治本.今天看完以后觉得有更好的解决方法的呢. part