5

Count-min Sketch 算法

 1 year ago
source link: https://zhuanlan.zhihu.com/p/369981005
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Count-min Sketch 算法

Count-min Sketch算法是一个可以用来计数的算法,在数据大小非常大时,一种高效的计数算法,通过牺牲准确性提高的效率。

  • 是一个概率数据机构
  • 算法效率高
  • 提供计数上线

其中,重要参数包括

  • Hash 哈希函数数量: [公式]
  • 计数表格列的数量: [公式]
  • 内存中用空间: [公式]

我们规定一个 [公式] 的Count-min Sketch,用来计数,其中所有hash函数如下

[公式]

注意,所有hash函数的结果需[公式]

下面开始填表,首先初始状态为

首先,向里面添加字母B,其ASCII码为66,求hash函数的结果为

[公式]

因此,表格变为

接下来,我们查询字母A,其ASCII码为65,求hash函数的结果为

[公式]

用这个结果去读表,发现其对应位置均为0,因此字母A最多出现0次,这个值是准确的。

然后,我们在查询字母G,其ASCII码为71,求hash函数的结果为

[公式]

用这个结果去读表,发现其对应位置均为1,因此字母G最多出现1次;出错了!我们从未向里面添加过字母G,这就是一次collision。Count-min Sketch的确会有这种问题,因为这个模型是从Bloom Filter衍生过来的。所以说Count-min Sketch是一个概率模型,返回的结果是一个上限值(upper-bound)。


设计最优 Count-min Sketch

有了上面的问题,我们自然而然就会想到如何设计一个最优的Count-min Sketch模型。

首先,规定一些参数:

  • 数据流大小: [公式]
  • 元素 [公式] 的真实计数值: [公式]
  • 元素 [公式] 的估计计数值: [公式]
  • 我们可以自己选择的参数: [公式] (hash函数数量)和 [公式] (表格列的数量)

注:如果我们的模型 [公式] ,另唯一的 [公式] ,那么我们可以得到准确的计数结果。

现在,我们希望设定一个错误范围 [公式] ,这个范围表示估计值的取值范围,我们希望结果在这个范围的概率为

[公式]

这里, [公式] 表示结果在这个范围里的概率。

那么设计一个最优Count-min Sketch模型的过程为:

  1. 估计数据流大小 [公式] 的大小
  2. 选择一个合理的 [公式] 值使 [公式]
  3. 选择一个合理的概率值 [公式]
  4. [公式][公式] 的最优值可以通过以下公式获得:
    [公式] , [公式]

可以看出,想要错误范围越小,就要更大的 [公式] ,也就是表格的列数;
同理,想要更高的概率(更小的 [公式] ),就要更大的 [公式] ,也就是更多的hash函数。

假设我们现在需要为大小为 [公式] 的数据计数,我们选择 [公式] ,即 [公式]

由此我们可以得出[公式] ,假如我们希望 [公式] 的概率落在这个范围内,可得 [公式],因此hash函数数量 [公式]

假设每个计数单元占内存大小为4 byte,那么,该模型将占用内存

[公式]

参考:
Advanced Data Structures: Count-Min Sketches


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK