随机算法.docx

上传人:b****4 文档编号:12101372 上传时间:2023-04-17 格式:DOCX 页数:18 大小:116.99KB
下载 相关 举报
随机算法.docx_第1页
第1页 / 共18页
随机算法.docx_第2页
第2页 / 共18页
随机算法.docx_第3页
第3页 / 共18页
随机算法.docx_第4页
第4页 / 共18页
随机算法.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

随机算法.docx

《随机算法.docx》由会员分享,可在线阅读,更多相关《随机算法.docx(18页珍藏版)》请在冰豆网上搜索。

随机算法.docx

随机算法

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1