Выполняя объединение между двумя совместимыми объектами 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])