【发布时间】:2014-03-15 08:29:29
【问题描述】:
我有一张带有某种概率分布的物品地图:
Map<SingleObjectiveItem, Double> itemsDistribution;
给定某个m,我必须从上述分布中抽取m 元素中的Set。
到目前为止,我一直在使用幼稚的方式:
while(mySet.size < m)
mySet.add(getNextSample(itemsDistribution));
getNextSample(...) 方法根据概率从分布中获取对象。现在,随着m 的增加,性能严重受损。对于m = 500 和itemsDistribution.size() = 1000 元素,抖动过多,函数在while 循环中停留的时间过长。生成 1000 个这样的集合,您就有了一个可以爬行的应用程序。
有没有更有效的方法来生成一组具有“预定义”分布的唯一随机数?大多数集合改组技术等都是一致随机的。解决这个问题的好方法是什么?
更新:循环将调用getNextSample(...)“至少”1 + 2 + 3 + ... + m = m(m+1)/2 次。那是在第一次运行中,我们肯定会得到该集合的样本。第二次迭代,它可能至少被调用两次,依此类推。如果getNextSample本质上是顺序的,即遍历整个累积分布来找到样本,那么循环的运行时间复杂度至少为:n*m(m+1)/2,'n'是分布中的元素数。如果m = cn; 0<c<=1 则循环至少为 Sigma(n^3)。这也是下限!
如果我们用二分查找代替顺序查找,复杂度至少为 Sigma(log n * n^2)。高效,但幅度可能不大。
此外,由于我调用上述循环k 次,生成k 这样的集合,因此无法从分发中删除。这些集合是项目随机“时间表”的一部分。因此是一组“项目”。
【问题讨论】:
-
一个元素可以被多次选取吗?如果不是,地图中值的确切形式含义是什么?不能只是选择一个元素的概率,因为当我们已经选择了一些元素并且不能再次触摸它们时,这些值会失去某些概率属性。最明显的是,它们的总和不再等于 1。此外,挑选项目的顺序可能会干扰挑选一组的整体概率。例如,从 {1,2,3} 开始,选择 1 然后 2 可能与选择 2 然后 1 的概率不同 - 可能您希望在这方面保持一致。
标签: java algorithm random performance