range-query
给定一个无限的整数数据流,如何查询在某个范围内的元素出现的总次数?例如数据库常常需要
方案1: Array of Count-Min Sketches
有一个简单方法,既然Count-Min Sketch可以计算每个元素的频率,那么我们把指定范围内所有元素的
解决的办法就是使用多个“分辨率”不同的log(不同元素的总数)
。
-
插入元素时,算法伪代码如下,
def insert(x): for i in range(1, d+1): M1[i][h[i](x)] += 1 M2[i][h[i](x)/2] += 1 M3[i][h[i](x)/4] += 1 M4[i][h[i](x)/8] += 1 # ...
-
查询范围
[l, u) 时,从粗粒度到细粒度,找到多个区间,能够不重不漏完整覆盖区间[l, u) ,将这些sketch 的值加起来,就是该范围内的元素总数。举个例子,给定某个范围,如下图所示,最粗粒度的那个sketch 里找不到一个格子,就往细粒度找,最后找到第1 个sketch 的2 个格子,第2 个sketch 的1 个格子和第3 个sketch 的1 个格子,共4 个格子,能够不重不漏的覆盖整个范围,把4 个红线部分的值加起来就是所求结果