CLRS 5.3随机算法
5.3-1
改变循环的下标,把第一次循环结果作为初始条件。
RANDOMIZE-IN-PLACE(A)n = A.lengthswap A[1] with A[Random(1, n)]for i = 2 to nswap A[i] with A[Random(i, n)]
初始条件变为序列 A[1…1]A[1\dots1] 以 (n−1)!n!=1n\frac{(n-1)!}{n!}=\frac1n 的概率出现,其他和原算法保持不变。
5.3-2
没有,很显然它不能产生和最开始一样的排列,比如一个 [1,2,3][1,2,3] 的排列使用这个算法之后不可能得到 [1,2,3][1,2,3]。
5.3-3
不能,因为这个算法产生的排列数为 nnn^n 种,而 nn 个元素最多产生 n!n! 种排列,所以此算法产生了一些重复的排列,当 nnn^n 不能被 n!n! 整除时,说明有的排列数多,有的则少,则产生的排列不均匀。
5.3-4
当 j≡offset+i(modn)j \equiv \text{offset} + i \pmod{n} 时,A[i]A[i] 复制到 B[j]B[j] 。概率就是1/n1/n。
这个算法类似于一个很简单凯撒密码,就是从某一个位置开始循环。
5.3-5
从 n3n^3 个数中取 nn 个元素的全排列为:Ann3=n3!(n3−n)!A_{n^3}^n = \frac {n^3!}{(n^3-n)!},总共有(n3)n(n^3)^n 种,所以全部不同的概率:
\begin{align} P(U) &= \frac {A_{n^3}^n}{(n^3)^n} = \frac {n^3!}{(n^3-n)!(n^3)^n}\\&= \frac {n^3(n^3-1)\dots(n^3-n+1)(n^3-n)!}{(n^3-n)!(n^3)^n}\\& \ge \frac {(n^3-n)(n^3-n)\dots(n^3-n)}{(n^3)^n}\\& = ( \frac {n^3-n}{n^3} )^n = (1-\frac 1{n^2})^n \ge 1-\frac 1n \end{align}
最后一个推导运用 (1−x)n≥1−nx(1-x)^n \ge 1 - nx。
5.3-6
重新产生新的优先级,直到优先级不重复为止;
5.3-7
由于每次调用都会将 mm 减 11,很显然会调用且只调用 RANDOM
mm 次。
然后我们证明 1...n1...n 中的每个元素出现在 SS 中的概率是 mn\frac{m}{n}。采用数学归纳法证明,归纳假设就是RANDOM-SAMPLE
返回含有 mm 个元素的集合 SS,集合中每个元素出现的概率是 mn\frac{m}{n}。
当 m=1m=1时,就从 {1...n}\{1...n\} 中返回一个数,当 m=0m=0 时返回空集,集合中包含的每个元素的概率是 00;
假设调用RANDOM-SAMPLE(m-1,n-1)
时返回 m−1m-1 个元素的集合 S′S',其中 m−1m-1 个元素来自 {1...n−1}\{1...n-1\},概率是 m−1n−1\frac{m-1}{n-1}。在代码第四行 i=RANDOM(1,n)
之后,ii 从{1...n}\{1...n\} 中返回一个数,然后分别考虑集合 SS 中包含 nn 和不包含 nn 的情况。
令 RjR_j 表示调用 RANDOM
返回元素 jj,概率为 Pr{Rj}=1/nP_r\{R_j\}=1/n。显然要 j∈Sj\in S 来自两种情况,j∈S′j\in S' 或者 j∉S′j\not \in S' 并且 RjR_j,则
P_r\{j\in S\}=P_r\{j\in S'\}+P_r\{j\not \in S' \ and\ R_j\}=\frac{m-1}{n-1}+(1-\frac{m-1}{n-1})*\frac1n=\frac mn
同理 n∈Sn\in S 来自两种情况, RnR_n 或者 RjR_j 并且 j∈S′(j<n)j\in S'(j,则
P_r\{n\in S\}=P_r\{R_n\}+P_r\{R_j \ and\ j\in S'\}=\frac 1n+\frac{n-1}{n}*\frac{m-1}{n-1}=\frac mn
注:CLRS 5.4节答案略
CLRS 5.3随机算法相关推荐
- [PKUWC2018]随机算法
题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...
- Dubbo中基于权重的随机算法
转载自dubbo源码解析-LoadBalance dubbo的源码地址:https://github.com/alibaba/dubbo Dubbo中的RandomLoadBalance采用基于权重的 ...
- labuladong的算法小抄pdf_随机算法:水塘抽样算法
读完本文,你可以去力扣拿下如下题目: 382.链表随机节点 398.随机数索引 -----------我最近在 LeetCode 上做到两道非常有意思的题目,382 和 398 题,关于水塘抽样算法( ...
- 算法导论之概率分析和随机算法
在问题的分析中应用概率技术称为概率分析,前期是对所有可能的输入集合可以做假定.如果无法对输入分布做合理性建模,如果一个算法的行为不只是由输入决定,同时也由随机数生成器所产生的数值决定,则为随机算法.行 ...
- java 权重_java实现权重随机算法
权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100: 简单实现代码如下: im ...
- 使用轮转算法求时间片_彩票调度算法,让进程们拼手气? --当操作系统遇上随机算法...
这篇文章主要想介绍下彩票调度(个人觉得这个算法非常有意思~ ),还有随机算法相对传统算法的一点优势,毕竟现在绝大多数算法都是追求确定性,尤其在操作系统,大家都希望一切可控,所以随机算法的出现听起来有些 ...
- 浅浅地谈一下随机算法【poj2454】【poj3318】
随机算法我也只是稍微接触了一下,就是想写篇博客自己稍微总结一下 其实随机算法也算是一个玄学吧,运气不好还是会wa.但是我们知道,计算机可以在短时间内计算大量的数据,所以碰到正确答案的概率还是挺大的. ...
- 权重随机算法的java实现
一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...
- js打乱数组的顺序_如何用 js 实现一个类似微信红包的随机算法
如何用 js 实现一个类似微信红包的随机算法 js, 微信红包, 随机算法 "use strict"; /** * * @author xgqfrms * @license MIT ...
最新文章
- 编程微刊第五期文章汇总(2018.5)
- 【Python】35个经典案例:吃透Python中的if条件语句~
- 后端技术:MyBatis 批量插入的 3 种写法
- Mybatis-Generator(MBG)教程与Idea的MBG插件
- C语言文件读写操作之换行符处理
- 为开发者准备的9个实用PHP代码片段(转)
- Drupal 6 将于 2016 年 2 月 14 日终结生命周期
- ASR开发工作笔记0001---Eclipse DS-5-报错Cannot checkout an uncounted license withini a Windows Terminal Servi
- LTE学习:LTE系统中RB、RBG、CCE、REG分别是如何定义的
- android view绘制速度,关于android ui的优化 view 的绘制速度
- csh sum算总和_如何在R中使用sum()–在R中查找元素的总和
- Git 查看本地分支关联的远程分支 git branch -vv
- 【语音分析】基于matlab线性预测系数对比【含Matlab源码 557期】
- 开源控件My97DatePicker的基本用法
- 一个计算机游戏机,我想入手一台游戏主机,ps、xbox、任天堂相比,哪个好?
- tar解压tgz文件出现gzip: stdin: not in gzip format报错问题
- 干细胞培养的进展和挑战
- 美观实用!吹爆这个中文排版开源项目
- 使用Hexo平台搭建个人博客
- 3个多月的实习体会与总结