《算法导论》习题 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∏n​n3n3−i+1​=i=1∏n−1​n3n3−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​∣E2​E3​)=1/Cn−m+i−1i−1​P(E1​∣E2​E3​ˉ​)=1/Cn−m+i−1i−1​P(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)i​P(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+ii​P(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−1​1​(n−m+ii​)故P(E)=Cn−m+ii​1​
  当第 i 次递归返回后,假设仍然成立,得证。

总结

  循环不变式赛高。

《算法导论》习题5.3-1 ~ 5.3-7相关推荐

  1. 算法导论习题—主方法求渐进紧确界、递归树方法

    算法导论习题-主方法求渐进紧确界.递归树方法 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 ...

  2. 算法导论习题,思考题题解博主录

    算法导论最好结合课后习题来看,以查漏补缺,检验自己对知识的掌握和理解水平 我在看的过程中,参考了以下博主的博客 http://blog.csdn.net/longhuihu?viewmode=cont ...

  3. 算法导论习题—二叉搜索树、红黑树、区间树

    算法基础习题-二叉搜索树.红黑树.区间树 1.二叉搜索树: 2.红黑树: 3.区间树: 1.二叉搜索树: 设 T T T是一棵二叉搜索树,其关键字互不相同;设 x x x是一个叶结点, y y y为其 ...

  4. 算法导论习题C.2-9答案

    题目:你参加一个游戏.该游戏将奖品藏在了三个幕布之后.如果你选对了幕布,则可以赢得奖品.在你选择了一个幕布后,但是幕布还没有揭开之前,支持人会揭开另两个幕布中的一个空幕布(支持人知道哪个幕布后是空的) ...

  5. 算法导论 习题24.2-4 amp; 24.3-6 单源最短路径问题

    24.2-4:给出一个高效算法来统计邮箱无回路图中的全部路径数.分析所给出的算法. 24.3-6:设G=(V,E)为带权有向图,权函数W: E-> {0,1,....,W},其中W为某非负整数. ...

  6. 算法导论习题解答 16-1 (找零问题)

    考虑用最少的硬币找nnn美分零钱的问题.假定每种硬币的面额都是整数. a. 设计贪心算法求解找零问题,假定有25美分.10美分.5美分和1美分4中面额的硬币.证明你的算法能找到最优解. b. 假定硬币 ...

  7. 算法导论习题(1):摔杯子

    选自Algorithm Design第二章第8题 1 题目描述 你正在对各种型号的玻璃罐进行一些压力测试,以确定它们可以跌落且不会破裂的高度. 在特定类型的玻璃罐上,此实验的设置如下:你有一个有 n ...

  8. 算法导论中英文版下载

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 算法导论 ...

  9. 算法导论第三版第二章思考题答案

    算法导论第三版第二章思考题答案 第二章思考题 算法导论第三版第二章思考题答案 2.1 2.2 2.3 2.4 汇总传送门 2.1 #include<iostream> using name ...

  10. 算法导论第三版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}, { ...

最新文章

  1. redis as session_handler
  2. Tableau系列之构建和浏览数据视图
  3. cocos2d-lua 搓牌效果_4款热门面霜评测,欧莱雅效果一般,艾珂薇性价比高,菲洛嘉最贵...
  4. Zara带你快速入门WPF(4)---Command与功能区控件
  5. 《软件工程》individual project开发小记(一)
  6. 对不起,我不接私活了
  7. Emlog精简模板无繁琐操作,适合新手
  8. django-中间件,视图函数调用前会执行的
  9. 三年制专转本计算机,三年制专转本和五年制专转本的区别
  10. HTML5文件上传插件 Huploadify V2.1发布
  11. python 正则表达式 \b 大坑
  12. 仿真proteus8.7安装
  13. 2020年ESA中国区10m地表覆盖数据的镶嵌、裁剪与分省数据分享
  14. mac下打开.mpp后缀文件的工具OmniPlan
  15. 《舍不得看完的中国史》读书笔记
  16. 从小米智能家居入手,揭秘物联网关键技术
  17. 倾斜摄影测量数据的一些简析
  18. Unsupervised Person Re-identification: Clustering and Fine-tuning
  19. C#,数值计算,求解微分方程的吉尔(Gear)四阶方法与源代码
  20. 2021年计算机应用基础统考题库,2021年7月计算机应用基础统考题库-网络教育统考计算机应用基础真题...

热门文章

  1. Windows 搭建 Nexus3 私服
  2. 弘辽科技:拼多多五步教你日销百单
  3. 工作笔记——微信支付开发相关知识整理
  4. 湖人控卫鲍尔左脚踝三级扭伤 预计缺席4-6周
  5. 操作演示 | 如何将示波器波形直接保存到PC端
  6. python输出图形效果的代码_python打印图形大全(详解)
  7. WRMPS经典Cookie欺骗漏洞批量拿下shell-黑客博客
  8. cds云服务器_云探CDS拨测服务全面上线
  9. 将字符串,数组等任意格式转为json(JSON)数据,Arrays是数组工具类,将任意数组转字符串或数组操作
  10. 树莓派4B之超声波传感器模块(python3)