Knuth公平洗牌算法(给一个数组随机排序)

洗牌算法的重要原则就是“全面”而且“公平”,并且要使用尽可能小的时间复杂度来实现。

什么叫公平呢?一旦你开始思考这个问题,其实答案不难想到。洗牌的结果是所有元素的一个排列。一副牌如果有 n 个元素,最终排列的可能性一共有 n! 个。公平的洗牌算法,应该能等概率地给出这 n! 个结果中的任意一个。

如思考到这一点,我们就能设计出一个简单的暴力算法了:对于 n 个元素,生成所有的 n! 个排列,然后,随机抽一个。
这个算法绝对是公平的。但问题是,复杂度太高。复杂度是多少呢?O(n!)。因为,n 个元素一共有 n! 种排列,我们求出所有 n! 种排列,至少需要 n! 的时间。

那么这个问题的最优解肯定不是这样的, 我们只需要讲这个一般问题特殊化,只要保证特殊化的解法属于n!排列中的一种即可,Knuth算法就是这样做的。

算法的过程很简单,假设有[1,2,3,4,5]这样一个数组,每次随机过程,都在头部数组中随机选取一个数组,和候选区域的尾部数字进行交换,交换完毕后当前的候选区域尾部数字进入到固定区域,以此循环n次即可,以下面几张图来表示过程及概率:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlexGeek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值