假设我们要选择{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)
时间?有人可以填写详细信息吗?
答案 0 :(得分:1)
您基本上是在寻找这个问题的答案:"What is a good datastructure to keep cumulative values in?"
有两个答案导致O(n log n)
算法。 One answer提出了一个二叉树,它还追踪所有子节点的总和。 Another answer提及Cumulative Frequency Tables这基本上是相同的想法。