35|洗牌算法:随机的哲学,如何用程序来洗一副牌?
黄清昊(微扰君)
该思维导图由 AI 生成,仅供参考
你好,我是微扰君。
专栏正文已经结束了,在过去一段时间里我们一起学的知识,不知道你掌握得怎么样了呢?如果还意犹未尽的话,从今天开始我们会陆陆续续聊一些其他话题,作为特别番外,希望你可以和我一起继续享受其中的思维乐趣。
今天就先从一个颇有趣味的“洗牌算法” 来开始我们的番外之旅。
“洗牌算法”,顾名思义就是给一副牌,让你用计算机打乱这副牌,这也是一道常见的算法面试题,输入一个数组,让你将数组元素进行“一定程度”的随机重排,也就是使牌组变“乱”。
乍一看你是不是觉得这个问题也太简单了,只需要一点数学基础就能写出来。但是实际上,不同的实现,效率和正确性会有巨大的差异。
那现在就让我们一起来探究洗牌算法的不同实现方式吧。
如何洗牌
首先考虑最直观的实现,就是直接模拟现实世界里人们是如何洗牌的。
生活中一种比较常见的洗牌做法就是把牌从牌堆中切出一叠,调换其在牌组中的顺序,然后重复这个过程许多次,直至牌组被打乱至不可预测的状态,我们就认为之后的发牌是具有随机性的,所以游戏可以公平的进行。
用计算机当然可以很轻松地模拟这个过程,而且相比手动一次切出一叠,用计算机我们可以更精细的每次选出两张牌直接进行位置交换,并反复进行这个过程。直觉告诉我们,经过很多次操作之后,牌就被很好的打乱了,而且因为我们是随机交换的,所以各种可能的牌组排列理论上出现的概率是差不多的。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
洗牌算法是计算机科学中的重要话题,本文介绍了洗牌算法的基本概念和不同的实现方式。文章首先探讨了洗牌算法的背景和意义,详细讨论了不同的洗牌算法实现方式,包括最直观的方法、Fisher-Yates Shuffle算法和Knuth-Durstenfeld Shuffle算法。通过对比不同算法的时间复杂度和空间复杂度,文章指出了Knuth-Durstenfeld Shuffle算法的优势,并给出了该算法的具体实现代码。此外,文章还提到了洗牌算法在实际应用中的例子,如Eureka注册中心的负载均衡和Java中的Collections.shuffle函数。总的来说,本文通过深入浅出的方式介绍了洗牌算法的原理和实际应用,对读者了解和掌握洗牌算法具有一定的参考价值。文章还探讨了三种不同的洗牌算法思路,并提出了课后思考问题,引发读者对算法正确性的思考和讨论。文章内容丰富,既有理论知识又有实际应用,适合对洗牌算法感兴趣的读者阅读学习。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》,新⼈⾸单¥59
《业务开发算法 50 讲》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论