Algorithm Flajolet-Martin算法背后的直觉是什么?

Algorithm Flajolet-Martin算法背后的直觉是什么?,algorithm,stream,cardinality-estimation,flajolet-martin,Algorithm,Stream,Cardinality Estimation,Flajolet Martin,我试图理解为什么Flajolet-Martin算法(FM)工作时间太长。该算法的描述(第4.4.2节)是有希望的,但并不完美 为什么任何元素的最大尾部长度(#尾随零)作为流中不同元素数量的估计值?假设只有两个不同的元素{1,2},它们分别散列到{10001,10000}。这意味着不同元素的数量为2^4,这显然是不正确的 诀窍是什么?这个问题最好在像这样的网站上提问 Flajolet-Martin算法是一种流式算法。许多这样的算法是随机的,并提供了预期的正确答案。我认为这就是他们在论文中所说的“估

我试图理解为什么Flajolet-Martin算法(FM)工作时间太长。该算法的描述(第4.4.2节)是有希望的,但并不完美

为什么任何元素的最大尾部长度(#尾随零)作为流中不同元素数量的估计值?假设只有两个不同的元素{1,2},它们分别散列到{10001,10000}。这意味着不同元素的数量为2^4,这显然是不正确的


诀窍是什么?

这个问题最好在像这样的网站上提问

Flajolet-Martin算法是一种流式算法。许多这样的算法是随机的,并提供了预期的正确答案。我认为这就是他们在论文中所说的“估计”一词的意思


不幸的是,这种算法有很大的方差。为了保证你以高概率接近正确答案,你应该减少你的方差和/或使用像中值技巧这样的方法。减少方差的一个简单方法是多次运行相同的算法,然后取平均值。您可以查看此部分:

此问题最好在以下网站上提出:

Flajolet-Martin算法是一种流式算法。许多这样的算法是随机的,并提供了预期的正确答案。我认为这就是他们在论文中所说的“估计”一词的意思


不幸的是,这种算法有很大的方差。为了保证你以高概率接近正确答案,你应该减少你的方差和/或使用像中值技巧这样的方法。减少方差的一个简单方法是多次运行相同的算法,然后取平均值。您可以查看此部分:

让我们从一个简单的问题开始:如果您将一枚硬币掷了三次,您获得三个连续尾巴的概率是多少?这将是1/8,因为每枚硬币有50/50的机会出现尾巴

现在我们可以问一下——如果你要反复抛硬币三次,大概需要多少组三次抛硬币才能让其中一个硬币连续抛三个尾巴?嗯,因为有1/8的机会得到三条尾巴,你会认为你需要做八次。事实上,这正是您需要执行此操作的预期次数

更一般地说,在你期望看到k个连续的尾巴之前,你需要翻转一系列k个硬币多少次?大概是2k倍,因为有1/2k的机会获得k个连续的尾巴

现在,假设有人来对你说:“嘿!我连续掷了十次硬币,得到了十条连续的尾巴。”如果你认为这个人只是试着掷了十枚硬币一次,你会对这个说法有点怀疑,因为只要一次尝试,你就有大约千分之一的机会得到十条连续的尾巴。但如果你想象这个人一次又一次地连续翻动十枚硬币,现在这就更合理了。你可能会说“哇!你可能不得不抛硬币,比如,什么,210次?”虽然你可能离他们太远了——也许他们真的很幸运——但你可能仍然可以很好地估计他们必须进行多少次抛硬币试验

谢谢你放纵这小小的离开。让我们回到Flajolet Martin.:-)

Flajolet-Martin估计器的工作原理是对元素进行散列,并跟踪出现在每个散列末尾的0位数。不要把散列看作数字,而是把它看作编码一系列硬币投掷的0和1的序列。例如,散列0110将被解释为“tails,heads,heads,tails”

在这个模型中,“计算有多少个尾随零”的想法最终基本上等同于“计算有多少个连续的尾随被翻转”。根据上面的推理,你不太可能看到大量的尾随,所以如果你看到一排尾随,这可能意味着你看过很多东西

当然,正如您所指出的,这并不是完美的,您可能会因为后面有大量连续零的哈希代码而变得不走运,即使您只看到了少量的项。这就是上面例子中发生的情况。为了解决这个问题,您可以并行运行Flajolet Martin的多个副本,并将结果聚合在一起,这样一个错误的估计就不会破坏整体结果。(这个,再加上一点,为您提供了著名的HyperLogLog估计器!)


希望这有帮助

让我们从一个简单的问题开始:如果你把一枚硬币掷了三次,你得到三个连续尾巴的概率是多少?这将是1/8,因为每枚硬币有50/50的机会出现尾巴

现在我们可以问一下——如果你要反复抛硬币三次,大概需要多少组三次抛硬币才能让其中一个硬币连续抛三个尾巴?嗯,因为有1/8的机会得到三条尾巴,你会认为你需要做八次。事实上,这正是您需要执行此操作的预期次数

更一般地说,在你期望看到k个连续的尾巴之前,你需要翻转一系列k个硬币多少次?大概是2k倍,因为有1/2k的机会获得k个连续的尾巴

现在,假设有人来对你说:“嘿!我连续掷了十次硬币,得到了十条连续的尾巴。”如果你认为这个人只是试着掷了十枚硬币一次,你会对这个说法有点怀疑,因为只要一次尝试,你就有大约千分之一的机会得到十条连续的尾巴。但如果你想象这个人一次又一次地连续翻动十枚硬币,现在这就更合理了。你可能会说“哇!你可能不得不把那些硬币翻了210次?”然后你可能会说“哇!你可能不得不翻210次?”而你可能会说“哇!你可能已经翻了210次了”—也许他们刚刚翻了