《算法导论》习题5.3-1 ~ 5.3-7
《算法导论》习题 5.3.1 - 5.3.7
5.3-5 带星号我抄了一下题目, 5.3-6 比较有意思我抄了一下题目, 其他的题可以自己对照书(原书第三版).
5.3-1
直接考虑第2次循环前, 第1次循环后第1个位置的元素是原集合1 ~ n中任意一个元素的概率总是 1/n1/n1/n, 所以可以以此为循环不变式的起点而不必使用空集合和0排列。
5.3-2
容易证明该算法一定不会产生恒等排列, 因为第一次循环后第一个元素一定是原排列中2 ~ n中的某个元素。现在证明Kelp教授没有实现均匀随机排列。
其实最简单的证明方法是给出一个n = 3的特例, 即当输入为1,2,3时, 输出为2,3,1(p = 0.5)或3,1,2(p = 0.5), 2, 1,3出现的概率为0,显然无法产生一个均匀随机排列。但是这里为了锻炼使用循环不变式,还是用它来进行以下代数上的证明。
Kelp教授的意图为, 经过随机排列之后, 任意一个非恒等排列出现的概率均为1/(n!−1)1 / (n! -1 )1/(n!−1)。
还是尝试使用循环不变式证明。假设第i次循环之后, 对于任意非恒等子排列出现在前 i 位的概率为1/(Ani−1)1 / (A_n^i -1 )1/(Ani−1)。如果假设成立, 当迭代到 i=n−1i = n - 1i=n−1时,Kelp教授的目的实现。相反的, 如果存在某一个i导致该假设不成立, 那么即可另n = i + 1, 即至少对于该n, Kelp教授无法实现其目的, 反证得证。
容易观察到, 当第一次循环结束后, 第1个位置是任意非恒等1元素排列概率为1/(n−1)1 / (n -1)1/(n−1), 满足假设。现在证明下一次循环后该假设不成立。
设事件E1E_1E1表示i次循环后, 对于任意的特定非恒等子排列,该排列的前 i - 1位出现在数列的前 i - 1 位;事件E2E_2E2表示该特定非恒定子排列的第 i 位出现在数列的第i位置。当当且仅当E1,E2E_1, E_2E1,E2同时发生的时候该特定顺序的前i位出现在数列的前i位。该事件的概率为P(E1⋂E2)=P(E2∣E1)∗P(E1)P(E_1 \bigcap E_2) = P(E_2 | E_1) * P(E_1)P(E1⋂E2)=P(E2∣E1)∗P(E1)。事件E1E_1E1发生 => 特定顺序的第 i 位在数列的 i ~ n位中。 事件E2∣E1E_2 | E_1E2∣E1发生的概率是(n−i)/(n−i+1)∗1/(n−i)=1/(n−i+1)(n - i) / (n - i + 1) * 1 / (n - i) = 1 / (n - i + 1)(n−i)/(n−i+1)∗1/(n−i)=1/(n−i+1), 显然1/(n−i+1)∗1/(Ani−1−1)≠1/(Ani−1)1 / (n - i + 1) * 1 / (A_n^{i - 1} - 1) \ne 1 / (A_n^i - 1)1/(n−i+1)∗1/(Ani−1−1)=1/(Ani−1)。所以假设无法递推,反证得证。
5.3-3
该代码显然不会产生均匀随机排列, 证明思路和之前的非常类似, 使用循环不变式即可证明, 这里略。
5.3-4
这个题的意思我没有特别明确。容易证明A[i]A[i]A[i]出现在BBB上任何特定位置的概率都是1/n1/n1/n, 因为destdestdest取1 ~ n中任何一个数的概率是相同的, 但是该算法的有一个问题是无法保证每次循环不会修改B上已经被赋值的位置, 该算法甚至无法正常工作,亦没有讨论的必要了。
*5.3-5
题目:证明对于元素为1 ~ n的数列,随机给每一个元素生成 1 ~ n3n^3n3整数标号, n个元素每个标号都不同的概率至少是1−1/n1 - 1/n1−1/n.
设事件EiE_iEi为第i个生成的标号与之前所有标号都不同, 那么每个标号都不同的概率就是
P(E)=P(E1⋂E2⋂E3.....⋂En)即P(E)=P(E1)∗P(E2∣E1)∗P(E3∣E2⋂E3)....∗P(En∣En−1⋂...⋂E1);即P(E)=∏i=1nn3−i+1n3=∏i=1n−1n3−in3P(E) = P(E_1 \bigcap E_2 \bigcap E_3 ..... \bigcap E_n) \ 即 \\ P(E) = P(E_1) * P(E_2 | E_1) * P(E_3| E_2 \bigcap E_3) .... * P(E_n | E_{n-1} \bigcap ...\bigcap E_1); \ 即\\ P(E) = \prod_{i = 1}^{n}\frac{n^3 - i + 1}{n^3} = \prod_{i=1}^{n-1}\frac{n^3-i}{n^3} P(E)=P(E1⋂E2⋂E3.....⋂En) 即P(E)=P(E1)∗P(E2∣E1)∗P(E3∣E2⋂E3)....∗P(En∣En−1⋂...⋂E1); 即P(E)=i=1∏nn3n3−i+1=i=1∏n−1n3n3−i
因为对于i >= 1 有 n3−i>n3−nn^3 - i > n^3 - nn3−i>n3−n, 所以
P(E)≥(n3−nn3)n−1=(n3−n)n−1n3(n−1)P(E) \ge (\frac{n^3 - n}{n^3})^{n-1} = \frac{(n^3-n)^{n-1}}{n^{3(n-1)}} P(E)≥(n3n3−n)n−1=n3(n−1)(n3−n)n−1
通分1−1/n1 - 1/n1−1/n 得
1−1/n=n−1n=(n−1)3n3=(n−1)3(n−1)n3(n−1)1 - 1/n = \frac{n-1}{n} = \frac{(n-1)^3}{n^3} = \frac{(n-1)^{3(n-1)}}{n^{3(n-1)}} 1−1/n=nn−1=n3(n−1)3=n3(n−1)(n−1)3(n−1)
显然由
n3−n≥(n−1)3(n>0)n^3 - n \ge (n-1)^3 \ \ \ \bold{(n > 0)} n3−n≥(n−1)3 (n>0)
可推出
P(E)≥1−1/nP(E) \ge 1 - 1/n P(E)≥1−1/n
得证。
5.3-6
原优先级随机排序算法:给1 ~ n的每个输入随机生成1 ~ n3n^3n3 的整数优先级,根据优先级进行排序。的算法没有考虑随机生成的优先级相同的情况, 给出你的修改使得该算法能处理优先级相同的情况。
思考最极端的情况, 即一次随机生成的优先级全部相同。该事件发生的概率是(1n3)n−1(\frac{1}{n^3})^{n-1}(n31)n−1, 而我们已经知道, 对于每个优先级都不同的情况, 恒等排列的概率和任意排列的概率相同, 为1/n!1/n!1/n!。所以,如果以任意特定的顺序对全部优先级相同的情况进行处理, 都会导致某一个特定排列的概率增加, 所以必须对这种情况作随机化处理, 所以应该使用如下的方式解决该问题:即当出现优先级相同的情况时, 标记优先级相同的元素, 递归调用该算法直至没有优先级相同的元素存在。现简单说明证明该方法生成的排列是均匀的的证明思路。
设对长度为n的数组生成优先级后, 有k个元素优先级重复k∈[0,n]k \in [0, n]k∈[0,n]。显然这个k个元素的每一个排列单独对应了整个数组的 q 个排列,容易证明 q=Ann−k=n!/k!q = A_n^{n-k} = n! / k!q=Ann−k=n!/k!。
在已经出现k个元素优先级相同的情况下, 该优先级数列所表达的排列正好是一个特定的排列的事件EEE, 等于事件E1E_1E1: 优先级不同的n - k 个元素的顺序恰好是该特定顺序中优先级不同元素对应 的顺序, 和事件E2E_2E2, 优先级相同的k个元素的某个特定顺序是该特定顺寻。E发生正好E1,E2同时发生即P(E)=P(E1⋂E2)=P(E2∣E1)∗P(E1)P(E) = P(E_1 \bigcap E_2) = P(E_2|E_1) * P(E_1)P(E)=P(E1⋂E2)=P(E2∣E1)∗P(E1)。
显然P(E1)=k!/n!P(E_1) = k!/n!P(E1)=k!/n!, 若要求P(E)=1/n!P(E) = 1/n!P(E)=1/n!, 则需要P(E2∣E1)=1/k!P(E_2|E_1) = 1/k!P(E2∣E1)=1/k!, 正好是要求k个相同优先级对应的元素的每种可能的顺序均为1/k!1/k!1/k!, 而递归应用该算法恰好能达成这一目的。
得证。
5.3-7
证明下列算法
// java code
Set<Number> randomSample(int m, int n) {if (m == 0)return new Set<Number>();Set<Number> s = randomSample(m - 1, n - 1);i = random(1, n) // [1, n] 闭区间if (s.contains(i)) {s.add(n) // s = s ∪ {n}}else {s = s.add(i) // s = s ∪ {i}}return s;
}
可以创建集合{1, 2, 3,… ,n} 的一个大小为m的随机样本使得每一个大小为m的子集的概率相同。
证明
还是尝试使用循环不定式来进行证明。严格意义上集合不应该分顺序, 但是算法中random(1, n)和集合元素的自然顺序让我们很方便的将集合看作有序的。集合的前 i 个元素意为 {1, 2, …, i}集合中的元素。
假设对于任意的i∈[1,m]i \in [1, m]i∈[1,m]表示递归返回次序(递归越深i越小)。当第 i 次递归返回前,已经选取出的容量为 i - 1的子集是集合S的前 n - m + i - 1 个元素组成的集合的任意一个容量为 i - 1 的子集的概率相等, 均为 1/Cn−m+i−1i−11 / C_{n - m + i - 1}^{i-1}1/Cn−m+i−1i−1。当 i 增加到 m + 1 的时候, 从集合中前n个元素选出的任意一个容量为m的子集的概率为1/Cnm1 / C_n^{m}1/Cnm。
i = 1 时, 空集包含空集的概率为1.当i = 2时,第一个选出的元素是S的前n - m + 1 个元素中的任意一个的概率P=1/(n−m+1)P = 1/(n - m + 1)P=1/(n−m+1)。满足假设。现在证明第i次递归返回后该假设仍然成立。
设事件EEE表示第 i 次递归返回后,返回的容量为i的子集合是S的前 n - m + i元素构成的集合中的某一个特定组合。该特定组合的前 i - 1 个元素一定均小于 n - m + i, 即一定是前 n - m + i - 1元素构成的集合某个容量为 i - 1的子集。
设E1E_1E1 包含第 i - 1次递归返回的集合属于该特定集合。
设E2E_2E2 表示第 i 次递归添加的元素属于该特定集合。
设E3E_3E3 表示该特定集合最大的元素正好是 n - m + i。
事件 EEE 相当于 E1,E2E_1, E_2E1,E2同时发生。
P(E)=P(E1⋂E2)=P(E1∣E2)P(E2)P(E) = P(E_1 \bigcap E_2) = P(E_1 | E_2)P(E_2) \\ P(E)=P(E1⋂E2)=P(E1∣E2)P(E2)
无论E3E_3E3是否发生, 当E2E_2E2发生时, 该特定顺序集合第 i 次之 前 添加的元素一定小于 n−m+in - m + in−m+i,根据假设, 这些元素构成的集合恰好是 i - 1次递归返回的集合的概率为1/Cn−m+i−1i−1{1}/{C_{n-m+i-1}^{i-1}}1/Cn−m+i−1i−1。
P(E1∣E2E3)=1/Cn−m+i−1i−1P(E1∣E2E3ˉ)=1/Cn−m+i−1i−1P(E1∣E2)=1/Cn−m+i−1i−1P(E_1|E_2E_3) = 1 / C_{n - m +i - 1}^{i-1} \\ P(E_1|E_2\bar{E_3}) = 1 / C_{n - m +i - 1}^{i-1}\\ P(E_1|E_2) = 1 / C_{n - m +i - 1}^{i-1}\\ P(E1∣E2E3)=1/Cn−m+i−1i−1P(E1∣E2E3ˉ)=1/Cn−m+i−1i−1P(E1∣E2)=1/Cn−m+i−1i−1
根据概率论公理:
P(E2)=P(E2⋂E3)+P(E2⋂E3ˉ)P(E2)=P(E2∣E3)P(E3)+P(E2∣E3ˉ)PE3ˉP(E_2) = P(E_2 \bigcap E_3) + P(E_2 \bigcap \bar{E_3}) \\ P(E_2) = P(E_2 | E_3)P(E_3) + P(E_2 | \bar{E_3})P{\bar{E_3}} \\ P(E2)=P(E2⋂E3)+P(E2⋂E3ˉ)P(E2)=P(E2∣E3)P(E3)+P(E2∣E3ˉ)PE3ˉ
且根据算法描述, 当E3E_3E3 发生时,i−1i - 1i−1次递归添加的元素正好 n−m+in-m+in−m+i 的概率是 i/(n−m+i)i/(n-m+i)i/(n−m+i) 。E3ˉ\bar{E_3}E3ˉ 发生时, E2E_2E2 发生的概率即任意一个111 ~ n−m+in-m+in−m+i 的数属于一个由均为 111 ~ n−m+i−1n-m+i-1n−m+i−1 的元素构成的容量为iii的集合的概率,仍然是 i/(n−m+i)i/(n-m+i)i/(n−m+i) 。
P(E2∣E3)=(i−1+1)/(n−m+i)=i(n−m+i)P(E2∣E3ˉ)=in−m+iP(E_2|E_3) = (i - 1 + 1) / (n - m + i) = \frac{i}{(n - m + i)}\\ P(E_2|\bar{E_3}) = \frac{i}{n-m+i} P(E2∣E3)=(i−1+1)/(n−m+i)=(n−m+i)iP(E2∣E3ˉ)=n−m+ii
根据组合数学, 显然有:
P(E3)=Cn−m+i−1i−1/Cn−m+iiP(E3ˉ)=Cn−m+i−1i/Cn−m+iiP(E_3) =C_{n-m+i-1}^{i-1}/C_{n-m+i}^{i} \\ P(\bar{E_3}) = C_{n-m+i-1}^{i}/C_{n-m+i}^{i} P(E3)=Cn−m+i−1i−1/Cn−m+iiP(E3ˉ)=Cn−m+i−1i/Cn−m+ii
但因为 P(E2∣E3)=P(E2∣E3ˉ)P(E_2|E_3) = P(E_2|\bar{E_3})P(E2∣E3)=P(E2∣E3ˉ),所以其实不必算出P(E3)P(E_3)P(E3)的概率即可得P(E2)=i/(n−m+i)P(E_2) = {i}/{(n-m+i)}P(E2)=i/(n−m+i)。
所以
P(E)=P(E1∣E2)P(E2)=1Cn−m+i−1i−1(in−m+i)故P(E)=1Cn−m+iiP(E) = P(E_1|E_2)P(E_2) = \frac{1}{C_{n-m+i-1}^{i-1}}(\frac{i}{n-m+i})\\ 故\\ P(E) = \frac{1}{C_{n-m+i}^{i}} P(E)=P(E1∣E2)P(E2)=Cn−m+i−1i−11(n−m+ii)故P(E)=Cn−m+ii1
当第 i 次递归返回后,假设仍然成立,得证。
总结
循环不变式赛高。
《算法导论》习题5.3-1 ~ 5.3-7相关推荐
- 算法导论习题—主方法求渐进紧确界、递归树方法
算法导论习题-主方法求渐进紧确界.递归树方法 4.5-1 a. T(n)=2T(n/4)+1T ( n ) = 2 T ( n / 4 ) + 1T(n)=2T(n/4)+1 b. T(n)=2T(n ...
- 算法导论习题,思考题题解博主录
算法导论最好结合课后习题来看,以查漏补缺,检验自己对知识的掌握和理解水平 我在看的过程中,参考了以下博主的博客 http://blog.csdn.net/longhuihu?viewmode=cont ...
- 算法导论习题—二叉搜索树、红黑树、区间树
算法基础习题-二叉搜索树.红黑树.区间树 1.二叉搜索树: 2.红黑树: 3.区间树: 1.二叉搜索树: 设 T T T是一棵二叉搜索树,其关键字互不相同;设 x x x是一个叶结点, y y y为其 ...
- 算法导论习题C.2-9答案
题目:你参加一个游戏.该游戏将奖品藏在了三个幕布之后.如果你选对了幕布,则可以赢得奖品.在你选择了一个幕布后,但是幕布还没有揭开之前,支持人会揭开另两个幕布中的一个空幕布(支持人知道哪个幕布后是空的) ...
- 算法导论 习题24.2-4 amp; 24.3-6 单源最短路径问题
24.2-4:给出一个高效算法来统计邮箱无回路图中的全部路径数.分析所给出的算法. 24.3-6:设G=(V,E)为带权有向图,权函数W: E-> {0,1,....,W},其中W为某非负整数. ...
- 算法导论习题解答 16-1 (找零问题)
考虑用最少的硬币找nnn美分零钱的问题.假定每种硬币的面额都是整数. a. 设计贪心算法求解找零问题,假定有25美分.10美分.5美分和1美分4中面额的硬币.证明你的算法能找到最优解. b. 假定硬币 ...
- 算法导论习题(1):摔杯子
选自Algorithm Design第二章第8题 1 题目描述 你正在对各种型号的玻璃罐进行一些压力测试,以确定它们可以跌落且不会破裂的高度. 在特定类型的玻璃罐上,此实验的设置如下:你有一个有 n ...
- 算法导论中英文版下载
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 算法导论 ...
- 算法导论第三版第二章思考题答案
算法导论第三版第二章思考题答案 第二章思考题 算法导论第三版第二章思考题答案 2.1 2.2 2.3 2.4 汇总传送门 2.1 #include<iostream> using name ...
- 算法导论第三版2.3答案
算法导论第三版2.3答案 2.3 算法导论第三版2.3答案 2.3-1 2.3-2 2.3-3 2.3-4 2.3-5 2.3-6 2.3-7 汇总传送门 2.3-1 划分: {3}, {41}, { ...
最新文章
- redis as session_handler
- Tableau系列之构建和浏览数据视图
- cocos2d-lua 搓牌效果_4款热门面霜评测,欧莱雅效果一般,艾珂薇性价比高,菲洛嘉最贵...
- Zara带你快速入门WPF(4)---Command与功能区控件
- 《软件工程》individual project开发小记(一)
- 对不起,我不接私活了
- Emlog精简模板无繁琐操作,适合新手
- django-中间件,视图函数调用前会执行的
- 三年制专转本计算机,三年制专转本和五年制专转本的区别
- HTML5文件上传插件 Huploadify V2.1发布
- python 正则表达式 \b 大坑
- 仿真proteus8.7安装
- 2020年ESA中国区10m地表覆盖数据的镶嵌、裁剪与分省数据分享
- mac下打开.mpp后缀文件的工具OmniPlan
- 《舍不得看完的中国史》读书笔记
- 从小米智能家居入手,揭秘物联网关键技术
- 倾斜摄影测量数据的一些简析
- Unsupervised Person Re-identification: Clustering and Fine-tuning
- C#,数值计算,求解微分方程的吉尔(Gear)四阶方法与源代码
- 2021年计算机应用基础统考题库,2021年7月计算机应用基础统考题库-网络教育统考计算机应用基础真题...