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

Weighted random numbers V2 (Dynamic case)

本文关键字:情况 动态 随机数 V2 加权      更新时间:2023-10-16

这个问题是链接下方问题的扩展。

加权随机数

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

编辑假设有 N 个元素要选取不同的权重。

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

二叉搜索方法也需要O(N)来制作累积数组,采样成本为log(N)

但是,就我而言,由于权重经常更改,因此修改权重的时间复杂度也很重要。

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

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

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

我面临着同样的问题。 我将描述我目前的解决计划,但将不胜感激任何其他建议和/或实施指示。

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