布隆过滤器

布隆过滤器的作用就是判断元素,在某个元素集中是否存在。

 

hashmap的问题

实际上hashmap也能达到同样的效果,但与布隆过滤器的区别如下:

hashmap的大致原理就是,把所有装入的键值对都存到一个Entry对象里,然后根据key值hash出一个常数,作为该键值对的索引值,并把键值对存入与索引值相同下标的数组,下次寻找该键值对时,直接hash传入key值,然后查找数组下标与hash结果相同的项,里面就是要找的键值对。

如果两个键值对被hash到了同一个数组下标,则查询到该下标时进行遍历key值比较。

优点:查询快,且能够保存完整的键值对。

缺点:如果只是想单纯判断数值是否存在,这种判断代价有点太昂贵了,因为毕竟hashmap里保存了所有键值对的本体。

 

布隆过滤器

使用场景:

当数据集过大,且仅仅只是需要判断指定数据是否存在于数据集中时(布隆过滤器不具备任何储存功能,仅仅如其名称一样,只具备过滤判断元素是否存在的功能)。

 

算法步骤:

1、准备多个hash算法,每个hash算法都能将元素hash成一个常数(常数<n)。

2、准备一个长度为n的数组,且初始里面各项都为0

3、每“装进来”一个元素,就用准备好的多个hash算法,把元素hash成多个常数,并把数组中下标为这些常数的项设为0.

4、如果要判断一个元素“是否被装进来”过,就用准备好的hash算法对其进行hash为多个常数,并判断数组里这些常数下标中的项是否为1.

如果都为1,则表示该元素“可能”被装进来过。

如果哪怕有一项为0,则该元素一定没有被装进来过。

 

问题:

1、只能做到高概率保证元素存在。

由算法流程可见,即使元素hash后所有常数,在数组的对应下标里值都为1,也只是有概率该元素装载过,因为可能元素hash后的所有常数下标,刚好和其他元素的hash值相同。

2、无法从总装载元素中剔除元素。

如果我们想从已经装过的元素集中“删掉一个”,实际上也是不可能的,因为元素都被hash成多个数组下标了,你根本不能确定你删的那个数组下标只是被删元素的hash值,还是别的元素的hash值。

posted @ 2019-05-14 21:33  Red_Code  阅读(256)  评论(0编辑  收藏  举报