【问题标题】:Sampling without using random()?不使用 random() 进行采样?
【发布时间】:2015-11-14 15:44:22
【问题描述】:

我最近被要求实现一个 sampleStream() 方法,该方法将以相等的概率选择每个元素,但不使用 random()。我以为面试官正在寻找水库采样,但当我偶然发现时,他补充说这是一种称为“stratified sampling”的方法。诚然,我可能对此感到厌烦,因为有一种称为分层抽样的统计方法,我试图思考如何使用它从流中随机抽取元素。他指定的输入是要采样的项目数,以及我应该采样的速率(大约 1000/100,000)。

无论如何,我仍然坚持这个问题,即使我已经因为没有正确回答而没有得到这份工作。谷歌搜索在这里让我失望了。谁能帮我理解一下?

【问题讨论】:

    标签: algorithm sampling


    【解决方案1】:

    实现分层抽样的一种方法是按用于分层的键对列表进行排序,然后进行 1 in n 抽样。

    从技术上讲,如果键是类别,则不需要排序。在这种(典型)情况下,可以使用散列方法。这个想法仍然是一样的:在“有序”列表中采样 1 次。

    也许这就是面试官所指的。

    编辑:

    您可以在流上实现分层采样,您实际上是在读取流并为每组相似的键值进行“桶”计数。当存储桶具有任意值时,您将输出记录。当存储桶达到某个值(基于整体频率)时,您将重置计数器并重复(或使用模运算)。

    但是,获取每条记录的概率并不相同。为此,我确实认为您需要某种随机化。一种接近的方法是将每个组的记录存储在一个桶中,然后在桶满时选择一个随机记录。您可以通过在某个其他值(例如插入时间)上使用哈希键,然后选择最小或最大哈希键值来模拟随机性。 (而且,您可以通过只存储一条记录来提高效率。)

    【讨论】:

    • 感谢您的意见!输入是一个流。我想你可以建立一个水库,并跟踪分层,当你以一定的概率遇到该地层的新元素时,添加到每个地层中。但他不想让我使用 random()——对此有什么想法吗?
    • 谢谢!这真的很有帮助。我不会将其标记为已解决,因为我很好奇其他人要说什么。不过,这对于一个面试问题来说是相当复杂的。在被观看时提供的 15 分钟内没有解决问题,我并不觉得自己毫无头绪!
    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-10-03
    • 1970-01-01
    • 2013-01-04
    • 2014-06-19
    • 2018-05-18
    相关资源
    最近更新 更多