【问题标题】:Get random values without replacement given a probability distribution给定概率分布,无需替换即可获得随机值
【发布时间】:2017-04-26 11:22:32
【问题描述】:

给定一个概率分布——对象与其概率的映射——我想要一种算法,它可以从地图中选择随机对象并且无需替换(概率分布会根据选择进行更新)。但是,该算法必须具有 O(1) 的空间复杂度并具有高质量的随机性。我尝试搜索实现,但它们似乎都没有这两个属性。

编辑:

没有替换的概率: 你有一袋对象,每个对象都有被选中的概率。选择一个对象后,将其从包中取出。现在所有对象被选中的概率不同。

在 O(1) 空间复杂度的情况下,我们不会存储一个包含根据被选中概率重复的对象的列表。相反,我们只存储概率分布迭代排列(但不存储该排列)。

【问题讨论】:

  • 概率表示为浮点数或整数权重相对于总数(即表示为有理比率)?
  • @Adrian 两者都可以,因为它们都可以达到相同的结果。
  • 你对输入对象的销毁没问题->过程中的概率图吗?
  • 你说的“没有替换”是什么意思?
  • 时间复杂度对你来说不重要吗?您如何定义没有 O(n) 复杂度的“对象”? (这对于某些“对象”集是可能的,但对于其他“对象”集则不是,这可能会影响算法)。 每个对象是否存在 O(1) 空间复杂度?最重要的是,您为什么有这些要求?您的问题似乎含糊不清。

标签: algorithm math random language-agnostic


【解决方案1】:

我会尝试Fisher-Yates-Knuth shuffle 的变体(在 Durstenfeld 实现中它是 O(1))

原文:

for i from 0 to n − 1 do
  j ← random integer such that 0 ≤ j ≤ i
  if j ≠ i
      a[i] ← a[j]
  a[j] ← source[i]

修改以满足要求:

for i from 0 to n − 1 do
  p ← probabilities(n-i)
  j ← random integer via probabilities(n-i) such that 0 ≤ j ≤ i
  if j ≠ i
      a[i] ← a[j]
  a[j] ← source[i]

因此,在每个步骤中,您都将更新概率并使用它们来采样索引。之后就是 FYK shuffle。

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 2020-01-10
    • 2015-05-18
    • 2021-03-13
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多