随机排列算法及《算法导论》5.3节习题解答

2023-05-16

随机排列算法及《算法导论》5.3节习题解答

  《算法导论》介绍了两种随机排列数组的算法。

  第一种算法是为数组的每个元素A[i]赋一个随机的优先级P[i],然后依据优先级对数组A中的元素进行排序。例如,如果初始数组A=(1,2,3,4),随机选择的优先级P=(36,3,62,19),则将产生一个数组B=(2,4,1,3),因为第2个优先级最小,接下来是第4个,然后第1个,最后第3个。我们称这个过程为PERMUTE-BY-SORTING:


  
1
2
3
4
5
6

  
PERMUTE-BY-SORTING(A)
n = A.length
let P[1..n] be a new array
for i = 1 to n
P[i] = RANDOM(1,n^3)
sort A, using P as sort keys

第5行选取一个在1~n3之间的随机数。我们使用范围1~n3是为了让P中所有优先级尽可能唯一。我们假设所有的优先级都唯一。

  第二种算法是原址排列给定数组。过程RANDOMIZE-IN-PLACE在O(n)时间内完成。在进行第i次迭代时,元素A[i]是从元素A[i]到A[n]中随机选取的。第i次迭代以后,A[i]不再改变。


  
1
2
3
4

  
RANDOMIZE-IN-PLACE(A)
n = A.length
for i = 1 to n
swap A[i] with A[RANDOM(i,n)]

  以上两种算法都能计算出数组A的一个均匀随机排列,明显第二种算法更加漂亮。

  练习5.3有几个RANDOMIZE-IN-PLACE算法的变形,但他们计算出的排列都不是A的均匀随机排列,下面一起来看一下。


5.3-2 Kelp教授决定写一个过程来随机产生除恒等排列(identity permutation)外的任意排列。他提出了如下过程:


  
1
2
3
4

  
PERMUTE-WITHOUT-IDENTITY(A)
n = A.length
for i = 1 to n-1
swap A[i] with A[RANDOM(i+1,n)]

这段代码实现了Kelp教授的意图吗?

  没有。虽然这个过程不能产生恒等排列,但也不能产生除恒等排列完的任意排列。

  除恒等排列外的任意排列共有n!-1个,但是此过程只能产生(n-1)(n-2)…1=(n-1)!个,还有(n!-1)-(n-1)!个排列不能产生。举个例子:A=(a1,a2,…,an),a1必须和a2,a3,…,an中的某一个交换,假设和aj交换,则a1永远不可能回到第一个位置了,因为当循环到位置j时,aj(原来的a1)也只能被交换到a(j+1),…,an中。而除恒等排列外的任意排列明显包含a1在第一个位置上的排列。

  所以过程PERMUTE-WITHOUT-IDENTITY不能产生除恒等排列外的任意排列。


5.3-3 假设我们不是将元素A[i]与子数组A[i..n]中的一个随机元素交换,而是将它与数组任何位置上的随机元素交换:


  
1
2
3
4

  
PERMUTE-WITH-ALL(A)
n = A.length
for i = 1 to n
swap A[i] with A[RANDOM(1,n)]

这段代码会产生一个均匀随机排列吗?为什么会或为什么不会?

  这段代码不会产生一个均匀随机的排列,使用反证法如下。

  假设这段代码会产生一个均匀随机的排列,且假设n=3,则三个元素的均匀随机排列共有3!=6个,且每个排列出现的概率为1/6。但是过程PERMUTE-WITH-ALL一共产生n3=27(n=3,3次for循环,每次RANDOM(1,3)有3可能)个排列,假设共有m个互异的排列,且排列是均匀随机的,则每个互异的排列的概率为m/27,且满足m/27=1/6。但是m没有整数解,所以原假设不成立,即过程PERMUTE-WITH-ALL不能产生一个均匀随机的排列。

  实际上当n=3时,产生的排列及概率如下:

(1,2,3)4/27(1,3,2)5/27(2,1,3)5/27(2,3,1)5/27(3,1,2)4/27(3,2,1)4/27

