具有单个哈希函数的LogLog算法如何工作

时间:2016-10-23 11:49:34

标签: database algorithm math data-structures hyperloglog

我已经找到了对LogLog算法基本思想的几十个解释,但是它们都缺乏关于 哈希函数结果分裂如何工作的细节? 我的意思是使用单个哈希使用很多功能时功能不精确太贵了。 他们如何使用单个哈希函数克服这个问题?

This answer是我发现的最好的解释,但对我来说仍然没有意义:

  

他们使用了一个哈希,但将其分为两部分。一个叫做a   桶(桶的总数是2 ^ x)和另一个 - 基本上是   与我们的哈希相同。我很难得到正在发生的事情,所以我   举个例子。假设您有两个元素和哈希   赋值0到2 ^ 10的函数产生2个值:344和   你决定有16个水桶。所以你有:

0101 011000  bucket 5 will store 1
0110 000011  bucket 6 will store 4

你能解释上面的例子吗?你应该有16个桶,因为你有4个长度的标题,对吗?那你怎么能有16个桶只有两个哈希?我们只估计水桶,对吧?所以第一个桶的大小为1,第二个桶的大小为4,对吧?如何合并结果?

2 个答案:

答案 0 :(得分:2)

哈希函数拆分:我们的目标是使用许多超级日志结构(作为一个例子,让我们说16个超级日志结构,每个结构使用64位哈希函数)而不是一个,以减少估计误差。直观的方法可能是处理每个这些hyperloglog结构中的每个输入。但是,在这种情况下,我们需要确保超级日志彼此独立,这意味着我们需要一组16个散列函数,它们彼此独立 - 很难找到!。

所以我们使用另一种方法。我们将使用16个独立的hyperloglog结构,而不是使用一系列64位散列函数,每个结构仅使用60位散列函数。我们怎么做?很简单,我们采用64位散列函数,只忽略前4位,产生60位散列函数。我们如何处理前4位?我们用它们来选择16"桶中的一个" (每个"桶"只是一个超级日志结构。请注意,2 ^ 4位= 16个桶)。现在,每个输入都分配给16个桶中的一个,其中60位散列函数用于计算超级日志值。所以我们有16个hyperloglog结构,每个结构都使用60位哈希函数。假设我们选择了一个合适的散列函数(意味着前4位是均匀分布的,并且它们与剩余的60位不相关),我们现在有16个独立的超级日志结构。我们采用它们的16个估计值的调和平均值来得到基数较少的容易出错的估计值。

希望能够解决它!

答案 1 :(得分:1)

original HyperLogLog paper提到的OronNavon非常理论化。如果您正在寻找基数估算器的解释而无需复杂的分析,您可以查看我目前正在处理的论文:http://oertl.github.io/hyperloglog-sketch-estimation-paper。它还提供了原始估算器的概括,不需要对小型或大型基数进行任何特殊处理。