为什么在hyperloglog算法中将1添加到前导零计数

时间:2017-02-13 02:59:52

标签: algorithm hyperloglog

如果散列的位模式中有k个前导零,为什么估计大小被认为是2 k + 1 ?不应该是2 k ?具有k前导零的概率应为1 /(2 k ),因此大小应为2 k

在我的代码中,当我使用k + 1而不是k时,我总能得到正确的大小估计。但我不明白这背后的逻辑。

3 个答案:

答案 0 :(得分:2)

您正在寻找的直觉是该算法依赖于在散列开头看到整个位模式的概率(k零,后跟1),而不仅仅是零。

更困难的部分是从那里得到估计2 k + 1 的基数。不幸的是,这方面的正式证据并不简单。实际上,引入该方法的大多数原始原始论文(Flajolet和Martin,用于数据库应用的概率计数算法,http://algo.inria.fr/flajolet/Publications/FlMa85.pdf)致力于证明用它计算的估计是好的。随后的论文(LogLog和HyperLogLog论文)对其改进的估计有类似的证据。

希望有所帮助!

答案 1 :(得分:1)

k前导零意味着前k位为零,后跟一位。 (否则,我们将有超过k个前导零位。)因此,k前导零实际上由长度为(k + 1)的位序列表征,其概率为1/2 ^(k + 1)。 / p>

答案 2 :(得分:0)

根据概率论,你是对的!在观察到具有k个前导零的值之前,您可能会进行2次 k 观察(平均)。

你的估计值应该是它的两倍可能是因为你的随机函数(或散列函数)返回一个始终为正且带有前导零的有符号整数。这应该大约加倍你看到k前导零值的机会。这就是为什么当你使用2 k + 1 而不是2 k 时,你会得到正确的答案。