Sketch调研

Count-Min Sketch

CM sketch是一种非常经典的sketch方法,后续有许多新的sketch都是在其基础上进行变换所得到,它最早是在《An improved data stream summary: the count-min sketch and its applications》中被提出。

CM sketch的思路也比较简单:使用d个hash函数,每个hash函数的取值范围都在[1,w]内,从而可以组成一个d * w的二维数组。对于每个二元组(k, v),代表元素k需要更新v次,则分别使用d个hash函数对k进行hash操作,得到d个mapped counters,然后对它们全部增加v,具体如下:

$$ \forall1\leq j\leq d\qquad count[j,h_{j}(i_{t})]\leftarrow count[j,h_{j}(i_{t})] + c_{i}$$


当需要查询某个元素的频率估计值时,也是先根据hash函数得到mapped counters,然后取其中的最小值即可,因为最小代表了冲突次数最少,相对最精确

很明显CM sketch对元素的频率只会高估而不会低估,且对于重复次数较多的元素的准确率比较高,但是对于出现次数较少的元素的准确率较低


Count Sketch

C sketch相较于CM多了一组hash函数S1,……St,它们的取值空间均为{+1, -1}

当需要增加某个元素k时,先是和CM一样用原先的一组hash函数找到mapped counters,然后对第i个counter增加Si[k],即有可能加1,也有可能减1。在查询时先得到每个counter的值,再乘上Si[k],并取所有结果的中值为最终估计值。

这里乘Si[k]是因为若高频项的Si[k]值为负,则counter减1的次数多,最终存储的值也为负,因此再乘一次相当于消除符号。而用中值代替平均值是考虑到平均值受极端值的影响较大,相对来说中值更具有鲁棒性

C sketch的思想是通过概率加1和减1,尽量抵消低频项对高频项的干扰,使得对高频项的估计更加精确

提出文章《Finding Frequent Items in Data Streams》 Moses Charikar、Kevin Chen、Martin Farach-Colton


Conservative Update Sketch

CU sketch只是对CM做了一项非常微小(slight)但却十分高效的改动,称为保守更新。即在每次插入元素时,只对mapped counters中最小的那个(或那些,即有多个最小)counter(s)进行增加操作,而查询操作与CM完全相同。

虽然CU sketch的准确率很高,但它有一个缺点在于不支持delete操作。因为当插入某个元素一段时间后,此时该元素的mapped counters中的最小者不一定就是原先插入时的最小者,若贸然删除不仅会影响到该元素,还会影响到共享该counter的其他元素。因此在实际应用中还是CM的出场率更高一些。

提出文章《New Directions in Traffic Measurement and Accounting》的其中某一节


Count-Mean-Min Sketch

CMM sketch的插入操作和CM一样,只是在查询时对sketch可能产生的噪音进行预估,并将这部分噪音减去

预估的方法如下:假设共有n个元素,对于每个hash函数,取值范围为[1,w],则除去该元素在该hash函数上对应的那个counter外,假设剩下w-1个counter均匀分布,则噪音为 (n-x) / (w-1),其中x为对应counter中的值,即每个对应counter的实际值为x-(n-x) / (w-1),最后也是取所有counter的中位数

提出文章《New estimation algorithms for streaming data: Count-min can do more》


Count-Min-Log Sketch

CML sketch的思想在于减小counter的大小:在传统的sketch中我们需要把所有的counter都设为可能出现的最大值,因为我们不知道哪个counter会被多次hash到。而大多数counter由于记录的是低频项,因此并不需要那么大的空间,这就造成了空间浪费。因此CML每次只以x^(-c)的概率增加counter的计数,其中c为对当前需要插入元素的估计值,x为大于1的log base,且增加计数时采用了CU策略。对应的插入和查询算法修改如下:




在计算元素的估计值时,因为插入时是按x^(-c)概率进行,即每个计数相当于原先的x^c次,c的范围为[0,c],令v = x^c,等比数列求和可得结果为 (1-v) / (1-x),最后取所有counter的最小值

提出文章《Count-Min-Log sketch: Approximately counting with approximate counters》


Augmented  Sketch

A sketch的思想在于增加了一个过滤器,可与原先的sketch进行元素交换(exchange)。过滤器中的每个元素都有new_count和old_count两个值,new_count保持对数据项的过高估计(如同原先的sketch),而new_count和old_count间的差值表示在某段时间内该数据项的累计值,这里使用的sketch为CM,具体算法如下:




对二元组(k,u)进行插入操作,k为元素,u为次数:

1、如果过滤器中有k,直接对其new_count加u,而old_count不变

2、如果没有且过滤器未满,把k加入并设其new_count = u, old_count =0

3、如果没有且过滤器已满,先把k加入sketch,若此时对k的估计值大于过滤器中的最小值,则将该最小值散列到sketch中共 (new_count - old_count)次,并把k加入过滤器,new_count和old_count都设为原先k的估计值

对于查询操作较为简单:即现在过滤器中查询,有则返回其new_count值,否则到sketch中进行估计

在这种方式中可能会出现需要多次交换(multiple exchanges)的情况,一个例子如下:


上图中C不在过滤器中且过滤器已满,先将C散列到sketch中,此时对C的估计为9,大于A的8,因此把C加入过滤器,并把A散列6次(8-2)到sketch中。而操作结束后对A的估计值为10,又大于C的9,发生multiple exchanges。

对于这种情况,文章的处理方式是每次最多只进行一次交换(at most one exchange)

A sketch的优点在于节省了很多次的hash计算,因为部分元素聚集在过滤器中。且因为高频项大部分时间都存在过滤器中,而过滤器的计数是完全精确的,因此可以大大提高对高频项的估计情况。

提出文章《Augmented Sketch: Faster and More Accurate Stream Processing》

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值