与cm-sketch
相同之处
都用哈希函数将数据映射到桶里:不将接受到的数据完整保存下来,减少数据存储的空间
不同之处
mv为可逆的sketch,即可返回重流的数据;而cm只能输入数据查询
MV-Sketch
可逆—>主选票算法(the majority vote algorithm)
一个桶中有三个成分:重流候选Ki,j(第i行第j个桶),一个计数器记录映射到该桶内的总数据量Vi,j,一个计数器记录重流候选的数据量Ci,j
当一个数据包x映射到桶中时,Vi,j增加新数据包的大小,如果x是当前的重流候选,则Ci,j加上该数据包的大小,反之减少(不断抵消),当C的数值减为负值时,更新重流候选,新重流候选即为当前(使C变为负值)的x,C取绝对值
如:
一串flow abc,a=1,b=5,c=2按顺序映射入一个桶中
最开始重流候选K=a,V=1,C=1
b进入,V=6, b!=K —> C=C-vb=-4 —> C=-C,K=b
c进入,V=8, c!=K —> C=C-vc=2 >0 —>K=b
- 优点:与cm比能储存重流的数据,并且因为一个桶中只需储存一个重流的数据,根据后续数据包的情况进行不断更新,内存开销并不大
- 存在误差:如:
一串flow abcde,a=10,b=c=3,c=4,d=1
当e输入时,C变成负值,K更新为d,而d的数据量是flow中最小的
插入、查询操作
插入
数据x通过r个哈希函数的映射,投射到r个桶里
查询
heavy hitter
查询每个桶,若桶中的总计数值V大于某个预设值,则该桶中存在heavy hitter(初筛):heavy hitter数据量远远大于其他数据,故原理上它所在的桶数据量大
查询上一步初筛中含有heavy hitter的桶中的重流计数器的值,若大于某个预设值,则该桶中的重流候选为一个heavy hitter