【发布时间】:2016-03-11 17:58:05
【问题描述】:
我一直在寻找一种很好的算法来从具有不同加权概率的对象列表中选择一个随机对象,并且通过将每个对象放入一个数组中找到了一个名副其实的可能性宝库 n 次,对包含离散累积密度函数 (CDF) 的数组执行二进制搜索,将 CDF 放入桶中,以及一些更令人困惑的响应,特别是由 Weighted random selection from array 提供。
但是,所有回复似乎都集中在进行随机选择的效率上,而不是动态构建或调整权重的成本。由于我的应用程序似乎需要在运行时调整权重几乎与进行选择一样频繁,那么允许对概率权重进行动态调整的最有效算法是什么?将新对象添加到列表中可能只会在初始化时完成,但删除对象可能比仅仅更改值更不频繁(也许将概率设置为零就足够了)。
我最初的印象是使用 CDF 数组是我最好的选择;在目标概率之后对所有内容应用相同的调整似乎微不足道,但是例如,对于 CDF 存储桶,我没有看到任何如此简单的事情。有任何想法吗?
如果有人关心,我正在使用 haxe 来实现它。
【问题讨论】:
-
您可以使用 Fenwick tree 进行 O(log n) 时间的样本和更新,但取决于调整的内容,您可能会做得更好。