算法学习 - Bloom Filter(布隆过滤器)学习实现(C++实现)

非常感谢评论里指出了我代码里的小问题。以下代码修改了一下,主要是在第二次 HasH 的时候有小问题。

Bloom filter简介

Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员。如果检测结果为是,该元素不一定在集合中;但如果检测结果为否,该元素一定不在集合中。因此Bloom filter具有100%的召回率。这样每个检测请求返回有“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况,可见 Bloom filter 是牺牲了正确率和时间以节省空间。

以上文字来源百度百科

Bloom Filter计算方法

如需要判断一个元素是不是在一个集合中,我们通常做法是把所有元素保存下来,然后通过比较知道它是不是在集合内,链表、树都是基于这种思路,当集合内元素个数的变大,我们需要的空间和时间都线性变大,检索速度也越来越慢。 Bloom filter 采用的是哈希函数的方法,将一个元素映射到一个 m 长度的阵列上的一个点,当这个点是 1 时,那么这个元素在集合内,反之则不在集合内。这个方法的缺点就是当检测的元素很多的时候可能有冲突,解决方法就是使用 k 个哈希 函数对应 k 个点,如果所有点都是 1 的话,那么元素在集合内,如果有 0 的话,元素则不在集合内。

Bloom Filter优点缺点

优点

  • 插入时间和查询时间都是常数。
  • 保存的不是数据本身,安全性好。

缺点

  • 插入的元素越多,错判性越大。
  • 不能删除元素。

图示说明

例如我们有一个简单的Bloom Filter结构如下:(所有位都是0)

      [ 0 0 0 0 0 0 0 0 0 0 ]

第一次插入a用两个哈希函数,映射到1 4位置上,变为1.

      [ 1 0 0 1 0 0 0 0 0 0 ]

第二次插入b同样的hash函数,映射到1 8位置上, 变为1.

      [ 1 0 0 1 0 0 0 1 0 0 ]

这样就存放了a b两个元素,当我们查找a是否在的时候,两次hash找到1 4位置,发现同时为 1。则表明a存在。

但是假如我们查找的d哈希后映射到4 8位置,发现也同时为 1. 认为存在,这就出错了,因为现在里面只存放了a b没有d

下面写下我用C++写的代码实现,比较简单的实现了下,具体的Hash算法我都简略的写了。

首先是头文件Header.h

//
//  Header.h
//  BloomFilter
//
//  Created by Alps on 15/3/19.
//  Copyright (c) 2015年 chen. All rights reserved.
//

#ifndef BloomFilter_Header_h
#define BloomFilter_Header_h

class 
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值