本文转自:https://zhuanlan.zhihu.com/p/84688298
1. Count-Min Sketch
Count-Min Sketch 是数据库中用到的一种 Sketch,所谓 sketch 就是用很少的一点数据来描述全体数据的特性,牺牲了准确性但是代价变得很低。
CM-Sketch 的数据模型是这样的:
有一个维度为n 、不断变化的向量(t 表示时间戳)
![]()
每个时间 t上会发生一个更新操作,将其中某一个值加上 c,其他值不变
![]()
尽管论文还讨论了一些更 general 的情形,我们这里可以简单地理解为,CM-Sketch 要拟合的的数据模型类似一个哈希表加上计数器:假设有一个数据集合里有 n 个 distinct values,ai 表示编号为 i 的值出现的次数,每次更新都在修改这个计数器。
CM-Sketch 作为一个 sketch,目的是用相对小的代价,实现以下几种查询(近似结果):
查询编号为 i 的元素出现的次数(主要功能)
查询编号在
范围内的元素出现的总次数 ![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNzdW1fJTdCaSUzRGwlN0QlNUUlN0JyJTdEK2FfJTdCaSU3RA==.png)
查询 inner product:![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNib2xkc3ltYm9sJTdCYSU3RCslNUNvZG90KyU1Q2JvbGRzeW1ib2wlN0JiJTdEJTNEJTVDc3VtXyU3QmklM0QxJTdEJTVFJTdCbiU3RCthXyU3QmklN0QrYl8lN0JpJTdE.png)
-Quantiles- Heavy Hitters
2. 实现
CM-Sketch 的内部数据结构是一个二维数组 count,宽度 w,深度 d,此外还需要 d 个两两独立的哈希函数 h1...hd。
更新的时候,用这些哈希函数算出 d 个不同的哈希值,然后把对应的行的值加上 c。

这里的取值是有讲究的:
,
,两个参数的含义是:在
的概率下,总误差(所有元素查询误差的之和)小于
。
3. 结果近似性
这里以 Q(i) 为例,它的近似结果是:
![]()
也就是所有哈希到的 count 取最小值。显然真实值一定比这个值更小或者相同,那我们只要证明这个值不会比真实值大太多。
要证的结论:
![]()
证明如下:
1) 定义指示变量
表示哈希函数
对于元素
和
是冲突的:他们俩被哈希到同一个 slot 上。站在元素
的角度上看,由于
哈希碰撞,导致元素
的计数加到自己的计数上了。
![]()
2) 定义随机变量
,表示所有元素的
的加和。它表示:哈希函数
未知的情况下,所有元素的总误差。
![]()
3) 运用马尔可夫不等式,把期望的 bound 转换成概率的 bound
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QmFsaWduZWQlN0QrJTVDb3BlcmF0b3JuYW1lJTdCUHIlN0QlNUNsZWZ0JTVCJTVDaGF0JTdCYSU3RF8lN0JpJTdEJTNFYV8lN0JpJTdEJTJCJTVDdmFyZXBzaWxvbiU1QyU3Q2ElNUMlN0NfJTdCMSU3RCU1Q3JpZ2h0JTVEKyUyNiUzRCU1Q29wZXJhdG9ybmFtZSU3QlByJTdEJTVDbGVmdCU1QiU1Q2ZvcmFsbF8lN0JqJTdEKyU1Q2Nkb3QrJTVDb3BlcmF0b3JuYW1lJTdCY291bnQlN0QlNUNsZWZ0JTVCaiUyQytoXyU3QmolN0QlMjhpJTI5JTVDcmlnaHQlNUQlM0VhXyU3QmklN0QlMkIlNUN2YXJlcHNpbG9uJTVDJTdDJTVDYm9sZHN5bWJvbCU3QmElN0QlNUMlN0NfJTdCMSU3RCU1Q3JpZ2h0JTVEKyU1QyU1QyslMjYlM0QlNUNvcGVyYXRvcm5hbWUlN0JQciU3RCU1Q2xlZnQlNUIlNUNmb3JhbGxfJTdCaiU3RCslNUNjZG90K2FfJTdCaSU3RCUyQlhfJTdCaSUyQytqJTdEJTNFYV8lN0JpJTdEJTJCJTVDdmFyZXBzaWxvbiU1QyU3QyU1Q2JvbGRzeW1ib2wlN0JhJTdEJTVDJTdDXyU3QjElN0QlNUNyaWdodCU1RCslNUMlNUMrJTI2JTNEJTVDb3BlcmF0b3JuYW1lJTdCUHIlN0QlNUNsZWZ0JTVCJTVDZm9yYWxsXyU3QmolN0QlMkMrWF8lN0JpJTJDK2olN0QlM0VlKyU1Q21hdGhybSU3QkUlN0QlNUNsZWZ0JTI4WF8lN0JpJTJDK2olN0QlNUNyaWdodCUyOSU1Q3JpZ2h0JTVEJTNDZSU1RSU3Qi1kJTdEKyU1Q2xlcSslNUNkZWx0YSslNUNlbmQlN0JhbGlnbmVkJTdE.png)
这也解释了我们之前看到的 d 和 w 的取值是哪来的。
