随机算法.docx
- 文档编号:12101372
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:18
- 大小:116.99KB
随机算法.docx
《随机算法.docx》由会员分享,可在线阅读,更多相关《随机算法.docx(18页珍藏版)》请在冰豆网上搜索。
随机算法
RandomizedAlgorithms(随机算法)
ProbabilisticAlgorithms(概率算法)
起源可以追溯到20世纪40年代中叶。
当时MonteCarlo在进行数值计算时,
提出通过统计模拟或抽样得到问题的近似解,
而且出现错误的概率随着实验次数的增多而显著地减少,
即可以用时间来换取求解正确性的提高。
但MonteCarlo方法很长时间没有引入到非数值算法中来。
74年,MichaelRabin(76年Turing奖获得者,哈佛教授,以色列人)
在瑞典讲演时指出:
有些问题,如果不用随机化的方法,
而用确定性的算法,在可以忍受的时间内得不到所需要的结果。
e.g.Presburge算术系统(其中只有加法)中的计算程序,
即使只有100个符号,用每秒1万亿次运算的机器1万亿台、
进行并行计算也需做1万亿年。
但如果使用随机性的概念,
可以很快得出结果,而出错率则微乎其微。
74年Rabin关于随机化算法的思想还不太成熟,到76年,
Rabin设计了一个判定素数的随机算法,该算法至今仍是一个典范。
随机算法在分布式计算、通信、信息检索、计算几何、密码学
等许多领域都有着广泛的应用。
最著名的是在公开密钥体系、RSA算法方面的应用。
用随机化方法解决问题之例:
设有一函数表达式f(x1,x2,…xn),
要判断f在某一区域D中是否恒为0。
如果f不能用数学方法进行形式上的化简
(这在工程中是经常出现的),如何判断就很麻烦。
如果我们随机地产生一个n维的坐标(r1,r2,…rn)D,
代入f得f(r1,r2,…rn)≠0,则可断定在区域D内f≢0。
如果f(r1,r2,…rn)=0,则有两种可能:
1.在区域D内f≡0;2.在区域D内f≢0,得到上述结果只是巧合。
如果我们对很多个随机产生的坐标进行测试,结果次次均为0,
我们就可以断言f≢0的概率是非常之小的。
如上例所示,在随机算法中,
我们不要求算法对所有可能的输入均正确计算,
只要求出现错误的可能性小到可以忽略的程度;
另外我们也不要求对同一输入算法每次执行时给出相同的结果。
我们所关心的是算法在执行时,是否能够产生真正随机的结果。
有不少问题,目前只有效率很差的确定性求解算法,
但用随机算法去求解,可以(很快地)获得相当可信的结果。
随机算法通常分为两大类:
LasVegas算法、MonteCarlo算法。
LasVegas算法总是给出正确的结果,
但在少数应用中,可能出现求不出解的情况。
此时需再次调用算法进行计算,直到获得解为止。
对于此类算法,主要是分析算法的时间复杂度的期望值,
以及调用一次产生失败(求不出解)的概率。
MontCarlo算法通常不能保证计算出来的结果总是正确的,
一般只能断定所给解的正确性不小于p(
<p<1)。
通过算法的反复执行(即以增大算法的执行时间为代价),
能够使发生错误的概率小到可以忽略的程度。
由于每次执行的算法是独立的,
故k次执行均发生错误的概率为(1-p)k。
对于判定问题(回答只能是“Yes”或“No”),
MonteCarlo法又分为两类:
1.带双错的(two-sidederror):
回答”Yes”或”No”都有可能错。
2.带单错的(one-sidederror):
只有一种回答可能错。
LasVegas算法可以看成是单错概率为0的MonteCarlo算法。
到底哪一种随机算法好?
――依赖于应用。
在不允许发生错误的应用中(e.g.人造飞船、电网控制等),
MonteCarlo算法不可以使用;
若小概率的出错允许的话,MonteCarlo算法比LasVegas算法
要节省许多时间,是人们常常采用的方法。
随机算法的优点:
1.对于某一给定的问题,随机算法所需的时间与空间复杂性,
往往比当前已知的、最好的确定性算法要好。
2.到目前为止设计出来的各种随机算法,
无论是从理解上还是实现上,都是极为简单的。
3.随机算法避免了去构造最坏情况的例子。
最坏情况虽有可能发生,但是它不依赖于某种固定的模式,
只是由于“运气不好”才出现此种情况。
RandomSampling问题(LasVegas算法)
设给定n个元素(为简单起见,设为1,2,…n),
要求从n个数中随机地选取m个数(m≤n)。
可以用一个长为n的布尔数组B来标识i是否被选中,
初始时均表为“未选中”。
然后随机产生〔1,n〕之间的一个整数i,若B[i]为“未选中”,则将i加入被选中队列,
同时把B[i]标识为“已选中”,
反复执行直到m个不同的数全部被选出为止。
该算法有两个问题:
1.当n和m很接近时(例n=1000,m=990),
产生最后几个随机数的时间可能很长
(有95%以上的可能性是已选中的数)。
改进:
当m﹥
时,先去产生n-m(<
)个随机数,
然后再取剩下的m个数作为选出的数。
2.当n与m相比大很多时(例:
n﹥m2),
布尔数组B对空间浪费很多。
改进:
用一个允许冲突的、长为m的散列表,
来存放产生的随机数。
产生一个数后,看其是否在散列表中:
若不在则将其加入,若已在则抛弃该数,再去产生下一个数。
作业:
设n﹥m2,用散列表以外的数据结构来代替布尔数组B。
上述随机算法的分析:
设随机变量X表示扔硬币时,第一次碰到“正面朝上”的情况时,
已经试过的次数。
X=k意味着前k-1次均向下,第k次向上。
概率表示为(p为正面朝上概率,q=1-p为背面朝上概率):
Pr[X=k]=
(前k-1次均向下,第k次向上)(几何分布)
按求离散期望值的方法E(X)=
=
(连续情况积分)
令s=
s-sq=
=
s=
=
故E(X)=p*s=
。
(另:
考虑离散与连续情况之间的关系)
设pj是这样的概率:
在j-1个数已经选出的前提下,当前随机
产生的数是以前尚未选过的数的概率,则pj=
=
。
于是qj=1-pj=
,即为:
当前随机产生的数是以前选过的j-1个数之一的概率。
设随机变量Xj(1≤j≤m)表示:
在j-1个数已经选出后,
再去找出第j个不同的数时,所需要产生的整数个数。
则与前述的X类似,Xj服从几何分布:
Pr[Xj=k]=pjqjk-1(k≥1,qj=1-pj),于是E(Xj)=
=
。
设Y表示从n个数中选出m个数时(m≤
),
所需产生的整数个数的总和的随机变量,
则有Y=X1+X2+X3+…+Xm。
由于随机变量的线性可加性有E(Y)=
E(X1)+E(X2)+…+E(Xm)=
=n(
-
)
=n((
)-(
))
在数学基础部分曾证明用积分法可得
≤
≤
+1
故有A≤㏑n+1,及B≥㏑(n-m+1),
于是E(Y)≤n(㏑n+1-㏑(n-m+1))
≤n(㏑n+1-㏑(n-m))
≤n(㏑n+1-㏑(
))(∵m≤
)
=n(㏑n+1-㏑n+㏑2)=n㏑2e≈1.69n
由于算法的时间复杂度T(n)正比于算法产生整数的个数总和Y,
所以,T(n)的期望值与E(Y)成常数比,即有T(n)=(n)(期望值)。
找第k小元素的随机算法(LasVegas算法):
在n个数中随机的找一个数A[i]=x,
然后将其余n-1个数与x比较,分别放入三个数组中:
S1(元素均 若|S1|≥k则调用Select(k,S1); 若(|S1|+|S2|)≥k,则第k小元素就是x; 否则就有(|S1|+|S2|)<k,此时调用Select(k-|S1|-|S2|,S3)。 定理: 若以等概率方法在n个数中随机取数, 则该算法用到的比较数的期望值不超过4n。 (假定n个数互不相同,如果有相同的数的话, 落在S2中的可能性会更大,比较数的期望值会更小一些。 ) 证: 设C(n)是输入规模为n时,算法中所用到的比较次数的期望值。 并设取到任一个数的概率相同。 假定用上述算法取到的数x是第j小的数(j=1,2,…,n)。 若j>k,则需要调用Select(k,S1)。 ∵|S1|=j-1(因为取到的x是第j小的数), ∴调用Select(k,S1)的比较次数的期望值为C(j-1)。 若j<k,则需要调用Select(k-j,S3)(j=|S1|+|S2|)。 ∵|S3|=n-j,∴本次调用的比较次数的期望值是C(n-j)。 若j=k,则直接返回第j个元素,无需继续进行比较。 由于取j为1,2,…,n的概率相同,故有 C(n)=n+ (其中的n是: 获得S1,S2,S3所需比较次数) =n+ =n+ 由于C(i)是非减函数(在i<j时,总有C(i)≤C(j)) ∴( )在k=n/2时取得最大值。 (证明留作作业) 归纳法基础: n’=1时无需比较,显然有C(n’)≤4n’。 归纳法假设: 设n’<n时,有C(n’)≤4n’。 由于C(n)是在k=n/2时取得最大值,于是有 C(n)≤n+ (注意式中的 均应为n/2,下同) ≤n+ (由归纳法假设,n’<n时,有C(n’)≤4n’) ≤n+ (n为奇数时n-n/2+1=n/2,故此时两和式相等) =n+ =n+ (n*(n-1)/2-n/2*(n/2-1)/2) ≤n+ (本式中的 不向上取整)=4n-2 由于每个元素至少被比较一次,所以C(n)≥n, ∴随机化Select算法的比较次数期望值有: n≤C(n)<4n。 Sherwood随机化方法(属LasVegas算法) 如果某个问题已经有了一个平均性质较好的确定性算法, 但是该算法在最坏情况下效率不高,此时引入一个随机数发生器 (通常是服从均匀分布,根据问题需要也可以产生其他的分布),将一个确定性算法改成一个随机算法,使得对于任何输入实例, 该算法在概率意义下都有很好的性能(e.g.Select,Quicksort等)。 如果算法(所给的确定性算法)无法直接使用Sherwood方法, 则可以采用随机预处理的方法,使得输入对象服从均匀分布 (或其他分布),然后再用确定性算法对其进行处理。 所得效果在概率意义下与Sherwood型算法相同。 TestingStringEquality(MonteCarlo算法) 设A处有一个长字符串x(e.g.长度为106), B处也有一个长字符串y,A将x发给B,由B判断是否有x=y。 算法: 首先由A发一个x的长度给B,若长度不等,则x≠y。 若长度相等,则采用“取指纹”的方法: A对x进行处理,取出x的“指纹”,然后将x的“指纹”发给B, 由B检查x的“指纹”是否等于y的“指纹”。 若取k次“指纹”(每次取法不同),每次两者结果均相同, 则认为x与y是相等的。 随着k的增大,误判率可趋于0。 常用的指纹: 令I(x)是x的编码,取Ip(x)I(x)(modp)作为x的指纹。 这里的p是一个小于M的素数,M可根据具体需要调整, 本例中取M=2n2。 由于0≤Ip(x)<p, ∴Ip(x)的二进制传输长度不超过log2p位。 设n是I(x)的二进制表示的长度,则有I(x)<2n。 由于p<M=2n2,故有log2p≤log(2n2)+1=O(log2n)。 ∴传输的长度可以大大的缩短。 例: 设I(x)是106位二进制的数,即n=106,则M=2×1012≈240.8631 ∴Ip(x)的位数不超过41位,传输一次可节省约2.5万倍。 根据下面所做的分析,可知错判率小于 。 如果取5种不同的p(即k=5)求出“指纹”再传输、检查5次, 则传输量可节省5,000倍。 此时错判率小于 。 错判率分析: B接到指纹Ip(x)后与Ip(y)比较,如果Ip(x)≠Ip(y),当然有x≠y。 如果Ip(x)=Ip(y)而xy,则称此种情况为一个误匹配。 问题是: 误匹配的概率有多大? 若我们总是随机地去取一个小于M的素数p,则对于给定的x和y, Pr[failure]=(使得Ip(x)=Ip(y)但xy的素数p(p<M)的个数)/ (小于M的素数的总个数)。 数论定理1: 设(n)是小于n的素数个数,则(n)≈ , 误差率不超过6%。 例: n=5001000104105106107108109 (n)=951681229959278498664579576144550847478 ∵M=2n2,Pr[failure]的分母 (M)≈ = = ≈ = Pr[failure]的分子≤使得Ip(x)=Ip(y)的素数p(p<M)的个数 =能够整除︱I(x)-I(y)︱的素数p(p<M)的个数 (∵a≡b(modp)iffp整除︱a-b︱) 数论定理2: 如果a<2n,则能够整除a的素数个数不超过(n)个。 (只要n不是太小) ∵︱I(x)-I(y)︱<max{I(x),I(y)}≤2n-1, ∴能够整除︱I(x)-I(y)︱的素数个数不超过(n)。 而满足p<M的素数则更少,∵当n≥7时,有2n2<2n。 ∴Pr[failure]≤(n)/(M)≈ = 。 即误匹配的概率小于 。 ∴当n很大时,误匹配的概率很小。 设xy,如果取k个不同的小于2n2的素数来求Ip(x)和Ip(y), 由于事件的独立性,因此事件均发生的概率满足乘法规则, 即k次试验均有Ip(x)=Ip(y)但xy(误匹配)的概率小于 。 ∴当n较大、且重复了k次试验时,误匹配的概率趋于0。 PatternMatching(MonteCarlo算法) 给定两个字符串: X=x1,…,xn,Y=y1,…,ym,看Y是否为X的子串? (即Y是否为X中的一段。 ) 该问题可用KMP算法在O(m+n)时间里获得正确结果, 但算法比较繁琐,函数计算比较复杂。 (此问题还可用Rabin-Karp算法、Boyer-Moore算法等) 考虑随机算法(用brute-force思想) 记X(j)=xjxj+1…xj+m-1(从X的第j位开始、长度与Y一样的子串), 从起始位置j=1开始到j=n-m+1,我们不去逐一比较X(j)与Y, 而仅逐一比较X(j)的指纹Ip(X(j))与Y的指纹Ip(Y)。 由于Ip(X(j+1))可以很方便地根据Ip(X(j))计算出来, 故算法可以很快完成。 不失一般性,设xi(1≤i≤n)和yj(1≤j≤m)∈{0,1},即X,Y都是0-1串。 Ip(X(j+1))=(xj+1…xj+m)(modp) =(2(xj+1…xj+m-1)+xj+m)(modp) =(2(xj+1…xj+m-1)+2mxj-2mxj+xj+m)(modp) =(2(xjxj+1…xj+m-1)-2mxj+xj+m)(modp) (∵(xy+z)(modp)=(x(ymodp)+z)(modp)) =(2((xjxj+1…xj+m-1)modp)-2mxj+xj+m)(modp) =(2*Ip(X(j))- xj+xj+m)(modp)(﹡) ∴Ip(X(j+1))可以利用Ip(X(j))及(﹡)式计算出来。 算法 1、随机取一个小于M的素数p,置j←1; 2、计算Ip(Y)、Ip(X (1))及Wp(=2mmodp); 3、Whilej≤n-m+1do {ifIp(X(j))=Ip(Y)thenreturnj/﹡X(j)极有可能等于Y﹡/ else{使用(﹡)式计算出Ip(X(j+1));j增1} } 4、return0;/﹡X肯定没有子串等于Y﹡/ 时间复杂度: Y、X (1)、2m均只有m位(二进制数), 故计算Ip(Y)、Ip(X (1))及2mmodp的时间不超过O(m)次运算。 Ip(X(j+1))的计算: 由于2*Ip(X(j))只需要在Ip(X(j))后加个0; 当xj为1时,第二部分Wp*xj就是Wp,当xj为0时该部分为0; xj+m或为0或为1,然后进行加减法(O (1)时间)就可得到 2*Ip(X(j))- xj+xj+m。 但此式还要对p取模。 由于0≤2*Ip(X(j))≤2p-2,0≤ xj≤p-1,0≤xj+m≤1, 因此2*Ip(X(j))- xj+xj+m的值在[-(p-1),2p-1]之间。 故实际计算时,若上式是负值,则加上p后即得Ip(X(j+1)); 若为非负,则看其是否小于p,小于p则已得Ip(X(j+1)); 若大于等于p,则减去p后即得Ip(X(j+1))。 故Ip(X(j+1))的计算只需用O (1)时间。 由于循环最多执行n-m+1次,故这部分的时间复杂度为O(n)。 于是,总的时间复杂性为O(m+n)。 失败的概率: 当Y≠X(j),但Ip(Y)=Ip(X(j))时产生失败。 Ip(Y)=Ip(X(j))当且仅当p能整除|Y-X(j)|。 当p能整除|Y-X(j)|时,p当然也能整除 |Y-X (1)||Y-X (2)|…|Y-X(j)|…|Y-X(n-m+1)|(∵p素数,反之也成立), 由于|Y-X(j)|不超过m个二进制位,∴|Y-X(j)|<2m。 ∴|Y-X (1)||Y-X (2)|…|Y-X(n-m+1)|<(2m)n-m+1≤2mn。 由数论定理2(如果a<2n,则能够整除a的素数个数不超过(n)个), 能整除|Y-X (1)||Y-X (2)|…|Y-X(n-m+1)|的素数个数不超过(mn)个。 于是 Pr[failure]=(Y不含在X中、但p(p<M)能够整除|Y-X (1)||Y-X (2)|…|Y-X(j)|…|Y-X(n-m+1)|的素数的个数)/小于M的素数的个数 ≤(mn)/(M)=(mn)/(2mn2)(取M=2mn2) ≈(mn/loge(mn))/(2mn2/loge(2mn2))=loge(2mn2)/2nloge(mn) (m≥2时有)≤loge((mn)2)/2nloge(mn)=1/n 即失败的概率只与X的长度有关,与Y的长度无关。 当m=n时,问题退化为判定两个字符串是否相等的问题。 本算法可以转成LasVegas算法: 当Ip(Y)=Ip(X(j))时,不直接returnj,而去比较Y和X(j), 即在returnj之前加一个判断看Y和X(j)是否相等, 相等则returnj,否则继续执行循环。 这样, 如果有子串X(j)与Y相匹配,该算法总能给出正确的位置 (即算法出错的概率为0)。 ∵在最坏情况下算法执行O(mn)时间, 而p能整除|I(Y)-I(X(j))|概率的不超过 ,故 算法的时间复杂性的期望值不超过 。 作业: 分别用KMP、MonteCarlo和LasVegas算法编制3个程序, 随机生成不小于5000对的、长度不等的01串X和Y(三个程序生成相同的串),然后统计算法的执行时间、MonteCarlo算法出错的比率,并根据运行结果对三种算法进行深入的比较。 注意, 先利用本题下方所给素数实现上述算法,学完素数判定算法之后, 将该算法编程,产生少量的大素数并用数组保存起来, 以供上述随机算法使用(素数判定算法写在上述随机算法之外)。 素数(每种情况给7个数) (250以内)211223227229233239241 (500以内)461463467479487491499 (1000以内)953967971977983991997 (5000以内)4957496749694973498749934999 (10000以内)9923992999319941994999679973 (100000以上)100003100019100043100049100057100069100103
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 随机 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)