HyperLogLog交叉点:为什么不使用min?

时间:2015-03-08 04:38:03

标签: hyperloglog

在两个兼容的HyperLogLog对象之间进行联合时,您可以使用最大存储桶来执行无引入任何新错误的无损联合:

Union.Bucket [i] = Max(A.Bucket [i],B.Bucket [i])

在做交叉时,你必须使用包含 - 排除原则:

IntersectionCountEstimate = A.CountEstimate()+ B.CountEstimate() - Union.CountEstimate()

为什么使用最小桶值不能作为有效的交叉点?

Intersection.Bucket [i] = Min(A.Bucket [i],B.Bucket [i])

1 个答案:

答案 0 :(得分:1)

原因是HyperLogLog统计信息的两个实例之间的关系不是很直观:

从单独的HyperLogLog结构A和B(具有相同数量的桶并使用相同的散列函数)考虑两个相应的桶A [i]和B [i],并且为了简单起见假设A和in中的数据B独立地从相同的分布中提取。让我们假设我们首先绘制A的所有元素,然后才绘制B的元素。

对于我们观察到的每个元素到达B [i],它在A和B的交点中的概率是多少,即它在A [i]中的概率是多少?那取决于 - A [i]的“完整”程度如何?如果A [i]完全“满”(即,A [i]“包含”来自分布的所有元素,可以达到A [i]),则概率为1.在这种情况下,交集的基数A [i]和B [i]确实是B [i]的基数。然而,几乎绝不是A [i]是“满”的情况 - 因此交叉点比B [i]的基数小很多。