题目描述

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

题目解析

这是一道经常在面试中出现的算法题。凭借着题目极其容易描述,电面的时候也出现过。

不考虑细节的话,此题就是一个简单的查找问题。对于查找问题而言,使用散列表来处理往往是一种效率比较高的方案。

但是,如果你在面试中回答使用散列表,接下来面试官肯定会问你:然后呢?如果你不能回答个所以然,面试官就会面无表情的通知你:今天的面试到此结束,我们会在一周内给你答复。

为什么不能用散列表

100 亿是一个很大的数量级,这里每条 url 平均 64 字节,全部存储的话需要 640G 的内存空间。又因为使用了散列表这种数据结构,而散列表是会出现散列冲突的。为了让散列表维持较小的装载因子,避免出现过多的散列冲突,需要使用链表法来处理,这里就要存储链表指针。因此最后的内存空间可能超过 1000G 了。

只是存储个 url 就需要 1000G 的空间,老板肯定不能忍!

位图(BitMap)

这个时候就需要拓展一下思路。首先,先来考虑一个类似但更简单的问题:现在有一个非常庞大的数据,比如有 1 千万个整数,并且整数的范围在 1 到 1 亿之间。那么如何快速查找某个整数是否在这 1 千万个整数中呢?

需要判断该数是否存在,也就是说这个数存在两种状态:存在( True )或者不存在(False)。

因此这里可以使用一个存储了状态的数组来处理。这个数组特点是大小为 1 亿,并且数据类型为布尔类型( True 或者 False )。然后将这 1 千万个整数作为数组下标,将对应的数组值设置成 True,比如,整数 233 对应下标为 233 的数组值设置为 True,也就是 array[ 233 ] = True。

这种操作就是位图法:就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。

另外,位图法有一个优势就是空间不随集合内元素个数的增加而增加。它的存储空间计算方式是找到所有元素里面最大的元素(假设为 N ),所占空间为:

计算公式

因此,当 N 为 1 亿的时候需要 12MB 的存储空间。当 N 为 10 亿的时候需要 120MB 的存储空间了。也就是说:位图法的所占空间随集合内最大元素的增大而增大。这就会带来一个问题,如果查找的元素数量少但其中某个元素的值很大,比如数字范围是 1 到 1000 亿,那消耗的空间不容乐观。

因此,出于性能和内存占用的考虑,在这里使用布隆过滤器才是最好的解决方案:布隆过滤器是对位图的一种改进。

布隆过滤器

布隆过滤器(英语:Bloom Filter)是 1970 年由 Burton Bloom 提出的。

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

可以用来判断一个元素是否在一个集合中。它的优势是只需要占用很小的内存空间以及有着高效的查询效率。

对于布隆过滤器而言,它的本质是一个位数组:位数组就是数组的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1。

布隆过滤器除了一个位数组,还有 K 个哈希函数。当一个元素加入布隆过滤器中的时候,会进行如下操作:

  • 使用  K 个哈希函数对元素值进行 K 次计算,得到 K 个哈希值。

  • 根据得到的哈希值,在位数组中把对应下标的值置为 1。

举个例子,假设布隆过滤器有 3 个哈希函数:f1, f2, f3 和一个位数组 arr。现在要把 2333 插入布隆过滤器中:

  • 对值进行三次哈希计算,得到三个值 n1, n2, n3。

  • 把位数组中三个元素 arr[n1], arr[n2], arr[3] 都置为 1。

当要判断一个值是否在布隆过滤器中,对元素进行三次哈希计算,得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。

布隆

很明显,数组的容量即使再大,也是有限的。那么随着元素的增加,插入的元素就会越多,位数组中被置为 1 的位置因此也越多,这就会造成一种情况:当一个不在布隆过滤器中的元素,经过同样规则的哈希计算之后,得到的值在位数组中查询,有可能这些位置因为之前其它元素的操作先被置为 1 了

所以,有可能一个不存在布隆过滤器中的会被误判成在布隆过滤器中。这就是布隆过滤器的一个缺陷。但是,如果布隆过滤器判断某个元素不在布隆过滤器中,那么这个值就一定不在布隆过滤器中。总结就是:

  • 布隆过滤器说某个元素在,可能会被误判

  • 布隆过滤器说某个元素不在,那么一定不在

用英文说就是:

False is always false. True is maybe true。

使用场景

布隆过滤器的最大的用处就是,能够迅速判断一个元素是否在一个集合中。因此它有如下三个使用场景:

  • 网页爬虫对 URL 的去重,避免爬取相同的 URL 地址

  • 进行垃圾邮件过滤:反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱(同理,垃圾短信)

  • 有的黑客为了让服务宕机,他们会构建大量不存在于缓存中的 key 向服务器发起请求,在数据量足够大的情况下,频繁的数据库查询可能导致 DB 挂掉。布隆过滤器很好的解决了缓存击穿的问题。

推荐阅读:

几道和「堆栈、队列」有关的面试算法题

几道和「哈希表」有关的面试算法题

链表算法面试问题?看我就够了!

欢迎关注这个会做动画的程序员?

在看文章么?

拜托,面试官别问我「布隆」了相关推荐

  1. 几道 BAT 算法面试中经常问的「字符串」问题

    https://www.toutiao.com/a6675839856192520711/ String 作为最常见的编程语言类型之一,在算法面试中出现的频率极高. 1. 验证回文串 题目来源于 Le ...

  2. 【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!

    写在前面 今天想写一篇使用Nginx如何生成缩略图的文章,想了半天题目也没想好,这个题目还是一名读者帮我起的.起因就是这位读者最近出去面试,面试官正好问了一个Nginx如何生成缩略图的问题.还别说,就 ...

  3. 之前遇到一位老面试官,问我的问题真的有点东西

    这篇文章其实源于一次我的面试经历. 那次我面对是一位老面试官,真的很有东西. 那次面试我和他叨叨了两小时....我滴妈我嘴巴都干了真的. 他的提问都很有深度,可以说对我的学习之路有很大的帮助. 我记得 ...

  4. 面试官再问我如何保证 RocketMQ 不丢失消息,这回我笑了!

    0x00. 消息的发送流程 一条消息从生产到被消费,将会经历三个阶段: 生产阶段,Producer 新建消息,然后通过网络将消息投递给 MQ Broker 存储阶段,消息将会存储在 Broker 端磁 ...

  5. 面试官都会问的Mybatis面试题,你会这样回答吗?

    一.概述 面试,难还是不难?取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想上的碰撞和博弈.其实你只需要搞清楚一个逻辑:"面试 ...

  6. 二面京东,面试官直接问我JVM,我心里一阵暗爽~

    二面京东,面试官直接问我JVM,我心里一阵暗爽~简直了,hhhh 明人不说暗话,直接进入主题!!! 一.什么是JVM 二.JAVA代码编译和执行过程 类加载机制 类执行机制 三.JVM内存管理和垃圾回 ...

  7. 华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???

    华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题??? 什么是NIO 缓冲区(Buffer) 缓冲区类型 获取缓冲区 核心属性 核心方法 非直接缓冲区和直接缓冲区 非直接缓冲区 ...

  8. 99%的面试官都会问到的Java面试题

    转载自  99%的面试官都会问到的Java面试题 最近是招聘季,所谓金九银十,正是跳槽的好几节.今天,给大家整理了一些Java面试常考的经典题目,我们一道一道来分析一下. 经典面试题 1.谈谈你对 J ...

  9. 平面设计面试官常问的问题有哪些?

      平面设计面试官常问的问题有哪些?一般情况下都会有一个开篇的自我介绍,这里建议就用平常聊天说话的语气语速来介绍就可以,介绍自己扬长避短,多讲自己的前工作项目经验,在校获奖也可以讲.与工作岗位不强相关 ...

最新文章

  1. android 设置textview中划线效果
  2. SAP PM 初级系列8 - PM 组织架构
  3. Maven详解(五)------ 坐标的概念以及依赖管理
  4. Oracle TNSListener服务启动后自动停止问题
  5. Excel VBA(宏):添加宏
  6. 数据图表可视化_数据可视化如何选择正确的图表第1部分
  7. java基础01-java历史
  8. IBM Mainframe 基础知识学习 (EBCDIC,dsp3270)
  9. Windows移动开发(三)——闭关修炼
  10. 【网易云课堂---轻松读书:番茄工作法】
  11. 数据结构c语言版算法知识点,2020考研计算机《数据结构(C语言版)》复习笔记(3)...
  12. python如何跳出函数_python如何跳出函数
  13. python aiml开发文档_Python AIML搭建聊天机器人
  14. Envi辐射定标及大气校正
  15. 计算机io设备是cpu控制的吗,I/O控制器及控制方式,了解一下
  16. python用于爬虫的包是_Python 爬虫之抓包的理解
  17. U盘无法打开的解决方法大全
  18. 金蝶KIS迷你版标准版年度结账
  19. Nvidia TX2 使用Intelrealsense L515 并安装 RTABmap建图包编译成功
  20. 微信小程序正则表达式

热门文章

  1. Retinanet原理介绍和基于pytorch的实现
  2. 《炬丰科技-半导体工艺》湿法刻蚀硅片表面性能的变化
  3. Symbian S60平台手机软件开发
  4. 洛谷 P5734 【深基6.例6】文字处理软件 字符串处理
  5. Kafka报错:Magic v1 does not support record headers
  6. C语言学生随机抽号演讲计分系统
  7. AI面相手相V3.2.0无限多开版H5公众号版源码
  8. MFC 自动获取可用com串口(串口号以及名称)
  9. electron 中使用autobahn 不工作问题记录
  10. 项目经理应知道的项目管理的7个特点