虽然他们产生了所有的排列,且概率总和为1,但是他们不是随机均匀的,因为每一种排列的概率不相等。


5.3-4 Armstrong教授建议用下面的过程来产生一个均匀随机排列:


  
1
2
3
4
5
6
7
8
9
10

  
PERMUTE-BY-CYCLIC(A)
n = A.length
let B[1..n] be a new array
offset = RANDOM(1,n)
for i = 1 to n
dest = i + offset
if dest > n
dest = dest - n
B[dest] = A[i]
return B

请说明每个元素A[i]出现在B中任何特定位置的概率是1/n。然后通过说明排列结果不是均匀随机排列,表明Armstrong教授错了。

  A[i]出现在B中的位置是由offset决定的,而且只要offset决定了,则整个B就决定了;又因为offset=RANDOM(1,n),所以特定的offset出现的概率相等,都为1/n,所以每个元素A[i]出现在B中任何特定位置的概率是1/n。

  因为offset只有n种可能,所以B也只有n种可能,但是A的所有均匀随机排列共有n!种情况,所以还有n!-n种情况没有出现,即排列结果不是均匀随机的。


*5.3-5 证明:在过程PERMUTE-BY-SORTING的数组P中,所有元素都唯一的概率至少是1-1/n。

  假设RANDOM(1,n3)产生的n个数为a1,a2,…,an,事件Xi表示a1~ai互不相等,则Xn表示a1~an互不相等,Xn是在X(n-1)的基础上保证an和a1~a(n-1)互不相等,即Xn={an不等于a1,a2,…,a(n-1)之一}∩X(n-1),于是P(Xn)=P{{an不等于a1,a2,…,a(n-1)之一}∩X(n-1)},根据条件概率公式得:

随机排列算法及《算法导论》5.3节习题解答
所以数组P中,所有元素都唯一的概率至少是1-1/n。

 

 


5.3-6 请解释如何实现算法PERMUTE-BY-SORTING,以处理两个或更多优先级相同的情形。也就是说,即使有两个或更多优先级相同,你的算法也应该产生一个均匀随机排列

  对几个优先级相同的项,再进行一轮随机优先级排序;如果再有相同,再进行一次…思路就是要确保这几个优先级相同的项得到随机的排列。

转自http://beeder.github.io/2014/12/19/random-permutation-algorithms-and-some-solutions-to-clrs-ch5-3/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机排列算法及《算法导论》5.3节习题解答 的相关文章

