algorithm - 动态加载骰子的数据结构?

标签 algorithm data-structures language-agnostic probability

假设我有一个有序的频率列表,例如 [1, 1, 2]。我希望能够从这个列表中快速抽样,选择一个选项的概率与其值成正比。

The Alias method让我们用 O(n) 的构建时间和 O(1) 的查询时间来做这个采样。我对这个问题的版本很感兴趣,我们也支持更新或插入这个列表。

这里有一些想法:

  • 一个增强的 BST 可以用 O(log(n)) 的所有操作来做到这一点
  • 您可以使用分层数据结构,其中有 n/log(n) 个大小为 log(n) 的 block 。每个 block 都存储为一个增强的 BST,顶层数据结构是别名方法。选择一个 BST 需要 O(1),在其中选择需要 O(log(log(n))),所以你的查询时间是 O(log(log(n)))。每当发生更新时,您都需要完全重建顶层结构,这需要 O(n/log(n)) 时间。

有没有更快的解决方案?

最佳答案

论文"Dynamic Generation of Discrete Random Variates" by Matias, Vitter, and Ni描述了如何在恒定的预期更新和查询时间内执行此操作。这些技术一点都不简单!

关于algorithm - 动态加载骰子的数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40622450/

相关文章:

arrays - 用未知形状填充网格

algorithm - 寻找一种算法来评估图形的节点

java - 使用 ArrayList 实现合并排序的问题

optimization - 我应该使用哪种数据结构来存储哈希值?

oop - 类和对象实例之间有什么区别?

java - 如果某些命名约定(例如大写方法名称)如此令人不悦,那么为什么语言完全允许它们呢?

c - 为数的质因数找到更好的算法

sql - 帮助树状结构

c++ - 哈希表——哈希函数实现

oop - 编写组合函数/方法时,对 “the same level of abstraction”的酸性测试是什么?