是否有可能均匀地对n个大小的阵列的元素进行混洗,即n的任何一个的概率!在预期O(n)
时间内发生的组合是相同的。怎么会这样?
我必须将A
的元素改组为新数组B
当我尝试这样做时,我想到的第一件事就是从1到n选择一个随机数i
,看看是否已经选择A[i]
,如果是,则重复,否则将A[i]
放在B
的第一个可用位置。
但是,此优惠券收集器问题已预计时间O(n log n)
。
有人可以提出O(n)
预期时间算法。
感谢。
答案 0 :(得分:11)
您应该查看Fisher-Yates随机播放。
来自文章:
妥善实施,费雪耶茨 shuffle是公正的,所以每一个 排列同样可能。该 现代版的算法是 也很有效率,只需要 时间与数量成正比 物品被洗牌,没有额外的 存储空间。
所以它符合您的要求。它也很容易实现。
答案 1 :(得分:0)
对于每个阵列位置:
从当前位置到数组末尾选择一个随机数
以随机位置交换当前位置
这应该给你O(n)没有找到未使用的阵列位置的挑战。这假设您可以使用就地交换,而不必创建新阵列。
答案 2 :(得分:0)
你想要的是 random sample集合,它以相同的概率对每个元素进行采样。