选择具有元素权重的随机排列

时间:2013-09-23 21:04:57

标签: algorithm time-complexity

假设我们要选择{1,2,...,n}的随机排列,但在元素p(i)上使用正概率i,以及i是第一个元素的概率置换为p(i),然后如果选择i作为第一个元素,那么置换中的第二个元素为j的概率为p(j) / (1 - p(i)),依此类推,其中在给定位置选择元素m的概率始终与p(m)成比例。什么是生成随机排列的有效方法?天真地,我们可以在计算O(log n)的累积总和之后在p(i)时间内选择第一个元素,但是如果所选元素在列表的中间附近则更新概率的累积总和{ {1}}时间,导致O(n)算法。

我有一个想法是,如果所有O(n^2)都与p(i)成比例(在有限常数因子内),那么我们可以通过允许重复一段时间来实现预期的1/n时间(如果获得重复,则重新绘制),直到到目前为止所选择的元素的概率总和超过1/2。然后删除所有选定的元素,并为剩余的未选择元素更新O(n log n)的累积总和。但是,如果元素的概率出现故障并且非常倾斜,例如p(i),则这不起作用。但后来我想,如果我们在计算累积总和之前根据1/2,1/4,1/8...i按递增顺序,并遵循类似的策略,并且所选元素的p(i)总和超过选择当前集合中p(i)之和的一部分,然后更新从最大p(i)开始的累积总和,并向后移除所选元素并更新p(i)的累积总和,直到p(i)未选择元素的总和高于未删除元素累积总和的某一部分。这个或其他策略是否会给出预期的p(i)时间?有人可以填写详细信息吗?

1 个答案:

答案 0 :(得分:1)

您基本上是在寻找这个问题的答案:"What is a good datastructure to keep cumulative values in?"

有两个答案导致O(n log n)算法。 One answer提出了一个二叉树,它还追踪所有子节点的总和。 Another answer提及Cumulative Frequency Tables这基本上是相同的想法。