作者:张振伟来源:https://zhangzw.com/20190521.html

假设遇到这样一个问题:一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出。

可能很多人首先想到的会是使用 HashSet,因为 HashSet基于 HashMap,理论上时间复杂度为:O(1)。达到了快速的目的,但是空间复杂度呢?URL字符串通过Hash得到一个Integer的值,Integer占4个字节,那20亿个URL理论上需要:20亿*4/1024/1024/1024=7.45G的内存,不满足空间复杂度的要求。

这里就引出本文要介绍的“布隆过滤器”。

# 何为布隆过滤器

百科上对布隆过滤器的介绍是这样的:

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

是不是描述的比较抽象?那就直接了解其原理吧!

还是以上面的例子为例:

哈希算法得出的Integer的哈希值最大为:Integer.MAX_VALUE=2147483647,意思就是任何一个URL的哈希都会在0~2147483647之间。

那么可以定义一个2147483647长度的byte数组,用来存储集合所有可能的值。为了存储这个byte数组,系统只需要:2147483647/8/1024/1024=256M。

比如:某个URL(X)的哈希是2,那么落到这个byte数组在第二位上就是1,这个byte数组将是:000….00000010,重复的,将这20亿个数全部哈希并落到byte数组中。

判断逻辑

如果byte数组上的第二位是1,那么这个URL(X)可能存在。为什么是可能?因为有可能其它URL因哈希碰撞哈希出来的也是2,这就是误判。

但是如果这个byte数组上的第二位是0,那么这个URL(X)就一定不存在集合中。

多次哈希

为了减少因哈希碰撞导致的误判概率,可以对这个URL(X)用不同的哈希算法进行N次哈希,得出N个哈希值,落到这个byte数组上,如果这N个位置没有都为1,那么这个URL(X)就一定不存在集合中。

# Guava的BloomFilter

Guava框架提供了布隆过滤器的具体实现:BloomFilter,使得开发不用再自己写一套算法的实现。

# 创建BloomFilter

BloomFilter提供了几个重载的静态 create方法来创建实例:

最终还是调用:

BloomFilter里byte数组的空间大小由 expectedInsertions, fpp参数决定,见方法:

真正的byte数组维护在类:BitArray中。

# 使用:

最后通过:put和 mightContain方法,添加元素和判断元素是否存在。

# 算法特点

1、因使用哈希判断,时间效率很高。空间效率也是其一大优势。

2、有误判的可能,需针对具体场景使用。

3、因为无法分辨哈希碰撞,所以不是很好做删除操作。

# 使用场景

1、黑名单

2、URL去重

3、单词拼写检查

4、Key-Value缓存系统的Key校验

5、ID校验,比如订单系统查询某个订单ID是否存在,如果不存在就直接返回。

