《大学算法教程Algorithms》笔记--Chapter1--Part2
来源:互联网 发布:淘宝网中老年女装外套 编辑:程序博客网 时间:2024/06/13 02:28
书中提到一个打乱数组的算法:
下面假设传入的数组满足 a[i]=i
伪代码如下:
shuffle(a){ for i=1 to a.last-1 swap( a[i], a[rand(i,a.last)] )}
这个算法的巧妙之处在于它可以实现 所有可能的排列.
所以第i个元素,必须与 第i个到数组结尾的所有元素 随机交换, 必须包括i本身 才能实现所有可能的排列
数学上来说就是 n*(n-1)*......*2种可能的交换,这实际上就是n!,也就对应着n个元素的所有排列的可能性
(注意,保持数组不变,也就是不交换任何元素的可能性也包含在其中)
如果rand的随机性足够好,这也就会等概率的产生所有1到n的排列.
这也算是习题1.2的一个证明吧.
另外,习题1.3中所算法改成
new_shuffle(a){ for i=1 to a.last swap( a[i], a[rand(1,a.last)] )}
新的算法会让每个元素和所有元素随机交换,这应该有n^n种可能性,若想等概率的产生所有的n!种排列,这个数字应该是n!的整数倍,这是不可能的.
因为,若n是偶数,则n-1是奇数,n^n无法被n!整除,若n是奇数,也得出同样的结论
所以新的算法无法等概率的产生1到n的所有排列.
所以,现在可以写一个简单的算法,来随机产生n个数的一个排列
random_permutation(n,a){ for i = 1 to n a[i] = i for i = 1 to n-1 swap( a[i], a[rand(i,n)] )}
0 0
- 《大学算法教程Algorithms》笔记--Chapter1--Part2
- 《大学算法教程Algorithms》笔记--Chapter1--Part1
- 《大学算法教程Algorithms》笔记--Chapter1--Part3
- Part2-HttpClient官方教程-Chapter1-基础
- 【笔记】《C#大学教程》- 第12章 GUI(二)Part2
- Andrew-Coursera-DL课程-笔记part2-2(Optimization algorithms)
- Starting with Algorithms(Part2)
- 九章算法笔记10.3 part2
- Felomeng算法导论(第二版)学习笔记Chapter1
- java大学教程第一章笔记
- 笔记1 《C++ 大学教程》
- 笔记2 《C++大学教程》
- 笔记3 《C++大学教程》
- 笔记5 《C++大学教程》
- 笔记6 《C++大学教程》
- 笔记7 《C++大学教程》
- 笔记8 《C++大学教程》
- 笔记9 《C++ 大学教程》
- python命令行参数解析示例应用
- UniSky入门资料
- android4.4 Browser 浏览器模式选项 默认值修改
- tinyxml linux下编译动态库
- git 上常见的问题 汇总
- 《大学算法教程Algorithms》笔记--Chapter1--Part2
- android获取系统自带浏览器书签
- adb client, adb server, adbd原理浅析
- POJ2185-Milking Grid(KMP,next数组的应用)
- String 的split
- kendo AutoComplete实现多筛选条件
- uva 10296 - Jogging Trails (中国邮路问题 状压dp)
- Java开发桌面程序SWING,设置主窗口位置居中一般使用下面的方法
- BZOJ 1079: [SCOI2008]着色方案