数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral
Bloom Filter(SBF)将其与集合元素的出现次数关联。SBF采用counter中的
最小值来近似表示元素的出现频率。
问题实例:给你A,B两个文件,各存放 50 亿条URL,每条URL占用 64 字节,
内存限制是 4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?
根据这个问题我们来计算下内存的占用,4G=2^32大概是 40亿*8大概是 340
亿,n=50 亿,如果按出错率 0.01 算需要的大概是 650 亿个bit。现在可用的
是 340 亿,相差并不多,这样可能会使出错率上升些。另外如果这些urlip是一
一对应的,就可以转换成ip,则大大简单了。
2.Hashing
适用范围:快速查找,删除的基本数据结构,通常需要总数据量可以放入内存
基本原理及要点:
hash函数选择,针对字符串,整数,排列,具体相应的hash方法。
碰撞处理,一种是open hashing,也称为拉链法;另一种就是closed hashing,
也称开地址法,opened addressing。
扩展:
d-left hashing中的d是多个的意思,我们先简化这个问题,看一看 2-left
hashing。2-left hashing指的是将一个哈希表分成长度相等的两半,分别叫做
T1 和T2,给T1 和T2 分别配备一个哈希函数,h1 和h2。在存储一个新的key
时,同时用两个哈希函数进行计算,得出两个地址h1[key]和h2[key]。这时需
要检查T1 中的h1[key]位置和T2 中的h2[key]位置,哪一个位置已经存储的
(有碰撞的)key比较多,然后将新key存储在负载少的位置。如果两边一样多,
比如两个位置都为空或者都存储了一个key,就把新key 存储在左边的T1 子表
中,2-left也由此而来。在查找一个key时,必须进行两次hash,同时查找两个
位置。
问题实例:
1).海量日志数据,提取出某日访问百度次数最多的那个IP。
IP的数目还是有限的,最多 2^32 个,所以可以考虑使用hash将ip直接存入内
存,然后进行统计。
3.bit-map
适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的 10
倍以下
基本原理及要点:使用bit数组来表示某些元素是否存在,比如 8 位电话号码