有人可以解释计数草图算法的工作原理吗?例如,我仍然无法弄清楚如何使用哈希。我很难理解this paper。
答案 0 :(得分:39)
此流式传输算法实例化以下框架。
查找随机流式算法,其输出(作为随机变量)具有所需的期望值,但通常是高方差(即噪声)。
要减少差异/噪音,请并行运行多个独立副本并合并其输出。
通常1比2更有趣。这个算法的2实际上有点不标准,但我只会谈论1。
假设我们正在处理输入
a b c a b a .
有三个计数器,不需要哈希。
a: 3, b: 2, c: 1
但是我们假设我们只有一个。有八种可能的函数h : {a, b, c} -> {+1, -1}
。这是结果表。
h |
abc | X = counter
----+--------------
+++ | +3 +2 +1 = 6
++- | +3 +2 -1 = 4
+-- | +3 -2 -1 = 0
+-+ | +3 -2 +1 = 2
--+ | -3 -2 +1 = -4
--- | -3 -2 -1 = -6
-+- | -3 +2 -1 = -2
-++ | -3 +2 +1 = 0
现在我们可以计算期望
(6 + 4 + 0 + 2) - (-4 + -6 + -2 + 0)
E[h(a) X] = ------------------------------------ = 24/8 = 3
8
(6 + 4 + -2 + 0) - (0 + 2 + -4 + -6)
E[h(b) X] = ------------------------------------ = 16/8 = 2
8
(6 + 2 + -4 + 0) - (4 + 0 + -6 + -2)
E[h(c) X] = ------------------------------------ = 8/8 = 1 .
8
这里发生了什么?对于a
,我们可以分解X = Y + Z
,其中Y
是a
的总和的变化,Z
是非 - a
秒。通过期望的线性,我们有
E[h(a) X] = E[h(a) Y] + E[h(a) Z] .
E[h(a) Y]
是a
h(a)^2 = 1
每次出现的词语总和,因此E[h(a) Y]
是a
的出现次数。另一个术语E[h(a) Z]
为零;即使给定h(a)
,每个其他哈希值也可能是加号或减号1,因此在预期中贡献为零。
实际上,哈希函数不需要是统一随机的,而且好处:没有办法存储它。散列函数是成对独立的(任何两个特定散列值是独立的)就足够了。对于我们的简单示例,随机选择以下四个函数就足够了。
abc
+++
+--
-+-
--+
我会把新计算留给你。
答案 1 :(得分:21)
计算草图是probabilistic data structure,可让您回答以下问题:
读取元素流a1, a2, a3, ..., an
,其中可能存在大量重复元素,在任何时候它都会为您提供以下问题的答案:到目前为止您看到了多少ai
个元素
你可以清楚地获得一个确切的值,只需要保持键是ai
的哈希值,值是你到目前为止看到的元素数量。它是快速O(1)
添加,O(1)
检查,它会为您提供准确的计数。 O(n)
空间所需的唯一问题,其中n是不同元素的数量(请记住,每个元素的大小有很大差异,因为它需要way more space to store this big string as a key
而不仅仅是this
。
那么Count sketch会如何帮助你?与所有概率数据结构一样,您牺牲了空间的确定性。计算草图允许您选择2个参数:结果的精度ε和不良估计的概率δ。
要执行此操作,请选择d
pairwise independent hash functions系列。这些复杂的单词意味着它们不会经常发生冲突(事实上,如果两个哈希值都将值映射到空间[0, m]
,则碰撞概率大约为1/m^2
)。每个散列函数都将值映射到空格[0, w]
。所以你创建了一个d * w
矩阵。
现在,当您读取元素时,可以计算此元素的每个d
哈希值,并更新草图中的相应值。这部分与Count sketch和Count-min sketch相同。
Insomniac很好地解释了计数草图的想法(计算期望值),所以我只想告诉你,使用count-min,一切都更简单。您只需计算要获取的值的d哈希值,然后返回最小值。令人惊讶的是,这提供了强大的准确性和概率保证,您可以find here。
增加散列函数的范围,提高结果的准确性,增加散列数会降低估计错误的概率: ε= e / w,δ= 1 / e ^ d。另一个有趣的事情是价值总是被高估(如果你发现了价值,它很可能大于实际值,但肯定不会更小)。
答案 2 :(得分:0)
实际上,哈希函数不需要是统一的随机数,这是件好事:没有办法存储它。哈希函数必须成对独立(两个特定的哈希值是独立的)就足够了。对于我们的简单示例,可以从以下四个函数中随机选择。