问题是并非所有请求都应该被处理。更清楚地表达:
假设您有一个目标比率r,并且算法在每次迭代时都会看到“op”或“nop”。目标是决定是否处理“操作”(让我们将处理后的操作调用为“pop”),以便
#pop /(#op + #nop)〜= r
我认为仅仅跟踪上述比率并确保其保持在合理范围内的天真方法在实践中可以正常工作,所以我更感兴趣的是这是一个众所周知的问题还是有一些代码我可以在这里重复使用。
答案 0 :(得分:1)
如果您可以假设任何给定的操作是否为nop,则以p
概率确定iid,那么您可以做的一件事就是选择以某种概率q
处理每个操作。目标是
r = P(pop)
= P(pop|op)P(op) + P(pop|nop)P(nop)
= qp + 0(1-p)
所以我们应该选择q = r/p
。容易俗气。
如果p
未知,则可以保持#op和#nop的累计总数来估算p
;我建议使用高斯平滑,以便估算p = (#op + 1) / (#op + #nop + 1)
。
有一个明显的确定性启发式方法也可以正常运行:即,如果#op/(#op+#nop)
的运行值低于r
,则处理您看到的下一个操作;否则,不要。这应该会为r
产生相当好的结果;然而,它有一个很大的缺点,即处理或不处理操作的决定是确定性的,并且仅取决于我们已经处理了多少先前的操作。特别是,如果到目前为止您看到的操作数与操作的内容之间存在相关性 - 例如,某些特别有趣的操作不太可能在长字符串后不久出现nops,或操作之间的任何其他此类“时间相关性” - 这将使您的结果以微妙和难以检测的方式偏向。我猜你不知道这些模式是否存在于数据中而不处理整个数据集(这可能是太多的工作)。因此,我推荐使用概率算法。