您的位置:首页 > 其它

bit map、hash map与布隆过滤器所占据的空间

2015-10-26 16:45 369 查看
以垃圾邮件过滤中黑白名单为例:现有1亿个email的黑名单,每个都拥有8 bytes的指纹信息,则可能的元素范围为

,对于bit
array来说是根本不可能的范围,而且元素的数量(即email列表)为

,相比于元素范围过于稀疏,而且还没有考虑到哈希表中的collision问题。

备注:每个email拥有8bytes的指纹信息,所以每个email拥有64位的指针信息。所以可能有2^64个不同的指纹信息。为了标记不同的指纹信息,所以需要2^64个bits,所以需要2^61个bytes,所以需要2^31GB。

若采用哈希表,由于大多数采用open addressing来解决collision,而此时的search时间复杂度为 :





即若哈希表半满(n/m = 1/2),则每次search需要probe 2次,因此在保证效率的情况下哈希表的存储效率最好不超过50%。此时每个元素占8 bytes,总空间为:





备注:对于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亿,所以总共需要

被置位为1,又因为在保证误判率低且k和m选取合适时,空间利用率为50%(后面会解释),所以总空间为:





所需空间比上述哈希结构小得多,并且误判率在万分之一以下。

备注:取k为8,因为n为10^8,所以总共需要8*10^8bits设置为1,又因为要保证空间利用率为0.5,所以空间为2*8*10^8bits=2*10^8bytes =0.2GB。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: