漫画:什么是布隆算法?

简介: 爬虫的原理是通过种子URL来顺藤摸瓜,爬取出网站关联的所有的子网页,存入自己的网页库当中。

640.jpg640.jpg640.jpg640.jpg两周之前——640.jpg640.jpg640.jpg爬虫的原理就不细说了,无非是通过种子URL来顺藤摸瓜,爬取出网站关联的所有的子网页,存入自己的网页库当中。

640.png

但是,这其中涉及到一个小小的问题......640.jpg640.jpg

URL去重方案第一版:HashSet


创建一个HashSet集合,把每一个URL字符串作为HashSet的key插入到集合当中,利用HashSet的Key唯一性来对URL做去重。

640.png

这个方案看似没毛病,但是经过几轮压测之后......640.jpg

每一个URL按照20字节来算,一亿个URL就是20亿字节,也就是大约占了1.8G以上的空间。这么大的HashSet集合显然是不可取的。

于是小灰又思考了一番.....

640.jpg

URL去重方案第二版:Bitmap

Bitmap是一种节省空间的数据结构,不太了解的朋友可以看看往期的相关文章:

漫画:Bitmap算法 整合版

具体怎么做呢?获取每一个URL的HashCode,根据HashCode的值来插入到Bitmap的对应位置。如果要插入位置的值已经是1,说明该URL已重复。


640.png


使用Bitmap以后,每一个Url只占了1个Bit,一亿个Url占约12MB。假设整个Bitmap的空隙比较多,额外空间占90%,总空间也不过是120MB,相比HashSet来说大大节省了内存空间。

这个方案貌似好了很多,可是......

640.jpg


String的Hashcode方法虽然尽可能做到均匀分布,但仍然免不了会有冲突的情况。HashCode的冲突意味着什么呢?意味着两个原本并不相同的Url被误判为重复Url。

640.jpg


640.jpg

640.jpg

640.jpg

640.jpg

640.jpg

640.jpg

640.jpg

640.jpg

640.jpg640.jpg

640.jpg

640.jpg


听起来有点绕,我们来详细描述一下:

1.把第一个URL按照三种Hash算法,分别生成三个不同的Hash值。


640.png

2.把第二个URL也按照三种Hash算法,分别生成三个不同的Hash值。

640.png

3.依次比较每一个Hash结果,只有当全部结果都相等时,才判定两个URL相同。

640.png

640.jpg640.jpg


具体怎样映射呢?流程如下:


1.创建一个空的Bitmap集合。


640.png

2.把第一个URL按照三种Hash算法,分别生成三个不同的Hash值。

640.png

3.分别判断5,17, 9 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把5,17,9的对应位置设置为1。


640.png

4.把第二个URL按照三种Hash算法,分别生成三个不同的Hash值。

640.png

5.分别判断10,12, 9 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把10,12, 9 的对应位置设置为1。

640.png

6.把第三个URL按照三种Hash算法,分别生成三个不同的Hash值。

640.png

7.分别判断4,16, 11 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把4,16, 11 的对应位置设置为1。

640.png

8.把第四个URL按照三种Hash算法,分别生成三个不同的Hash值。

640.png

9.分别判断5,17, 9 在Bitmap的对应位置是否为1。判断的结果是 5,17, 9 在Bitmap对应位置的值都是1,所以判定该Url是一个重复的Url。


640.jpg

640.jpg640.jpg

1.URL按照三个Hash算法得到三个结果。

640.png

2.分别判断10,12, 17 在Bitmap的对应位置是否为1。判断的结果是 10,12, 17 在Bitmap对应位置的值都是1,所以判定该Url是一个重复的Url。


640.png

640.jpg

640.jpg

640.jpg

640.jpg


640.jpg


640.jpg

640.jpg

相关文章
|
5月前
|
存储 算法 数据可视化
【漫画算法】哈希表:古代皇帝的秘密魔法书
【漫画算法】哈希表:古代皇帝的秘密魔法书
|
5月前
|
算法 搜索推荐 数据可视化
【漫画算法】插入排序:插入宝石的传说
【漫画算法】插入排序:插入宝石的传说
|
5月前
|
算法 搜索推荐 数据可视化
【漫画算法】指挥官的排序战术:快速排序算法解密
【漫画算法】指挥官的排序战术:快速排序算法解密
|
6月前
|
算法
时间复杂度与空间复杂度(自漫画算法)
时间复杂度与空间复杂度(自漫画算法)
32 0
|
算法
【漫画算法学习笔记】第二章——2.1数组
本篇博客总结了《漫画算法》第二章的知识点,并将数组的扩容封装成了工具类
99 0
【漫画算法学习笔记】第二章——2.1数组
|
算法
漫画算法题:两数之和与三数之和
我们来举个例子,给定下面这样一个整型数组(假定数组不存在重复元素):我们随意选择一个特定值,比如13,要求找出两数之和等于13的全部组合。 由于12+1 = 13,6+7 = 13,所以最终的输出结果(输出的是下标)如下:
218 0
漫画算法题:两数之和与三数之和
|
算法 Java
漫画:如何优化 “字符串匹配算法”?
BF算法是如何工作的? 正如同它的全称BruteForce一样,BF算法使用简单粗暴的方式,对主串和模式串进行逐个字符的比较。
176 0
漫画:如何优化 “字符串匹配算法”?
|
算法
漫画:什么是字符串匹配算法?
比较哈希值是什么意思呢? 用过哈希表的朋友们都知道,每一个字符串都可以通过某种哈希算法,转换成一个整型数,这个整型数就是hashcode: hashcode = hash(string) 显然,相对于逐个字符比较两个字符串,仅比较两个字符串的hashcode要容易得多。
157 0
漫画:什么是字符串匹配算法?
|
存储 算法
漫画:Dijkstra 算法的优化
如何求得最短路径的详细节点,而不仅仅是距离?
151 0
漫画:Dijkstra 算法的优化
|
存储 缓存 算法
漫画:什么是LRU算法?
用户信息当然是存在数据库里。但是由于我们对用户系统的性能要求比较高,显然不能每一次请求都去查询数据库。 所以,小灰在内存中创建了一个哈希表作为缓存,每次查找一个用户的时候先在哈希表中查询,以此提高访问性能。
161 0
漫画:什么是LRU算法?