1

在两个兼容的 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])
4

1 回答 1

1

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

考虑两个对应的桶 A[i] 和 B[i] 来自不同的 HyperLogLog 结构 A 和 B(它们具有相同数量的桶并使用相同的哈希函数),为简单起见,假设 A 和 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] 的基数小得多。

于 2016-08-16T12:56:22.033 回答