面试题:浅谈布隆过滤器

Posted Java面试那些事儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题:浅谈布隆过滤器相关的知识,希望对你有一定的参考价值。

转载:不只Java


今天,给大家分享一位读者的投稿,关于布隆过滤器的文章,分析的不错,希望对各位有所帮助。


问题情景


如果面试官问你,一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节。问这个黑名单要怎么存?若此时随便输入一个 url,如何判断该 url 是否在这个黑名单中?


对于第一个问题,如果把黑名单看成一个集合,将其存在 hashmap 中,貌似太大了,需要 640G,明显不科学。


那该怎么办?ok,现在该介绍今天的主角了 —— 布隆过滤器就可以解决这样的问题。


首先,布隆过滤器是什么?维基百科是这样解释的:


布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制矢量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。


官方说法看下就好,如果不理解没关系,其实不会难,下面我们讲人话慢慢来。


具体介绍


布隆过滤器实际上是一个很长的二进制矢量和一系列随机映射函数。


「很长的二进制矢量」:这是一个长度很长的数组,什么类型的数组呢?bit 类型的数组,也是我们说的「位」,(1Byte = 8bit,1KB = 1024Byte)。


「一系列随机映射函数」:有多个哈希函数。那什么是哈希函数呢?JDK 里面有计算得到哈希值的方法,那就是一个哈希函数。


布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难


这个不就可以解决我们最开始的问题吗?那它是怎么解决的呢?


解决过程


下面我说下大体的过程,细节部分可先不理解,重要的是明白流程,细节我后面补充。


假设,bit 类型数组的长度为 m,每个元素值为 0,有 k 个哈希函数。


首先,当输入一个 url 的时候,此时这个 url 会经过 k 个哈希函数处理,得到多个哈希值(v1,v2,...,vk)。之后分别将这些哈希值除以数组的长度 m,和对 m 取模,得到这些哈希值对应在数组的下标位置,最后将这些下标的元素都置为 1。


那么如何判断一个 url 在黑名单里面呢?输入一条 url,它经过上述处理之后,会得到多个数组的下标位置。如果这些下标的元素值都已经为 1 了,说明该在黑名单里面,否则不在。


总体就是这样的流程,下面说下大家可能存在的疑问。


1、bit 类型的数组如何构建

2、得到 v1,v2,...,vk 这些哈希值后,如何得到其在数组的下标位置,并将其设置为 1 呢?


两个问题我一起说下,Java 里面没有 bit 这样的类型,怎么构建呢?—— 不难,我们可以使用 int,一个 int 是 32 位。



因此上面再会说「分别将这些哈希值除以数组的长度 m,和对 m 取模,得到这些哈希值对应在数组的下标位置」。


具体我们可以拿一个哈希值 data 来举个栗子,假设 int 数组长度为 100。



使用效果


最开始我们提到,如果将 100 亿 url 放到 HashMap 中需要 640GB,那么使用布隆过滤器后又需要多少空间呢?答案是约等于 23 GB。相比之下,这个空间大小是不是就可以接受很多了。


缺点


布隆过滤器有宁可错杀一百,也不能放过一个的性质。讲人话就是属于黑名单的 url 一定能够正确判断它在黑名单中,但不属于黑名单中的 url 也可能会被认为在黑名单中,存在一定的失误率。


至于失误率要保持在多少,数组长度,哈希函数的个数分别要设置多少就需要根据实际情况来选择了,网上有对应的数学公式计算,这里就不展开讲了。


后记


最后碎碎念一下,由于最近在准备面试,所以最近的推文可能会比较偏向笔试面试的问题,未来可能会有数据结构和算法的内容,这个真的是我的软肋哈,以前挖的坑现在终于来填了。


......


10 月 28 日上午 10 时 8 分,重庆市万州区一辆公交车与一辆小轿车在万州区长江二桥相撞后,公交车坠入江中。事情发生没多久,相关部门便全力开展搜救打捞,紧接着打捞落水人员遗体,并在 30 日找到了公交车内的黑匣子。目前,已经确定事发时在车上的 15 名受害人中,已经有 13 人打捞上来并确定身份,还有 2 人仍未找到。相关人员将黑匣子数据还原后,发现源头竟然是乘客与司机互殴导致车辆失控,而后坠入江中。


透过这个事件,我想说的是,当你坐上公交车后,你的性命就交给了这辆公交车的司机,而在这个时间段与能操控你生命的人吵架,到底是蠢还是智呢。。。


转发也是一种支持。

—————END—————

看更多好文

请长按下方图片扫码关注



以上是关于面试题:浅谈布隆过滤器的主要内容,如果未能解决你的问题,请参考以下文章

哈希应用及海量数据面试题

浅谈布隆过滤器

c++——海量数据处理各种面试题(位图的实现和应用,布隆过滤器的应用,哈希切分)

哈量数据处理面试题(哈希切割,位图,布隆过滤器)

位图及布隆过滤器的模拟实现与面试题

解释一下布隆过滤器原理