如果我想在可以添加和删除的元素列表中获取唯一计数,有没有办法做到这一点?
例如
add key1
delete key1
add key1
应该给出1
的唯一计数但是如果我有一个简单的2 hll方法用于删除而另一个用于add,它会返回0?
有没有办法可以在hll中重复键入?
答案 0 :(得分:0)
我不知道如何使用超级日志日志来做这件事,但我确实看到了如何用效率较低的基数估算器来做到这一点。
这是一个简单的基数估算器,您可以在http://www.cse.unsw.edu.au/~cs9314/07s1/lectures/Lin_CS9314_References/fm85.pdf中找到它。计算每个元素的哈希值。保留最小的m
哈希值。使用m
哈希值的大小来估计整个集合的基数。 (让我们忽略哈希冲突。)
现在这里有一个改编来处理一些删除。保留最小的2m
哈希值。使用m
'最小的大小来估计整个集合的基数。如果应删除哈希元素,只需将其从集合中删除即可。只要你的装置的尺寸不会下降大约2倍,这应该可以很好地工作。
如果你需要处理更多?添加“鬼”元素的想法。删除哈希值时,在预期2m+1
'哈希值的位置添加“ghost”哈希值。删除实际哈希值时,每个“ghost”元素都有一个随机删除的可能性,它与已删除的实际元素的分数相匹配。如果删除了鬼,则插入更多。如果插入的内容足以使幽灵变得太大而无法放在最小的2m
中,那么就会让它像任何其他值一样掉落。
生成的算法需要更多内存,但需要处理添加和删除。即使大部分数据被删除,它也应该相当准确。
答案 1 :(得分:0)
您可以保留单独的HyperLogLog来计算已删除的项目,并减去最终的计数。但是这种方法有一些警告: 1.根据您的应用程序,删除可能只需要在之前看到的值时计算,这实际上是不可能知道的。 2.准确度会降低,具体取决于添加和删除元素的模式。