加权随机数 V2(动态情况)
Weighted random numbers V2 (Dynamic case)
这个问题是链接下方问题的扩展。
加权随机数
我的问题是采样加权随机数,附加条件是每个元素的权重经常动态变化。
编辑假设有 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操作。
相关文章:
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 如何在不使用赋值运算符的情况下为动态变量赋值?
- 根据动态选择类型C++模板使用情况
- 在不释放所有动态分配的资源的情况下结束程序是否有风险
- 使用C++清理器测量动态内存使用情况
- 如何在不使用任何数据库的情况下制作动态注册表单?
- 如何在没有动态内存分配(堆)的情况下为可变大小数组(矢量)定义安全容器或视图
- 如何在不动态铸造的情况下使用派生的参数
- 如何在没有动态调用的情况下确定子节点的类型
- 如何在不使用指针的情况下将动态2D数组传递到函数
- 在不使用容器或字符串库的情况下,在运行时增加动态数组大小
- 在这种情况下如何调试动态库
- 为什么在这种情况下编制动态库错误
- 我可以在动态知道其类型的模板类对象中使用 auto 关键字吗?我不能在没有初始值设定项的情况下使用 auto 关键字吗?
- 如何在没有RTTI的情况下设计动态类型系统
- 如何在不知道大小的情况下编写过程来修改动态数组的元素和大小
- 如何在不违反 const 限制的情况下动态分配模板类中的空间
- 在某些情况下,如何理解允许实现将非局部变量的动态初始化视为静态初始化
- 为什么在这种情况下使用 vector<>.push_back() 时不使用动态内存?
- 如何在没有 sproof 的情况下分析动态链接的库