Bloom Filter + Count-min sketch
用来快速排出不存在的东西。
用hash函数,加一个bloom filter表,然后把key都hash一下,存表里。
例如:hash(”张三“)= 26,hash(”李四“) = 30,那么bloom filter表里,26和30会设成true。因为只存一个位数组所以比直接存hash值省位置
如果hash(”某key“)在表里的值是false,那么表示这个key不存在。如果是true的话,表示有可能存在。
通常会用多于一个hash来做bloom filter。例如用2个hash,存同一个位数组,这样可以减低误判率
bloom filter的精确度跟下面3个点有关:
哈希函数个数,多一点准确点
位数组的长度,长一点准确点,少点collide
加入的字符串数目,少一点准确点,少点collide
下面是个栗子:(具体公式请参照wiki)
如果有15个hash,位数组大小为200w,加入的字符串数量是10w个的话,判断2000w个字符串,误判率会大概是3~4%
这个count-min sketch是用在NLP和数据流数数目的情况。
因为如果只用hashmap来数,通常需要花费O(N)的空间来存这些结果。这个sketch aim at sublinnear的空间存。
具体做法也是用多个hash function,但这次是用来数数。
例子:
例如我们有4个hash function,和一条数据流。我们会弄一个table来记录数字for each hash function
[A, B, C, A, A, B, C...],
譬如我们h1(A) = 1, h2(A) = 0, h3(A) = 2, h4(A) = 2,我们到下表里把对应的地方加1.
h1 | 1 | |||
h2 | 1 | |||
h3 | 1 | |||
h4 | 1 |
譬如我们h1(B) = 1, h2(B) = 3, h3(B) = 1, h4(B) = 0,我们到下表里把对应的地方加1.
h1 | 2 | |||
h2 | 1 | 1 | ||
h3 | 1 | 1 | ||
h4 | 1 | 1 |
我们以此类推,把后面的字母扔进hash function里算一算,然后加到表中对应的位置统计数目。
我们可以发现hash会用collision,例如上面的A和B就在h1里collide了。
因为是”min“,所以我们查询的时候,例如:查A的个数。我们把A扔到4个hash function里,得到了相应的格子和数目。我们把这些数目取min。除非所有都collide了,这个数目会返回准确的数字。
因为hash有collide所以越多的hash function对准确性越有帮助。
这个算法返回的数字只会多算,不会少算。
另外还有一个count-mean-min sketch的改进版。听说通过算每一行的mean值,然后把表里的格子减去这个值会提高准确性。
Last updated