两周之前——

爬虫的原理就不细说了,无非是通过种子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 竟然是这样实现栈的?

关注下方二维码,订阅更多精彩内容

漫画:什么是布隆算法?相关推荐

  1. 漫画:什么是布隆算法

    转载自 玻璃猫 程序员小灰 两周之前-- 爬虫的原理就不细说了,无非是通过种子URL来顺藤摸瓜,爬取出网站关联的所有的子网页,存入自己的网页库当中. 但是,这其中涉及到一个小小的问题...... UR ...

  2. 【算法入门漫画】:“排序算法” 大总结

    冒泡排序: 漫画:什么是冒泡排序? 选择排序: 漫画:什么是选择排序? 插入排序: 漫画:什么是插入排序? 此外还有冒泡排序的变种,鸡尾酒排序: 漫画:什么是鸡尾酒排序? 第三梯队的排序算法有什么共同 ...

  3. 漫画:呕心泣血算法指导篇(真正的干货,怒怼那些说算法没用的人)

    今天是小浩算法"365刷题计划"第70.5天.我们暂停一天,我自己有个很喜欢的话,叫做 "练习 - 坚持 - 总结 - 提高",我们已经练习了 70 天,如果不 ...

  4. bitmap的java原理_布隆算法的原理及JAVA实现

    Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合. Bloom Filter ...

  5. 漫画:一致性hash算法

    对于redis.memcached这些分布式缓存系统,需要将数据均匀的分布到缓存服务器集群的不同机器上,就需要使用对缓存的数据的key做hash值计算, 然后在将hash值除以服务器节点的数量取模计算 ...

  6. 程序员小灰的漫画算法和知识总结,高品质强推!!!

    转载自微信号程序员小灰,不定期更新,漫画讲解好评,特来转载. 漫画知识汇总 漫画:深度优先遍历 和 广度优先遍历 漫画:什么是 "图"?(修订版) 漫画:图的 "最短路径 ...

  7. 程序员小灰的漫画算法

    算法 漫画:什么是ConcurrentHashMap? 漫画:高并发下的HashMap 漫画:什么是HashMap? 漫画:什么是红黑树? 什么是AES算法?(整合版) 漫画:什么是SHA系列算法? ...

  8. 漫画:算法如何验证合法数独 | 全世界最难的数独?

    今天是小浩算法 "365刷题计划" 第95天 .数独相信在座的各位都玩过,那我们如何使用程序去验证一个 9×9 的数独是有效的呢?一起看下! 01 PART 有效的数独 数独是源自 ...

  9. 80道漫画图解算法题汇总(0406版本)

    各位好,本人自2019年1月以来,连续写了80余篇算法题解(主要针对高频面试题),都采用漫画图解的方式,为了大家查阅方便,我对目录进行了汇总,大家有兴趣的可以收藏一下,以备不时之需.(另外,为了感谢大 ...

最新文章

  1. 未来的数据中心(三)
  2. C++多态案例三-电脑组装
  3. Vue中的 computed 和 watch的区别
  4. NuStore使用说明
  5. Java调用存储过程出现Bug,sql语法错误
  6. 如何快速搭建云原生企业级数据湖架构及实践分享
  7. typec扩展坞hdmi没反应_typec扩展坞转hdmi/vga多功能网口usb转换器苹果华为电脑matebook6元优惠券券后价26.8元...
  8. html5 lang作用,HTML5中的lang属性,zh
  9. python 多帧 超分辨_利用python-opencv生成视频帧数控制,和常见错误总结
  10. [转]ASP.NET网页请求以及处理全过程(反编译工具查看源代码)
  11. 福利时间(1):Scala 入门视频
  12. 微信android支持版本,兼容安卓4.2.2版本安装哪个版本微信!微信支持版本是什么版本吗...
  13. 关于5G数据中心:数据中心在5G无线网络系统中的作用
  14. Gos —— 开启中断与中断机制详解
  15. 最通俗易懂的网络安全防护原则之进不来、拿不走、看不懂、改不了、跑不掉。
  16. 我是如何录制技术视频教程的?
  17. Computer:教你实用一招,如何实现点击PPT文件即可播放,而避免打开PowerPoint软件
  18. java 北京时间 东八区时间 Android calendar时区无效问题
  19. 这10本书,带你了解 ChatGPT 的底层逻辑!
  20. 未来应用陈鸿:被微信封掉公众号后怎么办?——给微信创业者的10点真诚建议

热门文章

  1. Spark初识-弹性分布式数据集RDD
  2. 日常问题———Attempting to operate on hdfs namenode as root
  3. POJ1163 数字三角形
  4. 用户反馈:对 Rafy 开发框架的一些个人建议
  5. lambda表达式之进化
  6. pagefile.sys and heberfil.sys
  7. 函数重载二义性:error C2668: 'pow' : ambiguous call to overloaded function
  8. docker kali安装mysql_kali安装docker(有效详细的教程) ——vulhub漏洞复现 001
  9. python3的pyqt5 qtablewidget按数据大小排列_InnoDB为什么要选择B+树来存储数据?
  10. bat 存储过程返回值_使用Mybatis过程中遇到的坑