特别是围绕日志日志计数方法。
答案 0 :(得分:7)
我会尝试澄清概率计数器的使用,但请注意我不是这方面的专家。
目标是仅使用一点空间来计算非常大的数字来存储计数器(例如,使用32位整数)。
莫里斯想出了保持“日志计数”的想法,所以计数器不是计算 n ,而是保存 log 2(n)。换句话说,给定计数器的值 c ,计数器表示的实际计数为2ᶜ。由于日志通常不是整数值,因此当 c 计数器应该递增时会出现问题,因为我们只能以1的步长执行此操作。
这里的想法是使用“概率计数器”,因此对于我们计数器上方法Increment
的每次调用,我们用概率 p 更新实际计数器值。这很有用,因为可以证明具有概率更新的计数器值 c 所代表的期望值实际上是 n 。换句话说,在平均之后, n 调用Increment
之后我们的计数器所代表的值实际上是 n (但在任何地方)一个时间点我们的计数器可能有错误)!我们的交易准确性能够计算出存储空间很小的非常大的数字(例如单个寄存器)。
请注意,选择2的“基数”意味着我们的实际计数总是2的倍数(因此称为“数量级估计”)。也可以选择其他 b&gt; 1 (通常是 b <2 ),因此错误较小,但代价是能够计算较小的最大数量。
日志日志起作用,因为在base-2中,一个数字 x 需要表示log 2位。
实际上还有许多其他方案可以近似计算,如果您需要这样的方案,您应该研究哪种方案对您的应用有意义。
参考文献:
有关计数器所代表的平均值的证明,请参阅Philippe Flajolet,或者在“算法简介”一书中解决问题5-1中的一个更简单的处理方法。莫里斯的论文通常在付费墙后面,我找不到免费版本在这里发布。
答案 1 :(得分:0)
它不完全适用于日志计数方法,但我认为它可以帮助你, 使用Morris算法,计数器代表实际计数的“数量级估计”。近似在数学上是无偏的。 为了递增计数器,使用伪随机事件,使得递增是概率事件。为了节省空间,只保留指数。例如,在基数2中,计数器可以将计数估计为1,2,4,8,16,32以及所有2的幂。内存要求只是保持指数。 作为示例,为了从4递增到8,将生成伪随机数,使得.25的概率在计数器中产生正变化。否则,计数器保持在4.维基