背景
Count Sketch 是一种空间高效的概率型数据结构,由 Moses Charikar、Kevin Chen 和 Martin Farach-Colton 在 2002 年提出,用于估计数据流中元素的频率,也可用于解决重击者问题。
原理
算法结构
-
参数设定:Count Sketch算法主要依赖两个参数,即哈希函数的数量 和哈希表的大小。这两个参数决定了算法的空间复杂度和估计精度。
-
哈希表初始化:根据设定的参数,初始化一个大小为的二维数组,通常称为哈希表。数组中的每个元素初始值都为0,用于存储元素的频率估计值。
哈希函数设计
-
哈希函数选择:算法使用 个独立的哈希函数 ,每个哈希函数将输入元素映射到 [1,] 的范围内。同时,还使用个随机符号函数 ,每个符号函数将输入元素映射到 {−1,1}。
-
哈希映射规则:对于输入元素 ,通过每个哈希函数 确定其在哈希表中的位置,即第 行的第 列。同时,根据符号函数确定对该位置的值进行加1还是减1操作。
数据处理流程
-
元素插入:当一个元素 出现时,算法会遍历 个哈希函数。对于每个哈希函数 ,计算和 ,然后在哈希表的第 行第 列的位置加上 。这样,元素 的信息就被分散存储在哈希表的多个位置中。
-
频率估计:当需要估计元素 的频率时,同样遍历 个哈希函数。对于每个哈希函数 ,计算 和 ,然后查看哈希表第 行第 列的值,并乘以 。最后,取这 个值的中位数作为元素 的频率估计值。
例子
1. 参数设定
假设我们设定哈希函数的数量 d=2,哈希表的大小 w=3。那么我们将初始化一个大小为 2×3 的二维数组,所有元素初始值都为0,如下所示:
0 | 0 | 0 |
0 | 0 | 0 |
2. 哈希函数和符号函数设计
我们选择两个哈希函数 h1 和 h2,以及两个符号函数 g1 和 g2。假设它们的具体映射如下(这里为了简化示例,直接给出映射结果):
-
h1(x):将元素 x 映射到 [1,3] 的范围内
-
h1(a)=1
-
h1(b)=2
-
h1(c)=3
-
-
h2(x):将元素 x 映射到 [1,3] 的范围内
-
h2(a)=3
-
h2(b)=1
-
h2(c)=2
-
-
g1(x):将元素 x 映射到 {−1,1}
-
g1(a)=1
-
g1(b)=−1
-
g1(c)=1
-
-
g2(x):将元素 x 映射到 {−1,1}
-
g2(a)=−1
-
g2(b)=1
-
g2(c)=−1
-
3. 数据处理流程
元素插入
假设我们有一个数据流,依次出现元素 a,b,a,c,b,a。
-
插入元素 a:
-
对于 h1:h1(a)=1,g1(a)=1,所以在第1行第1列的位置加1,变为1。
-
对于 h2:h2(a)=3,g2(a)=−1,所以在第2行第3列的位置减1,变为-1。
-
此时哈希表为:
1 0 0 0 0 -1 -
-
插入元素 b:
-
对于 h1:h1(b)=2,g1(b)=−1,所以在第1行第2列的位置减1,变为-1。
-
对于 h2:h2(b)=1,g2(b)=1,所以在第2行第1列的位置加1,变为1。
-
此时哈希表为:
1 -1 0 1 0 -1 -
-
插入元素 a:
-
对于 h1:h1(a)=1,g1(a)=1,所以在第1行第1列的位置加1,变为2。
-
对于 h2:h2(a)=3,g2(a)=−1,所以在第2行第3列的位置减1,变为-2。
-
此时哈希表为:
2 -1 0 1 0 -2 -
-
插入元素 c:
-
对于 h1:h1(c)=3,g1(c)=1,所以在第1行第3列的位置加1,变为1。
-
对于 h2:h2(c)=2,g2(c)=−1,所以在第2行第2列的位置减1,变为-1。
-
此时哈希表为:
2 -1 1 1 -1 -2 -
-
插入元素 b:
-
对于 h1:h1(b)=2,g1(b)=−1,所以在第1行第2列的位置减1,变为-2。
-
对于 h2:h2(b)=1,g2(b)=1,所以在第2行第1列的位置加1,变为2。
-
此时哈希表为:
2 -2 1 2 -1 -2 -
-
插入元素 a:
-
对于 h1:h1(a)=1,g1(a)=1,所以在第1行第1列的位置加1,变为3。
-
对于 h2:h2(a)=3,g2(a)=−1,所以在第2行第3列的位置减1,变为-3。
-
此时哈希表为:
3 -2 1 2 -1 -3 -
频率估计
现在我们来估计元素 a、b 和 c 的频率。
-
估计元素 a 的频率:
-
对于 h1:h1(a)=1,g1(a)=1,所以查看第1行第1列的值,为3。
-
对于 h2:h2(a)=3,g2(a)=−1,所以查看第2行第3列的值,为-3,乘以-1,变为3。
-
取这两个值的中位数,即 median(3,3)=3。所以估计元素 a 的频率为3,实际频率也为3,估计准确。
-
-
估计元素 b 的频率:
-
对于 h1:h1(b)=2,g1(b)=−1,所以查看第1行第2列的值,为-2,乘以-1,变为2。
-
对于 h2:h2(b)=1,g2(b)=1,所以查看第2行第1列的值,为2。
-
取这两个值的中位数,即 median(2,2)=2。所以估计元素 b 的频率为2,实际频率也为2,估计准确。
-
-
估计元素 c 的频率:
-
对于 h1:h1(c)=3,g1(c)=1,所以查看第1行第3列的值,为1。
-
对于 h2:h2(c)=2,g2(c)=−1,所以查看第2行第2列的值,为-1,乘以-1,变为1。
-
取这两个值的中位数,即 median(1,1)=1。所以估计元素 c 的频率为1,实际频率也为1,估计准确。
-