解释计数草图算法

时间:2011-07-25 02:46:09

标签: algorithm streaming frequency-analysis

有人可以解释计数草图算法的工作原理吗?例如,我仍然无法弄清楚如何使用哈希。我很难理解this paper

3 个答案:

答案 0 :(得分:39)

此流式传输算法实例化以下框架。

  1. 查找随机流式算法,其输出(作为随机变量)具有所需的期望值,但通常是高方差(即噪声)。

  2. 要减少差异/噪音,请并行运行多个独立副本并合并其输出。

  3. 通常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,其中Ya的总和的变化,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相同。

enter image description here

Insomniac很好地解释了计数草图的想法(计算期望值),所以我只想告诉你,使用count-min,一切都更简单。您只需计算要获取的值的d哈希值,然后返回最小值。令人惊讶的是,这提供了强大的准确性和概率保证,您可以find here

增加散列函数的范围,提高结果的准确性,增加散列数会降低估计错误的概率: ε= e / w,δ= 1 / e ^ d。另一个有趣的事情是价值总是被高估(如果你发现了价值,它很可能大于实际值,但肯定不会更小)。

答案 2 :(得分:0)

实际上,哈希函数不需要是统一的随机数,这是件好事:没有办法存储它。哈希函数必须成对独立(两个特定的哈希值是独立的)就足够了。对于我们的简单示例,可以从以下四个函数中随机选择。