漫画:什么是布隆算法?
两周之前——
爬虫的原理就不细说了,无非是通过种子URL来顺藤摸瓜,爬取出网站关联的所有的子网页,存入自己的网页库当中。
但是,这其中涉及到一个小小的问题......
URL去重方案第一版:HashSet
创建一个HashSet集合,把每一个URL字符串作为HashSet的key插入到集合当中,利用HashSet的Key唯一性来对URL做去重。
这个方案看似没毛病,但是经过几轮压测之后......
每一个URL按照20字节来算,一亿个URL就是20亿字节,也就是大约占了1.8G以上的空间。这么大的HashSet集合显然是不可取的。
于是小灰又思考了一番......
URL去重方案第二版:Bitmap
Bitmap是一种节省空间的数据结构,不太了解的朋友可以看看往期的相关文章:
漫画:Bitmap算法 整合版
具体怎么做呢?获取每一个URL的HashCode,根据HashCode的值来插入到Bitmap的对应位置。如果要插入位置的值已经是1,说明该URL已重复。
使用Bitmap以后,每一个Url只占了1个Bit,一亿个Url占约12MB。假设整个Bitmap的空隙比较多,额外空间占90%,总空间也不过是120MB,相比HashSet来说大大节省了内存空间。
这个方案貌似好了很多,可是......
String的Hashcode方法虽然尽可能做到均匀分布,但仍然免不了会有冲突的情况。HashCode的冲突意味着什么呢?意味着两个原本并不相同的Url被误判为重复Url。
———————————————
听起来有点绕,我们来详细描述一下:
1.把第一个URL按照三种Hash算法,分别生成三个不同的Hash值。
2.把第二个URL也按照三种Hash算法,分别生成三个不同的Hash值。
3.依次比较每一个Hash结果,只有当全部结果都相等时,才判定两个URL相同。
具体怎样映射呢?流程如下:
1.创建一个空的Bitmap集合。
2.把第一个URL按照三种Hash算法,分别生成三个不同的Hash值。
3.分别判断5,17, 9 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把5,17,9的对应位置设置为1。
4.把第二个URL按照三种Hash算法,分别生成三个不同的Hash值。
5.分别判断10,12, 9 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把10,12, 9 的对应位置设置为1。
6.把第三个URL按照三种Hash算法,分别生成三个不同的Hash值。
7.分别判断4,16, 11 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把4,16, 11 的对应位置设置为1。
8.把第四个URL按照三种Hash算法,分别生成三个不同的Hash值。
9.分别判断5,17, 9 在Bitmap的对应位置是否为1。判断的结果是 5,17, 9 在Bitmap对应位置的值都是1,所以判定该Url是一个重复的Url。
1.URL按照三个Hash算法得到三个结果。
2.分别判断10,12, 17 在Bitmap的对应位置是否为1。判断的结果是 10,12, 17 在Bitmap对应位置的值都是1,所以判定该Url是一个重复的Url。
—————END—————
算法图解:如何找出栈中的最小值?
链表反转的两种实现方法,后一种击败了100%的用户!
JDK 竟然是这样实现栈的?
关注下方二维码,订阅更多精彩内容
漫画:什么是布隆算法?相关推荐
- 漫画:什么是布隆算法
转载自 玻璃猫 程序员小灰 两周之前-- 爬虫的原理就不细说了,无非是通过种子URL来顺藤摸瓜,爬取出网站关联的所有的子网页,存入自己的网页库当中. 但是,这其中涉及到一个小小的问题...... UR ...
- 【算法入门漫画】:“排序算法” 大总结
冒泡排序: 漫画:什么是冒泡排序? 选择排序: 漫画:什么是选择排序? 插入排序: 漫画:什么是插入排序? 此外还有冒泡排序的变种,鸡尾酒排序: 漫画:什么是鸡尾酒排序? 第三梯队的排序算法有什么共同 ...
- 漫画:呕心泣血算法指导篇(真正的干货,怒怼那些说算法没用的人)
今天是小浩算法"365刷题计划"第70.5天.我们暂停一天,我自己有个很喜欢的话,叫做 "练习 - 坚持 - 总结 - 提高",我们已经练习了 70 天,如果不 ...
- bitmap的java原理_布隆算法的原理及JAVA实现
Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合. Bloom Filter ...
- 漫画:一致性hash算法
对于redis.memcached这些分布式缓存系统,需要将数据均匀的分布到缓存服务器集群的不同机器上,就需要使用对缓存的数据的key做hash值计算, 然后在将hash值除以服务器节点的数量取模计算 ...
- 程序员小灰的漫画算法和知识总结,高品质强推!!!
转载自微信号程序员小灰,不定期更新,漫画讲解好评,特来转载. 漫画知识汇总 漫画:深度优先遍历 和 广度优先遍历 漫画:什么是 "图"?(修订版) 漫画:图的 "最短路径 ...
- 程序员小灰的漫画算法
算法 漫画:什么是ConcurrentHashMap? 漫画:高并发下的HashMap 漫画:什么是HashMap? 漫画:什么是红黑树? 什么是AES算法?(整合版) 漫画:什么是SHA系列算法? ...
- 漫画:算法如何验证合法数独 | 全世界最难的数独?
今天是小浩算法 "365刷题计划" 第95天 .数独相信在座的各位都玩过,那我们如何使用程序去验证一个 9×9 的数独是有效的呢?一起看下! 01 PART 有效的数独 数独是源自 ...
- 80道漫画图解算法题汇总(0406版本)
各位好,本人自2019年1月以来,连续写了80余篇算法题解(主要针对高频面试题),都采用漫画图解的方式,为了大家查阅方便,我对目录进行了汇总,大家有兴趣的可以收藏一下,以备不时之需.(另外,为了感谢大 ...
最新文章
- 未来的数据中心(三)
- C++多态案例三-电脑组装
- Vue中的 computed 和 watch的区别
- NuStore使用说明
- Java调用存储过程出现Bug,sql语法错误
- 如何快速搭建云原生企业级数据湖架构及实践分享
- typec扩展坞hdmi没反应_typec扩展坞转hdmi/vga多功能网口usb转换器苹果华为电脑matebook6元优惠券券后价26.8元...
- html5 lang作用,HTML5中的lang属性,zh
- python 多帧 超分辨_利用python-opencv生成视频帧数控制,和常见错误总结
- [转]ASP.NET网页请求以及处理全过程(反编译工具查看源代码)
- 福利时间(1):Scala 入门视频
- 微信android支持版本,兼容安卓4.2.2版本安装哪个版本微信!微信支持版本是什么版本吗...
- 关于5G数据中心:数据中心在5G无线网络系统中的作用
- Gos —— 开启中断与中断机制详解
- 最通俗易懂的网络安全防护原则之进不来、拿不走、看不懂、改不了、跑不掉。
- 我是如何录制技术视频教程的?
- Computer:教你实用一招,如何实现点击PPT文件即可播放,而避免打开PowerPoint软件
- java 北京时间 东八区时间 Android calendar时区无效问题
- 这10本书,带你了解 ChatGPT 的底层逻辑!
- 未来应用陈鸿:被微信封掉公众号后怎么办?——给微信创业者的10点真诚建议
热门文章
- Spark初识-弹性分布式数据集RDD
- 日常问题———Attempting to operate on hdfs namenode as root
- POJ1163 数字三角形
- 用户反馈:对 Rafy 开发框架的一些个人建议
- lambda表达式之进化
- pagefile.sys and heberfil.sys
- 函数重载二义性:error C2668: 'pow' : ambiguous call to overloaded function
- docker kali安装mysql_kali安装docker(有效详细的教程) ——vulhub漏洞复现 001
- python3的pyqt5 qtablewidget按数据大小排列_InnoDB为什么要选择B+树来存储数据?
- bat 存储过程返回值_使用Mybatis过程中遇到的坑