最近在研究哈希表,写了闭散列和开散列的代码,哈希表的查找效率确实比较高,但是我发现哈希表的空间效率却有点低,一个好点的哈希表估计能达到50%的空间利用率吧。
我们知道STl中有一种数据结构叫做 bitset 个人觉得叫 bitmap 会更形象一点(这里不去关系这个了),位图是具有很高的空间效率的数据结构,在处理有些大数据的时候能够发挥出很大的作用。
看到这里应该懂我了吧,既然一个时间快,一个节约空间,那么你们在一起吧----------这就是布隆过滤器!一种时间和空间都比较高效的数据结构。布隆过滤器的设计原理是:使用 k 个哈希函数对同一个key进行定址,在bitmap中将各个哈希函数产生的index都置为1,这样就大大降低了哈希冲突(哈希冲突是不能完全避免的),此话怎讲呢?当我们去查找一个key是否存在的时候,也是通过使用一系列的哈希函数产生index,查看该index对应的位图位置是否为1,来判断该key是否出现过。结论如下:
1.若有哈希函数产生的 index 对应的位置不为 1 ,则说明该 key 没有出现过
2.若所有哈希函数产生的 index 对应的位置都为 1,我们可以推测该 key 有很大的概率出现过,因为哈希函数产出的 index 有一定的错误率的
布隆过滤器的应用还是比较广泛的,比如谷歌就使用到了布隆过滤来屏蔽骚扰邮箱,因为光光靠哈下表不能满足需求,举例说明一下吧,十亿个邮箱的URL所需要的存储空间大约16G吧,这么大的内存一般计算机是不能达到的,而使用布隆过滤器就能很好的解决问题了。不过布隆过滤器还是有缺点的,就是当bitmap中被置为1的位的个数接近总数目的时候,就容易产生错误,所以使用的时候要估计一下空间问题。
我实现了一个简单的布隆过滤器,用来判断string是否出现在其中,我使用了5个哈希函数来产生index,这些哈希函数都是一些经过测试的比较高效的字符哈希函数,我的项目结构如下: