业务开发算法 50 讲
黄清昊
Hashdata 数据库内核工程师,LeetCode 高赞答主,公众号微扰理论作者
23293 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
业务开发算法 50 讲
15
15
1.0x
00:00/00:00
登录|注册

35|洗牌算法:随机的哲学,如何用程序来洗一副牌?

Go语言实现
每个位置出现各个元素的概率是1/n
C++实现
空间复杂度O(1)
时间复杂度O(n)
在原始数组上操作
空间复杂度O(n)
时间复杂度O(n^2)
Go语言实现
逐位确定数组每个位置应该选择的元素
代码示例
随机交换牌的位置
如何验证洗牌算法的正确性
JDK内置shuffle函数
Eureka注册中心负载均衡
等概率证明
代码示例
改进
弊端
代码示例
思路
“乱”的量化定义
交换次数与牌组大小的关系
模拟现实洗牌
“乱”:随机生成数组的一种排列,使数组的所有排列情况都能以等概率的方式被选出来
课后思考
实际应用
Knuth-Durstenfeld Shuffle 算法
Fisher-Yates Shuffle 算法
正确性问题
直观实现
定义
洗牌算法总结

该思维导图由 AI 生成,仅供参考

你好,我是微扰君。
专栏正文已经结束了,在过去一段时间里我们一起学的知识,不知道你掌握得怎么样了呢?如果还意犹未尽的话,从今天开始我们会陆陆续续聊一些其他话题,作为特别番外,希望你可以和我一起继续享受其中的思维乐趣。
今天就先从一个颇有趣味的“洗牌算法” 来开始我们的番外之旅。
“洗牌算法”,顾名思义就是给一副牌,让你用计算机打乱这副牌,这也是一道常见的算法面试题,输入一个数组,让你将数组元素进行“一定程度”的随机重排,也就是使牌组变“乱”。
乍一看你是不是觉得这个问题也太简单了,只需要一点数学基础就能写出来。但是实际上,不同的实现,效率和正确性会有巨大的差异。
那现在就让我们一起来探究洗牌算法的不同实现方式吧。

如何洗牌

首先考虑最直观的实现,就是直接模拟现实世界里人们是如何洗牌的。
生活中一种比较常见的洗牌做法就是把牌从牌堆中切出一叠,调换其在牌组中的顺序,然后重复这个过程许多次,直至牌组被打乱至不可预测的状态,我们就认为之后的发牌是具有随机性的,所以游戏可以公平的进行。
用计算机当然可以很轻松地模拟这个过程,而且相比手动一次切出一叠,用计算机我们可以更精细的每次选出两张牌直接进行位置交换,并反复进行这个过程。直觉告诉我们,经过很多次操作之后,牌就被很好的打乱了,而且因为我们是随机交换的,所以各种可能的牌组排列理论上出现的概率是差不多的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

洗牌算法是计算机科学中的重要话题,本文介绍了洗牌算法的基本概念和不同的实现方式。文章首先探讨了洗牌算法的背景和意义,详细讨论了不同的洗牌算法实现方式,包括最直观的方法、Fisher-Yates Shuffle算法和Knuth-Durstenfeld Shuffle算法。通过对比不同算法的时间复杂度和空间复杂度,文章指出了Knuth-Durstenfeld Shuffle算法的优势,并给出了该算法的具体实现代码。此外,文章还提到了洗牌算法在实际应用中的例子,如Eureka注册中心的负载均衡和Java中的Collections.shuffle函数。总的来说,本文通过深入浅出的方式介绍了洗牌算法的原理和实际应用,对读者了解和掌握洗牌算法具有一定的参考价值。文章还探讨了三种不同的洗牌算法思路,并提出了课后思考问题,引发读者对算法正确性的思考和讨论。文章内容丰富,既有理论知识又有实际应用,适合对洗牌算法感兴趣的读者阅读学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部