随机推荐

  • STM32输出PWM波形错误解析

    一 背景 项目中需要用STM32F407输出4路PWM波形控制两个A4950模块 xff0c 从而驱动2个直流电机 使用TIM1的在PE9 PE11 PE13 PE14上分别产生4路PWM波形 xff0c 前两路 xff08 记作pwm1
  • Kubernetes 1.20:最优秀、美妙、酷的版本

    你填了吗 xff1f 2020年CNCF中国云原生问卷 问卷链接 xff08 https www wjx cn jq 97146486 aspx xff09 作者 xff1a Kubernetes 1 20发布团队 我们很高兴地宣布Kube
  • C++常见问题总结

    C 43 43 问题总结模块 编程之路总是路漫漫其修远兮 xff0c 吾将上下而求索 1 no matching function for call to 借用CSDN某位的文章 xff0c 成功修改错误 大概截图如下 源代码 xff1a
  • 字符串函数strchr 、 strrchr 、strrstr的实现

    include lt stdio h gt include lt stdlib h gt include lt assert h gt char my strchr const char dst char c 由于我们只是查找 xff0c
  • cadence常见问题一

    1 在画元件库时 xff0c 双击编辑一个引脚 xff0c 编辑好了点了OK xff0c 引脚就从左边跑到了右边 xff1f xff1f xff1f 居然不是固定的 xff1f 我在user properties设置下引脚名字可视化 xff
  • keil,stm32,watch窗口,正确的串口数据后面还出现ASCII字符?

    这个问题不知道如何解决 xff0c 串口调试助手数据显示都是准确的 xff0c watch窗口看就不正确 不知道正确数据后面的是什么 xff1f
  • MS5611气压计数据测试报告

    气压计测得气压和温度值为模拟量 xff0c ms5611气压计会自动将模拟量转换成数字量 xff0c 对于不同的精度 xff0c 转换时间也不相同 本测试选用的精度为最高的OSR 61 4096 xff0c 如下表所示 xff0c 转换时间
  • Fatfs文件系统,f_open函数返回值为FR_DISK_ERR解决方法

    最近在操作TF卡 xff0c 芯片stm32f103c8t6 xff0c 编译环境KEIL xff0c 金士顿32G卡 xff0c 用Fatfs文件系统向卡中写入数据 出现的问题 xff1a f open函数返回值为FR DISK ERR
  • Fatfs文件系统向文件写内容出现f_write返回值为1的问题

    f write返回值为1 xff0c 则就是FR DISK ERR 1 A hard error occurred in the low level disk I O layer 低级磁盘I O层中发生硬错误 问题解决方式 xff1a 1
  • vl53l1x激光测距讲解

    使用模块 ATK VL53L0X激光测距模块或者淘宝其他模块 通信方式 xff1a IIC xff0c 接口SHUT用于开机启动时序中 xff0c int是中断模式中的引脚 xff08 触发中断 xff09 参考资料 xff1a https
  • 如何完成一篇发明专利

    专利的组成部分 xff1a 说明书摘要摘要附图权利要求书说明书说明书附图 参考的文献有 专利法 专利审查指南 xff0c 大致写完一篇发明专利需要半个月的时间 xff1b 参考网址 xff0c http www soopat com htt
  • cmd python 缩进 3个点

    问题描述 xff1a indentationerror expected an indented block for 语句和if语句都会遇到 xff0c 解决方法是for 语句和if语句冒号后 xff0c 按enter切换下一行 xff0c
  • 陀螺仪和加速度计MPU6050的单位换算方法

    对于四轴的初学者 xff0c 可能无法理解四轴源代码里面陀螺仪和加速度数据的那些数学转换方法 下面我们来具体描述下这些转换方法 我们首先来看陀螺仪数据 在MPU6050的手册里面 xff0c 提供了一个陀螺仪数据表如下 xff1a 在表格里
  • 【Final Project】Kitti的双目视觉里程计(1)

    1 从CMake文件了解整体结构 xff08 1 xff09 前置工作 0 xff09 文件结构 app CMakeLists txt run kitti stereo cpp CMakeLists txt cmake modules Fi
  • 觅香

    立于浮华之世 奏响天籁之音
  • 多旋翼无人机推荐书

    惯性仪器测试与数据分析 惯性导航 xff08 秦永元 xff09 先进 PID 控制 MATLAB 仿真 多旋翼飞行器设计与控制
  • 飞控PID详解

    串级PID xff1a 单极PID适合线性系统 xff0c 当输出量和被控制量呈线性关系时单极PID能获得较好的效果 xff0c 但是四轴不是线性系统 xff0c 现代学者认为 xff0c 四轴通常可以简化为一个二阶阻尼系统 为什么四轴不是
  • Keil:ST-LINK USB communication error

    error flash download failed target dll has been cancelled 1 USB口的问题 xff1a USB供电不好 xff0c 或则USB驱动程序或ST Link驱动程序有问题 我的解决方案就
  • Cadence OrCAD BOM如何输出封装信息

    Cadence OrCAD 如何输出带封装信息的BOM 1 选中DSN文件 xff0c 打开Tools菜单中 选择Bill of materials选项 2 Bill of materials对话框设置如下 3 ORCAD输出的BOM表是文
  • 随机排列算法及《算法导论》5.3节习题解答

    随机排列算法及 算法导论 5 3节习题解答 算法导论 介绍了两种随机排列数组的算法 第一种算法是为数组的每个元素A i 赋一个随机的优先级P i xff0c 然后依据优先级对数组A中的元素进行排序 例如 xff0c 如果初始数组A 61 1