引言
逛知乎时,看到一个问题:世界上有哪些代码量很少,但很牛的算法?
有一个回答提到了洗牌算法。(在此感谢程序员吴师兄的回答,原文链接找不到了)看完之后,惊为天人,特此记录,致敬一下发明算法的大神。
题目描述
扑克牌大家都玩过吧?有没有想过三人斗地主是怎么发牌的呢?
一言以蔽之,洗牌算法要求我们设计一个公平的算法去完成洗牌。
解决方案?
洗牌?那就随机交换其中的两个数k次吧。
k取多少呢?对于n = 100,k取10000次太多;对于n = 1E10,k取10000次又太少,似乎不好界定。
好,就算你想方设法确定了一个合理的k,那么,这样洗牌真的公平吗?
能否保证每个位置上出现的牌都是等概率的呢?Emmmm…陷入沉思。
机智的你,灵光一闪!
对于n张牌,共有n!种排列组合的情况,我们从n!种随机选取一种,那么每个组合出现的概率即为1/ n!,决定的公平!
Yes but not best,O(n!)的时间复杂度实在是太爆炸了,无法容忍。
啊,投降。
神之算法 —— Knuth洗牌算法
先上代码: