笔记
简单描述什么是sketch
使用哈希的方法,根据哈希值的范围来确定的所需的存储空间,各种包根据哈希值再次归类,可以大大减少存储空间。这样使用哈希来估计流的方法称为Sketch-based方法。
描述Count-min sketch的算法过程
用n个函数,对每个来的地址算出对应值。用表存下值。统计时再找每个值中的最小值。
实现思路和实现结果
我用的Count-min sketch代码来至github,不过讲leaveHitters改为存所有的值,以及加了一个检验函数。
用Count-min sketch存下所有值,在进行检验。最后输出大于阈值的地址。我这里在初始的时候,可以设这个阈值(max),默认设定为100000——我的数据源来自我开着电脑放了两三小时而来,所以总值较大。
代码
解释为什么 sketch 可以省空间
哈希冲突可以将大部分数据挤在一起,在利用多个函数来避免误差时,倍数消耗的空间远低于挤压所腾出的空间。
用流程图描述Count-min sketch的算法过程
这里已经表现得很好了,我就不造轮子了。
拿它和你改进后方法进行对比,分析优劣
我的想法是
我想是只保存规定次数的访问记录,在记录中访问时间近得不正常的,或请求信息和大的加入黑名单。 主要考虑如果能用一定的访问次数一来可以保证使用空间(因为使用的次数是自定义的),二来如果是一定次数,在来数值时可以一边存数值,一边舍弃数值,就像堆,每次来了一个新数值记录,只要注意舍弃数值与将进来的新数值影响———每次得出的结果在上次的基础上,可以省时间。
我的想法在节省空间上完全比不上Count-min sketch,但这是在不同方向上的尝试,所以在实验部分我还是会加上我原先的想法。在时间上,我原先的想法是拟合出函数来判断,最好是线性——在舍弃与进来时线性函数可以更方便,对每个数值进行判断,这方面可以用Count-min sketch来充当此函数。
吐槽Count-min sketch
用哈希省空间的同时,其实也是在消耗准确性,即以准确换取空间。不过相比较大的值较小的值更容易被影响到——较大意味着在面对同样的影响下变化小——这种情况下,对寻找heavyHitter的影响不会太大。
实验部分
同上,代码于此,在原先方法上更改了校验函数。