网页黑名单系统的算法核心

通过几个题来进行阐述

网页黑名单系统(有一定的容错率,有限的空间)

例如不安全网页的黑名单里有100亿个数据,每一个网页的URL最多占用64B。要求实现一种过滤系统,可以根据网页的URL判断是否在这个黑名单中。系统允许有万分之一的失误率。且额外的空间不能超过30GB。

首先我们分析一下100亿= 10^10, 64 * 10 ^10 约为640GB的空间,所以要将所有的数据放入内存中,并找出是否包含不可能。
这个系统的空间要求比较高。而且能够容忍一定的错误。这时候我们可以试着往布隆过滤器的方向上想一下。

在此之前我需要简单的介绍一下哈希函数的概念,因为在我们接下来的问题中,几乎都用到了哈希函数。(当然我之后会写一篇关于哈希函数的博客有兴趣可以看看)
哈希函数它是个函数,就对应的有输入域和输出域,它的输入域可以是非常大的范围,比如URL,字符串。但是输出域是固定的,假设为D。
1、典型的哈希函数有无限的输入域
2、哈希函数输入相同值,返回相同的值(比如当我们将有重复出现的值进行哈希到不同的文件时,重复的数就不会到其他文件中)
3、哈希函数输入不同值,返回值可能相同,也可能不同(哈希冲突)
4、很多不同的输入值所得到的返回值均匀的分部在D上。

现在在介绍一下布隆过滤器。
所需要的是
1、一个长度为m的bit数组,bit只有2个状态0和1
2、k个相互独立的哈希函数。
网页黑名单系统的算法核心_第1张图片
一个输入值经过k个哈希函数后,得到了k个值将这个值映射到这个bit数组中,有的就涂黑。所给的题就是将100亿个值依次经过上述过程将bit数组涂黑(置为1)。过后将一个网页的URL经过k个哈希函数得到的k个值对应的bit数组是否被涂黑,若涂黑了就认为在黑名单中。当然如果m的长度不够长则会导致bit数组全被涂黑。所以这个方法是有一定的错误率的。“宁可错杀三千,不能放过一个”。
重点是如何去确定m的长度和k的大小,其实就是一个列函数式求导的过程。
设输入对象的个数n,bit数组长度m,失误率p,哈希函数的个数k。

网页黑名单系统的算法核心_第2张图片
网页黑名单系统的算法核心_第3张图片

你可能感兴趣的:(算法)