bit map、hash map与布隆过滤器所占据的空间
2015-10-26 16:45
369 查看
以垃圾邮件过滤中黑白名单为例:现有1亿个email的黑名单,每个都拥有8 bytes的指纹信息,则可能的元素范围为
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/201102162318584027.png)
,对于bit
array来说是根本不可能的范围,而且元素的数量(即email列表)为
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/201102162318585390.png)
,相比于元素范围过于稀疏,而且还没有考虑到哈希表中的collision问题。
备注:每个email拥有8bytes的指纹信息,所以每个email拥有64位的指针信息。所以可能有2^64个不同的指纹信息。为了标记不同的指纹信息,所以需要2^64个bits,所以需要2^61个bytes,所以需要2^31GB。
若采用哈希表,由于大多数采用open addressing来解决collision,而此时的search时间复杂度为 :
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/201102162318595880.png)
即若哈希表半满(n/m = 1/2),则每次search需要probe 2次,因此在保证效率的情况下哈希表的存储效率最好不超过50%。此时每个元素占8 bytes,总空间为:
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/201102162318599402.png)
备注:对于10^8个元素来说,每个元素的指纹信息都要存储,所以需要8*10^8bytes,又因为空间利用率一般不超过0.5,所以需要16*10^8bytes。所以需要1.6GB。
若采用Perfect hashing(这里可以采用Perfect hashing是因为主要操作是search/query,而并不是add和remove),虽然保证worst-case也只有一次probe,但是空间利用率更低,一般情况下为50%,worst-case时有不到一半的概率为25%。
若采用布隆过滤器,取k=8。因为n为1亿,所以总共需要
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/20110216231900208.png)
被置位为1,又因为在保证误判率低且k和m选取合适时,空间利用率为50%(后面会解释),所以总空间为:
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/201102162319003174.png)
所需空间比上述哈希结构小得多,并且误判率在万分之一以下。
备注:取k为8,因为n为10^8,所以总共需要8*10^8bits设置为1,又因为要保证空间利用率为0.5,所以空间为2*8*10^8bits=2*10^8bytes =0.2GB。
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/201102162318584027.png)
,对于bit
array来说是根本不可能的范围,而且元素的数量(即email列表)为
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/201102162318585390.png)
,相比于元素范围过于稀疏,而且还没有考虑到哈希表中的collision问题。
备注:每个email拥有8bytes的指纹信息,所以每个email拥有64位的指针信息。所以可能有2^64个不同的指纹信息。为了标记不同的指纹信息,所以需要2^64个bits,所以需要2^61个bytes,所以需要2^31GB。
若采用哈希表,由于大多数采用open addressing来解决collision,而此时的search时间复杂度为 :
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/201102162318595880.png)
即若哈希表半满(n/m = 1/2),则每次search需要probe 2次,因此在保证效率的情况下哈希表的存储效率最好不超过50%。此时每个元素占8 bytes,总空间为:
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/201102162318599402.png)
备注:对于10^8个元素来说,每个元素的指纹信息都要存储,所以需要8*10^8bytes,又因为空间利用率一般不超过0.5,所以需要16*10^8bytes。所以需要1.6GB。
若采用Perfect hashing(这里可以采用Perfect hashing是因为主要操作是search/query,而并不是add和remove),虽然保证worst-case也只有一次probe,但是空间利用率更低,一般情况下为50%,worst-case时有不到一半的概率为25%。
若采用布隆过滤器,取k=8。因为n为1亿,所以总共需要
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/20110216231900208.png)
被置位为1,又因为在保证误判率低且k和m选取合适时,空间利用率为50%(后面会解释),所以总空间为:
![](http://images.cnblogs.com/cnblogs_com/allensun/201102/201102162319003174.png)
所需空间比上述哈希结构小得多,并且误判率在万分之一以下。
备注:取k为8,因为n为10^8,所以总共需要8*10^8bits设置为1,又因为要保证空间利用率为0.5,所以空间为2*8*10^8bits=2*10^8bytes =0.2GB。
相关文章推荐
- android中在代码中设置margin属性
- 【bzoj2753】【scoi2012】【滑雪与时间胶囊】【最小生成树】
- 第8周实践项目5-计数的模式匹配
- python 清屏
- Android 横竖屏切换
- 【Cell报表】与JS的千丝万缕
- 第八周 建立顺序串的算法库
- 计算机经典书籍电子书合集
- 关于 android本地缓存数据目录
- 安卓图表引擎AChartEngine(三) - 示例源码折线图、饼图和柱状图
- 文件传输
- 前后背景求取(opencv官方例程)
- JAVA--单例模式
- 开发者薪资调查:2013年哪种编程语言最赚钱?
- VS2012 QT程序打包部署详解
- JS常用方法
- C++著名程序库的比较和学习经验
- 第九周项目1-猴子选大王
- 第九周项目(1):猴子选大王(数组版)
- Android签名警告提示-tsa或-tsacert此jar没有时间戳无法安装