是否存在一种算法,给定符号的有序列表{a1,a2,a3,...,ak},在O(n)时间内以随机顺序产生相同符号的新列表而没有偏差? “没有偏见”是指任何符号 s 最终会在列表中的某个位置 p 的概率为1 / k。
假设可以在O(1)时间内生成1-k(包括1-k)的非偏置整数。还假设O(1)元素访问/变异是可能的,并且可以在O(k)时间内创建大小为k的新列表。
特别是,我会对'生成'算法感兴趣。也就是说,我会对具有O(1)初始开销的算法感兴趣,然后为列表中的每个插槽生成一个新元素,每个插槽花费O(1)时间。
如果上述问题不存在解决方案,我仍然希望通过以下一种或多种方式(和/或必要时以其他方式)了解不符合我约束条件的解决方案:
我应该补充一点,这个问题似乎与从1-k中随机排序整数的问题相同,因为我们可以从1-k排序整数列表,然后对每个整数 i 在新列表中,我们可以生成符号ai。
答案 0 :(得分:8)
是 - Knuth Shuffle。
答案 1 :(得分:4)
Fisher-Yates Shuffle (Knuth Shuffle)正是您要找的。 p>