加权随机数V2(动态情况)

时间:2012-06-14 11:27:59

标签: c++ c random sampling

此问题是链接下方问题的扩展。

Weighted random numbers

我的问题是采样加权随机数,其附加条件是每个元素的权重经常动态变化。

EDIT 假设有N个元素可以选择不同的权重。

对于静态权重,Walker的别名方法需要O(N)时间来设置别名,但采样成本为O(1),因此它是实现目标的最佳方法之一。

二进制搜索方法还需要O(N)来使累积数组和采样成本为log(N)

然而在我的情况下,由于权重经常变化,修改权重的时间复杂度也很重要。

所以我想知道现有的库或算法具有修改数据结构和小于O(N)的采样的时间复杂度。

编辑当我阅读评论时,我意识到我需要施加额外的条件。每个修改阶段,只修改了少数(大部分是两个)权重,这些修改也不会改变权重总和(标准化条件)。

如果有解决方案,我也想知道当权重是实数时是否可以使用。

1 个答案:

答案 0 :(得分:1)

我面临同样的问题。我将描述我目前解决它的计划,但会对任何其他建议和/或实施指针表示感谢。

我目前的计划是调整动态顺序统计算法,如Cormen / Leiserson / Rivest的“算法导论”的14.1部分所述。您将元素放入平衡的二叉树中,例如红黑树,其中权重为键。您扩充树,以便每个节点在其子树中存储权重的总和。然后根在整个树中存储权重之和,比如说S。可以在树操作期间以与用于动态订单统计的子树大小相同的方式更新子树和。要进行加权采样,您可以统一采样[0..S]中的数字,比如x;然后在树下搜索节点N,使得有序遍历中N之前的节点权重之和为<x,但总和加N的权重是>x - 类似于动态订单统计的OS-Select操作。