算法 – 多个多重集合是否有类似HyperLogLog的结构?

HyperLogLog估计多集的基数.是否可以扩展它以处理多个多重集?就像,它不支持查询estimateCardinality(),而是支持estimateCardinality(multiset_id).我试图避免为每个multiset_id提供HyperLogLog值的字典.

还有另一种方法(数据结构)来实现这一目标吗?

最佳答案 当你拥有大量的基数较大的多重集时,以下想法可能会有所帮助;也就是说,有些尺寸较大,有些尺寸较小.它不需要您事先估计哪个会很小而哪个会很大.

你可以建立一个Linear Probabilistic Counter,只需要很小的改动.原始数据结构在每个位置都有一个(逻辑)布尔值.在这里,每个职位本身都是一个集体.而不是设置一个

insert(element) 

如果它落在这个位置,你会将id插入到集合中

insert(element, id)

你应该做一些常识性的技巧来节省空间.例如,你可以决定如果id出现在某个部分的bin中,那么它不会存储在bin集中,而是存储在所有bin中的单独位图中.

总的来说,如果你有小型和大型套装,你最终会得到以下结果:

>每个大集合的位图(这与您的计数器字典的每个项目的成本相同)
>每个小集合的某些位集合中的条目(可能比计数器字典的字典小得多)

由于数据结构可以针对特定的多个集合从后者切换到前者 – 它可以节省相对于计数器想法字典的空间,这可能被认为是过早的悲观化.

因人而异.

点赞