转载自  算法面试,如何在100 亿URL中判断某个URL是否存在

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

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

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

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

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

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

2. 具体介绍

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

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

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

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

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

3. 解决过程

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

假设,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 位。

//创建了一个 100 * 32bit 的数组
int[] arr = new int[100];
// 代表 bit 数组 0-31 位的元素
arr[0];

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

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

void Set(int data) {// ByteNO 是表示在 table 数组中那个元素int ByteNo = data / 100;// bitNo 是表示在 32 位 bit 中哪个 bit 位。int BitNo = data % 32;// 置 1_table[ByteNo] |= (1 << BitNo); }

4. 使用效果

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

5. 缺点

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

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

算法面试,如何在100 亿URL中判断某个URL是否存在相关推荐

  1. 5 判断数据是否存在_Trie树实现:100亿URL中判断某个URL是否存在

    之前在头条看到一篇<如何在100亿URL中判断某一个URL是否存在>,里面介绍的是使用布隆算法bloomfilter,我们也知道bloomfilter只能保证URL不存在. 在这里介绍一个 ...

  2. 【面试现场】如何在10亿数中找出前1000大的数

    小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 之前小史在BAT三家的面试中已经挂了两家,今天小史去了BAT中的最后一家面试了. 简单的 ...

  3. 如何在 10 亿数中找出前 1000 大的数?

    作者 | channingbreeze 责编 | 胡巍巍 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 之前小史在BAT三家的面试中已 ...

  4. 如何在10亿个数中找到前1000大的数?

    2019独角兽企业重金招聘Python工程师标准>>> 如何在10亿个数中找到前1000大的数? 定位 TopN问题 算法 排序不是最优的解决方案: 可以考虑分治法: 类似快速排序中 ...

  5. php 循环curl,如何在100次循环中使用curl PHP?

    如何在循环中使用curl 100次发送请求并将响应存储在数组中?如何在100次循环中使用curl PHP? 例如:当curl第一次使用循环时,获取500条记录并存储在一个数组中,然后再次使用第二个循环 ...

  6. 找到100亿个URL中重复的URL及搜索词汇的TopK问题

    题目:有一个包含100亿个url的大文件,假设每个url占用64B,请找出其中所有重复的url 补充问题:某搜索公司一天的用户搜索词汇是海量的,请设计一种求出每天热门的top 100 词汇的可行方法 ...

  7. 找到100亿个URL中重复的URL

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net 把大文件通过哈希函数分配到机器,或者通过哈希函数把大 ...

  8. 思考题:存储了100亿个非法网页的url地址。每个URL地址的大小占用64B。要求实现一个网页过滤系统,内存使用不能超过30GB,此外,允许有一定的误判率,但是不能超过万分之一

    https://cloud.tencent.com/developer/article/1480540 解题思路:布隆过滤器 基础介绍 布隆过滤器(Bloom Filter)是1970年由布隆提出的. ...

  9. 【算法】如何给100亿个数字排序?

    场景 之前写过一篇海量数据中统计ip出现次数最多的博客,今天再写篇类似的,当然会有不同的地方,相同的地方我快速写过,详细的可以看之前的博客. 今天要给100亿个数字排序,100亿个 int 型数字放在 ...

最新文章

  1. 淘金尖端领域:全球量子技术最新投资趋势
  2. windbg学习-------.expr和masm表达式
  3. 网站SEO优化中长尾关键词的特征有哪些?
  4. mac下载安装本地mongodb
  5. linux下的连接文件——软连接和硬连接的区别
  6. 理解 Python 面向对象
  7. Python异步编程Async/Await
  8. ​北京大学 2022 年博士研究生招生简章
  9. python 摄像头录制帧率_实践:用python实现把视频以帧数输出成连续的多图片
  10. 第十三章 Spring消息(待续)
  11. 从零开始撸一个Fresco之gif和Webp动画
  12. unable to find setter method for attribute:[commandName]
  13. 一款支持语音搜索及语音Voip的浏览器
  14. esp32 物联网应用 01
  15. 读文献——《Curriculum learning》
  16. java表格组件_表格组件 java
  17. 傅里叶级数、狄利克雷收敛定理、周期延拓
  18. mysql 5.7.22 winx64_MySQL 5.7.22 winx64 安装配置方法图文教程
  19. html5 2020视觉效果,体验未来:10个会让你惊叹不已的HTML5画布(CANVAS)技术应用演示-UI博客精选...
  20. MySQL学习笔记day2--DQL案例练习

热门文章

  1. leetcode45. 跳跃游戏 II
  2. 《C++ Primer》7.3.2节练习
  3. [蓝桥杯2016初赛]剪邮票-dfs+next_permutation(好题)
  4. Java多线程(review)
  5. Go unsafe Pointer
  6. java中的循环结构_Java中的循环结构进阶
  7. mysql数据库check命令_利用mysqlcheck命令快速修复mysql数据库
  8. 数据结构---邻接表的DFS
  9. 星光计划计算机,上海星光计划第七届职业院校技能大赛.PDF
  10. ubuntu 16.04 安装 python2.7 以及 cv2, dist-package 和 site-package 的区别, import cv2 出问题解答