url过滤怎么解除_腾讯面试官是这样来问布隆过滤器的?相关推荐

  1. 二叉树的建立与遍历完整代码_腾讯面试官这样问我二叉树,我刚好都会

    前记 上周我投递出了简历,岗位是后端开发工程师.这周腾讯面试官给我进行了视频面试.面试过程中他问了二叉树的问题. 二叉树相关算法题,在面试中出现的次数非常非常多,所以我面试之前也有所准备.今天结合面试 ...

  2. tomcat线程循环异常终止_腾讯面试官:如何停止一个正在运行的线程?我一脸蒙蔽。。。...

    1. 停止不了的线程 2. 判断线程是否停止状态 3. 能停止的线程--异常法 4. 在沉睡中停止 5. 能停止的线程---暴力停止 6.方法stop()与java.lang.ThreadDeath异 ...

  3. 腾讯面试官这样问我二叉树,我刚好都会 | 原力计划

    作者 | 天才程序YUAN 责编 | 夕颜 封图 | CSDN下载自视觉中国 出品 | CSDN(ID:CSDNnews) 前记 上周我投递出了简历,岗位是后端开发工程师.这周腾讯面试官给我进行了视频 ...

  4. 腾讯面试官这样问我二叉树,我刚好都会

    前记 上周我投递出了简历,岗位是后端开发工程师.这周腾讯面试官给我进行了视频面试.面试过程中他问了二叉树的问题.二叉树相关算法题,在面试中出现的次数非常非常多,所以我面试之前也有所准备.今天结合面试问 ...

  5. 面试官最有可能问到的 50 个 React 面试题和答案

    如果你是一位有抱负的前端程序员并准备面试,那么这篇文章很适合你.本文是你学习和面试 React 所需知识的完美指南. JavaScript 工具缓慢而稳定地在市场中扎根,对 React 的需求呈指数级 ...

  6. 关于逻辑回归,面试官们都怎么问

    作者 | WEIWEI   整理 | NewBeeNLP 「面试官们都怎么问」系列文章主旨是尽可能完整全面地整理ML/DL/NLP相关知识点,不管是刚入门的新手.准备面试的同学或是温故知新的前辈,我们 ...

  7. 关于Transformer,面试官们都怎么问?

    作者 | Adherer 编辑 | NewBeeNLP 面试锦囊之知识整理系列,持续更新中 已发表: 关于ELMo,面试官们都怎么问 写在前面 前些时间,赶完论文,开始对 Transformer.GP ...

  8. 面试官十大常问面试问题总结

    面试时,有几个问题是面试人员常常会提出的,针对这些问题好好准备,在面试时也就不会哑口无言,无言以对了,现在找工作,得面试.面试技巧也是一大学问,面试的功夫做到家了,找工作很容易的.下面就面试官十大常问 ...

  9. 如果你是一个Java面试官,你会问哪些问题?

    作为一名年近40的大龄IT从业人员,在上市公司当经理兼创业公司当总监,从面试上来说也算是阅人无数了吧,所以谈谈个人作为Java面试官,我一般会问的一些问题,希望对你有所收获. 一.请自我介绍 我一般面 ...

最新文章

  1. Js面试题(一)--js实现数组去重怎么实现?
  2. 自学篇之-----纯css做的漂亮的单选框复选框样式
  3. 多目标机器学习_NIPS2018 - 用多目标优化解决多任务学习
  4. Java实现选择排序及其优化
  5. VMware通过vmdk文件创建虚拟机
  6. 令人惊叹的前端路由原理解析和实现方式
  7. Django(part14)--模板的继承
  8. 胡言乱语生成器微信小程序源码在线取名等支持流量主收益
  9. CentOs基础操作指令(压缩、定时任务调度)
  10. dasBlog-1.8.5223.1中文版
  11. 硬盘格式化数据恢复的软件推荐
  12. 学习s3c2440的随笔笔记
  13. Zookeeper Kafka Debezium Spark 实时数据同步方案在实际项目中的使用
  14. Linux系统备份工具 REAR (RELAX-AND-RECOVER)
  15. tipask访问不到地址,appach和linux的引用头不一样
  16. 惠州全日制计算机学校,惠州市所有中专学校一览表
  17. 30 张图,概览 CPU 制作全过程
  18. 【黑马程序员】《Java基础入门》——02 面向对象
  19. [重点]C语言——数组
  20. C语言华氏温度转换为摄氏温度

热门文章

  1. android 监测bug上传到服务器,基于Android 错误信息捕获发送至服务器的详解
  2. cmos和ttl_TTL电平和CMOS电平的区别
  3. 拉格朗日插值函数计算机实现流程图,拉格朗日插值实验报告.doc
  4. mysql blackhole引擎_MySQL BlackHole引擎
  5. RANSAC算法的简单理解
  6. git 撤销修改:未push 、已push
  7. 用定时器控制灯的闪烁梯形图_用西门子PLC设计灯的闪烁的梯形图,就只要梯形图。...
  8. java 线程由浅入深_Java多线程:由浅入深看synchronized的底层实现原理
  9. 语言程序设计第4版黄洪艺_谭浩强《C程序设计》第4版网授精讲班【教材精讲+考研真题串讲】视频网课讲义课程资料...
  10. mysql safe file priv_MYSQL的secure_file_priv参数怎么用?