如何以最低的复杂度随机排列大约20个元素?(生成随机排列)
Knuth 洗牌算法 是一个不错的选择。
在第一篇文章中,我探讨了一些可能性,最终得到了“用O(n)的复杂度对通用列表进行随机排列”的函数,并适当封装以在不可变数据上工作(即,它是无副作用的)。
在第二篇文章中,我使其均匀分布。
代码使用F#编写,希望您不介意!
祝你好运。
编辑:我没有正式的证明,但直觉告诉我,这种算法的复杂度不能低于O(n)。如果有更快的算法,请分享给我,我将不胜感激!
k
,都有p(k) != k
的排列p
)需要访问每个元素。因此最坏情况下时间复杂度为O(n)。或者这样说还不够正式吗? - Steve Jessoplist newList
foreach (element in firstList)
int position = Random.Int(0, firstList.Length - 1)
while (newList[position] != null)
position = (position + 1) % firstList.Length
newList[position] = element
编辑:事实证明,这个答案并不是很好。它既不特别快,也不特别随机。感谢您的评论。要获得一个好的答案,请滚动回页面顶部 :-)
有可能已经有人为您实现了洗牌功能。例如,在 Python 中,您可以使用random.shuffle
,在 C++ 中使用 random_shuffle
,在 PHP 中使用 shuffle
。