数组/ n的随机元素均匀随机排列。可能在预期的O(n)时间内

时间:2011-04-10 18:37:50

标签: algorithm probability

是否有可能均匀地对n个大小的阵列的元素进行混洗,即n的任何一个的概率!在预期O(n)时间内发生的组合是相同的。怎么会这样? 我必须将A的元素改组为新数组B 当我尝试这样做时,我想到的第一件事就是从1到n选择一个随机数i,看看是否已经选择A[i],如果是,则重复,否则将A[i]放在B的第一个可用位置。 但是,此优惠券收集器问题已预计时间O(n log n)。 有人可以提出O(n)预期时间算法。

感谢。

3 个答案:

答案 0 :(得分:11)

您应该查看Fisher-Yates随机播放。

来自文章:

  

妥善实施,费雪耶茨   shuffle是公正的,所以每一个   排列同样可能。该   现代版的算法是   也很有效率,只需要   时间与数量成正比   物品被洗牌,没有额外的   存储空间。

所以它符合您的要求。它也很容易实现。

答案 1 :(得分:0)

对于每个阵列位置:

从当前位置到数组末尾选择一个随机数

以随机位置交换当前位置

这应该给你O(n)没有找到未使用的阵列位置的挑战。这假设您可以使用就地交换,而不必创建新阵列。

答案 2 :(得分:0)

你想要的是 random sample集合,它以相同的概率对每个元素进行采样。