漫画:什么是布隆算法?

两周之前——

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kotlin 字符串_Kotlin程序确定字符串是否具有所有唯一字符

kotlin 字符串Given a string, we have to check whether it has all unique characters or not. 给定一个字符串,我们必须检查它是否具有所有唯一字符。 Example: 例: Input:string "includehelp"Output:falseInput:string "abcd&qu…

css优先级机制说明

首先说明下样式的优先级,样式有三种&#xff1a; 1. 外部样式&#xff08;External style sheet&#xff09; 示例&#xff1a; <!-- 外部样式 bootstrap.min.css --><link href"css/bootstrap.min.css" rel"stylesheet" type"text/css"…

制作一个钟表

用EasyX制作的一个简易钟表&#xff0c;需设置字符集属性为多字节字符集。效果如下所示&#xff1a; GIF图会有些闪动&#xff0c;在实际中这种闪动几乎不可见。 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<graphics.h> #include<math.h…

趣谈MySQL历史,以及MariaDB初体验

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;MySQL 是一个跨世纪的伟大产品&#xff0c;它最早诞生于 1979 年&#xff0c;距今已经有 40 多年的历史了&#xff0c;而如今…

网页设置页数/总页数_图书分配问题(分配最小页数)

网页设置页数/总页数Problem statement: 问题陈述&#xff1a; Given an array of integers A of size N and an integer B. College library has N bags, the ith book has A[i] number of pages. 给定一个大小为N的整数A和一个整数B的数组。 高校图书馆有N个书包&#xff0c…

算法图解:如何判断括号是否有效?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;今天要讲的这道题是 bilibili 今年的笔试真题&#xff0c;也是一道关于栈的经典面试题。经过前面文章的学习&#xff0c;我想…

让人省心的事件委托

事件委托:利用冒泡的原理把实践添加到父元素级别上&#xff0c;触发执行效果。 时间委托优点&#xff1a; 1.提高性能&#xff0c;不用for循环遍历所有li&#xff0c;节省性能。 2.新添加的元素还会有原来之前的事件。 先看时间委托提高的性能吧&#xff0c;一个常…

Python HTMLCalendar类| 带有示例的formatyearpage()方法

Python HTMLCalendar.formatyearpage()方法 (Python HTMLCalendar.formatyearpage() Method) formatyearpage() method is an inbuilt method of the HTMLCalendar class of calendar module in Python. It works on HTMLCalendar class object and returns a years calendar a…

最新版MySQL在MacOS上的实践!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 MacOS 上安装最新版的 MySQL 有三种方法&#xff1a;使用 Docker 安装&#xff1b;使用 Homebrew 运行 brew install mys…

二进制文件的操作

所有文件的存储其实质都是二进制的&#xff0c;二进制文件往往由两部分组成&#xff0c;一部分是文件头另一部分存放了文件的内容。文件头通常存放与文件格式有关的信息&#xff0c;以BMP等图象文件为例&#xff0c;它们的文件头中存放了是何种图形格式、图象大小、调色板等信息…

【转】GitHub入门详细讲解

第一&#xff1a;请登录https://windows.github.com/ 下载您需要的安装软件&#xff0c;进行安装。安装后桌面有&#xff1a;GitHub 和 Git Shell 第二&#xff1a; 申请一个帐号https://github.com/signup/free 帐号名字要记得清楚。 其他请参考 http://www.woiweb.net/github…

简易飞机空战小游戏

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #include<windows.h>#define width 30 //屏幕的宽 #define high 40 //屏幕的高 #define EnemyAirportNum 5 //敌机出现的数量 #define MyFly 1 …

kotlin获取属性_Kotlin程序| 属性获取器和设置器方法的示例

kotlin获取属性属性获取器和设置器方法 (Properties Getter and Setter Methods) Variable having a class-level scope, declared inside the class body but outside the functions called property. 具有类级别范围的变量&#xff0c;在类主体内部但在称为属性的函数外部声明…

忘记MySQL密码怎么办?一招教你搞定!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在安装完 MySQL 或者是在使用 MySQL 时&#xff0c;最尴尬的就是忘记密码了&#xff0c;墨菲定律也告诉我们&#xff0c;如果…

vb读出二进制文件,合并两个文件

Dim FileMe() As Byte, File1() As Byte, File2() As Byte Dim Ii As Integer, Ss As String 读入程序自身 Open App.Path & "\" & App.EXEName & ".exe" For Binary As #11 ReDim FileMe(FileLen(App.Path & "\" & App.EXE…

通讯录动态版

#include<stdio.h> #include<stdlib.h> #include<string.h>enum operation {EXIT, //退出ADD, //添加SEARCH, //查找DELETD, //删除AMEND, //修改SHOW //显示 };enum object {X_NAME, //名字X_AGE, //年龄X_TELNUMBER,//电话号码X_ADDRESS //住址 };…

icmp消息类型报告传输_ICMP消息的类型和ICMP消息格式

icmp消息类型报告传输ICMP shares error reporting and devices status by messages. Messages created by ICMP are divided into 2 categories: ICMP通过消息共享错误报告和设备状态。 ICMP创建的消息分为两类&#xff1a; 1) Error Reporting Messages 1)错误报告消息 The…

一文详解「队列」,手撸队列的3种方法!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录至我的 Github《算法图解》系列&#xff1a;https://github.com/vipstone/algorithm前面我们介绍了栈&#xff08…

Oracle11完全卸载方法

一、在oracle11G以前卸载oracle会存在卸载不干净&#xff0c;导致再次安装失败的情况&#xff0c;在运行services.msc打开服务&#xff0c;停止Oracle的所有服务。二、 oracle11G自带一个卸载批处理\app\Administrator\product\11.2.0\dbhome_1\deinstall\deinstall.bat运行该批…

斐波拉切数列

问题陈述&#xff1a; Fibonacci为1200年代的欧洲数学家&#xff0c;在他的著作中曾经提到&#xff1a;若有一只兔子每个月生一只小兔子&#xff0c;一个月后小兔子也开始生产。起始只有一只兔子&#xff0c;一个月后就有两只兔子&#xff0c;二个月后有三只兔子&#xff0c;三…