哈希、位图与布隆过滤器

2020-09-11  本文已影响0人  dex0423

1. 哈希表

1.1. 背景

试想一下:
-- 假设我们在 redis 中使用指纹完成去重过程,一个去重指纹我们按照 40Bytes 来计算, 8GB(8GB=8589934592Bytes)的内存大约可以存储 214,748,000(2亿)个指纹;
-- 按照这样计算的话,如果我们的 url 数量达到十亿级的话,需要去重的指纹占用空间将达到 40GB,这对于服务器内存来说将是一场灾难;

  • 哈希的核心作用:
    -- 哈希的核心作用,是使元素的存储位置与它的关键码之间能够建立一一映射的关系,在查找时通过该函数可以很快找到该元素;
    -- 举个例子:如果全部数据是由一个个房屋组成的居民区的话,哈希就像是一个 门牌号地址生成器,给每一栋房子生成一个独一无二的 门牌号地址,当想要找某栋房屋的时候,只需要通过它的 门牌号地址 就可以知道这栋房子在什么地方,然后就能快速的找到这栋房子。

1.2. 哈希函数

11.jpg

如欲详细了解,请参阅《https://www.cnblogs.com/zzdbullet/p/10512670.html》文章中 哈希函数的构造方法 相关章节内容,此处不赘述。

1.3. 哈希的散列性

举个栗子
-- 输入 0-99 的 100 个数字,用哈希函数除 3 取模那输出域就是 0、1、2;
-- 当我们将这 100 个数字通过哈希函数进行映射后,0、1、2 的数量都会接近 33 个,也就是分布比较均匀;

电脑编号 文件行号
000 第 0 行、第 1000 行、第 2000 行、第 3000 行、第 4000 行、...
001 第 1 行、第 1001 行、第 2001 行、第 3001 行、第 4001 行、...
002 第 2 行、第 1002 行、第 2002 行、第 3002 行、第 4002 行、...
003 第 3 行、第 1003 行、第 2003 行、第 3003 行、第 4003 行、...
004 第 4 行、第 1004 行、第 2004 行、第 3004 行、第 4004 行、...
... ...
995 第 995 行、第 1995 行、第 2995 行、第 3995 行、第 4995 行、...
996 第 996 行、第 1996 行、第 2996 行、第 3996 行、第 4996 行、...
997 第 997 行、第 1997 行、第 2997 行、第 3997 行、第 4997 行、...
998 第 998 行、第 1998 行、第 2998 行、第 3998 行、第 4998 行、...
999 第 999 行、第 1999 行、第 2999 行、第 3999 行、第 4999 行、...

1.4. 哈希函数特点

-- 输入的值范围可以无穷大,比如数据库记录;
-- 输出的值范围却是有限的,比如上面的 0 到 999;

-- 输入相同输出肯定相同;
-- 输入不相同输出也可能相同(哈希冲突);

1.5. 哈希冲突

1.5.1. 哈希冲突产生的原因

1.5.2. 哈希冲突的解决方法

1.6 哈希的空间复杂度太高(内存溢出)

关于哈希空间复杂度,网上的解释并不是太多,也不够清晰准确,感兴趣的朋友可以参考《数据结构之------什么是哈希表?(哈希表是一个以空间换取时间的数据结构!!! 加快查找速度!!!)》一文,该文对用开放地址法解决哈希冲突做一个相对来说比较详细的解说。

2. 位图

2.1. 什么是位图算法

2.2. 位图算法的实现

Untitled.png

关于位图算法,有一篇很经典的文章,是由 程序员小灰 所写的《漫画:什么是Bitmap算法?》,建议读者朋友去读一读,看完以后对于位图算法的实现和应用将有更加清晰的认识。

2.3. 512M 内存查找 43 亿数据

2.4. 位图算法的应用

2.5. 位图算法处理不了哈希冲突

3. 布隆过滤器

3.1. 布隆过滤产生的背景

3.2. 布隆过滤的工作原理

哈希表 的缺点是浪费空间
位图 的缺点是 不能处理哈希冲突
哈希与位图结合,即是此处要讲的布隆过滤器;
布隆过滤器的基本思想,是在位图中添加多个哈希函数,减小需要开辟的存储空间。

3.3. 布隆过滤器优点

3.4. 布隆过滤器的误判问题

Bloomfilter算法漏误判率

3. 布隆过滤器应用场景

注意:Bloom Filter 不适合那些 “零错误” 的应用场合;

上一篇 下一篇

猜你喜欢

热点阅读