布隆过滤算法

2018-12-29  本文已影响0人  万泽耀

前言

在大一刚学习编程的时候,课后习题有这么一道题:现有一个数量为n的有序整数集合,需要判断一个数是否在这个集合中。那时刚学习for循环,所以理所当然的,当时的做法为:
遍历整个集合,判断数字是否存在于集合中

过了一段时间,学习了一些查找算法,了解了时间复杂度的概念;再次看到了这道题目;此时的做法则为:
使用二分查找法,判断数字是否存在于集合中

再后来,学习了数据结构相关的知识,再次碰到了这道题目;不同的是这次的集合是无序的。这个时候想到了两种做法;

曾经我以为HashMap算是这类问题的万能适用解了;但后来我又遇到了这么一个问题,依旧是数量为n的无序集合,判断一个整数是否存在其中,不过不同的是n的值为一亿。

一开始我自然是直接用HashMap处理了,但是在将数据存储至HashMap的时候内存溢出了,此时才明白除了时间复杂度以外,我们还需要考虑到空间问题。这时候布隆过滤就应运而生了。

原理

布隆过滤器使用二进制向量结合hash函数来记录任意一条数据是否已经存在于集合中。
布隆过滤器的执行流程为:

使用示例

布隆过滤器的示例如下:


image.png

大体过程为:

优缺点

误判率计算公式为(1 – e(-nk/SIZE))k,其中n为目标数据的数量,SIZE为Bit集合大小,k为使用的哈希函数个数;假设现有一千万条待处理数据,Bit集合大小为2^30(约10亿,即占用内存128MB),使用9个不同的哈希函数,计算可得任意两条数据其9次哈希得到的哈希值均相同(不考虑顺序)的概率为2.6e-10,约为38亿分之一。

上一篇下一篇

猜你喜欢

热点阅读