6随机算法

随机算法

1 主要内容

  • 随机算法的基本思想
  • Las Vegas算法
  • Monte Carlo算法
  • 随机算法实例

2 随机算法基本思想

​ 随机数

  • 随机序列:概率相等(均匀随机),不可预测,不可重现
  • 在目前的计算机中,无法产生真正的随机数,因此在随机算法中使用的随机数都是一定程度上随机的,即伪随机数
  • 产生伪随机数的方法:线性同余法...

​ 确定性算法

  • 输入确定
  • 则对这个特定输入的每次运行过程是可重复的,运行结果是一样的
  • 比如,对于输入<6,4,5,8,9,3>,正确的插入排序算法对这个输入,每次的运行过程是一样的,运行结果也是一样的

​ 随机算法基本思想

  • Randomized Algorithms (随机算法);Probabilistic Algorithms (概率算法)
  • 引入了随机因素
  • 在随机算法中
    • 不要求算法对所有可能的输入均正确计算
    • 只要求出现错误的可能性小到可以忽略的程度
    • 另外也不要求对同一输入,算法每次执行时给出相同的结果

​ 随机算法的特点

  • 有不少问题,目前只有效率很差的确定性求解算法,但用随机算法去求解,可以(很快地)获得相当可信的结果
  • 对于某一给定的问题,随机算法所需的时间与空间复杂性,往往比当前已知的、最好的确定性算法要好
  • 到目前为止设计出来的各种随机算法,无论是从理解上还是实现上,都是极为简单的
  • 随机算法避免了去构造最坏情况的例子

​ 随机算法应用领域

  • 随机算法在分布式计算、通信、信息检索、计算几何、密码学等许多领域都有着广泛的应用
  • 最著名的是在公开密钥体系、RSA算法方面的应用

​ 随机算法的种类

  • Las Vegas算法
  • Monte Carlo算法

3 Las Vegas算法

  • 在少数应用中,可能出现求不出解的情况,但一旦找到一个解,这个解一定是正确的
  • 在求不出解时,需再次调用算法进行计算,直到获得解为止
  • 对于此类算法,主要是分析算法的时间复杂度的期望值,以及调用一次产生失败(求不出解)的概率

4 Monte Carlo算法

  • 通常不能保证计算出来的结果总是正确的,一般只能断定所给解的正确性不小于p(1/2<p<1)
  • 通过算法的反复执行(即以增大算法的执行时间为代价),能够使发生错误的概率小到可以忽略的程度
  • 由于每次执行的算法是独立的,故k次执行均发生错误的概率为(1-p)k
  • 对于判定问题(回答只能是“Yes”或“No”)
    • 带双错的(two-sided error): 回答”Yes”或”No”都有可能错
    • 带单错的(one-sided error):只有一种回答可能错
  • Las Vegas算法可以看成是单错概率为0的Monte Carlo算法

5 两类随机算法的应用场景

  • 在不允许发生错误的应用中(e.g. 人造飞船、电网控制等),Monte Carlo算法不可以使用
  • 若小概率的出错允许的话,Monte Carlo算法比Las Vegas算法要节省许多时间,是人们常常采用的方法

6 找第k小元素的随机算法(Las Vegas算法)

  • 在n个数中随机的找一个数A[i]=x, 然后将其余n-1个数与x比较,分别放入三个数组中:S1(元素均<x), S2(元素均=x), S3(元素均>x)
    • 若|S1|≥k ,则调用Select(k,S1)
    • 若(|S1|+|S2|) =k,则第k小元素就是x
    • 否则就有(|S1|+|S2|)<k,此时调用Select(k-|S1|-|S2|,S3)
  • 定理:若以等概率方法在n个数中随机取数,则该算法用到的比较数的期望值不超过4n
  • 说明:如果假定n个数互不相同,如果有相同的数的话,落在S2中的可能性会更大,比较数的期望值会更小一些

7 Sherwood随机化方法 (Las Vegas算法)

  • Sherwood算法总能求得问题的一个解,且所求得的解是正确的
  • 当一个确定性算法在最坏情况和平均情况下的时间复杂度有较大差别时,可在确定性算法中引入随机性将其改造为Sherwood算法,以消除或减少问题的好坏输入实例间的差别
  • 最典型的例子就是快速排序的随机版本

8 Testing String Equality(Monte Carlo算法)

  • 首先由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) (mod p)作为x的指纹,这里的p是一个小于M的素数,M可根据具体需要调整

9 Pattern Matching(Monte Carlo算法)

​ 问题

  • 给定两个字符串:X=x1,…,xn,Y=y1,…,ym,看Y是否为X的子串?(即Y是否为X中的一段)

​ 思路1

  • 可用KMP算法在O(m+n)时间内获得结果,但算法较为繁琐

​ 随机算法思路2

  • 考虑随机算法(用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))计算出来,故算法可以很快完成

​ 时间复杂度分析

  • 计算Ip(Y)、Ip(X(1))及2^m mod p的时间不超过O(m)次运算
  • Ip(X(j+1))的计算,只需用O(1)时间
  • 由于循环最多执行n-m+1次,故这部分的时间复杂度为O(n),于是,总的时间复杂性为O(m+n)
  • 当Y≠X(j),但Ip(Y)=Ip(X(j))时产生失败,失败的概率Pr[failure]<1/n,即失败的概率只与X的长度有关,与Y的长度无关

​ 本算法可以转成Las Vegas算法

  • 当Ip(Y)=Ip(X(j))时,不直接return j,而去比较Y和X(j)
  • 即在return j之前加一个判断看Y和X(j)是否相等,相等则return j ,否则继续执行循环
  • 如果有子串X(j)与Y相匹配,该算法总能给出正确的位置(即算法出错的概率为0)

10 Random Sampling

​ 问题

  • 设给定n个元素(为简单起见,设为1,2,…n),要求从n个数中随机地选取m个数(m≤n)

​ 求解问题的Las Vegas算法

  • 可以用一个长为n的布尔数组B来标识i是否被选中
  • 初始时均表为“未选中”
  • 然后随机产生〔1,n〕之间的一个整数i,若B[i]为“未选中”,则将i加入被选中队列,同时把B[i]标识为“已选中”
  • 反复执行直到m个不同的数全部被选出为止

​ 存在问题1

  • 当n和m很接近时,产生最后几个随机数的时间可能很长(有95%以上的可能性是已选中的数)
  • 改进方法:当m>n/2时,先去生成(n-m)(<n/2)个随机数,然后再取剩下的m个数作为选出的数

​ 存在问题2

  • 当n与m相比大很多时(例:n﹥m2),布尔数组B对空间浪费很多
  • 改进方法:用一个允许冲突的、长为m的散列表,来存放产生的随机数;产生一个数后,看其是否在散列表中:若不在则将其加入,若已在则抛弃该数,再去产生下一个数

11 主元素问题

​ 问题

  • 设T[1:n]是一个含有n个元素的数组。当|{i|T[i]=x}|>n/2时,称元素x是数组T的主元素
  • 对于给定的数组T,判定T数组中是否含有主元素

12 素数测试问题

​ 问题

  • 判断一个数是否为素数

​ 费尔马小定理

  • 若n为素数,且0<a<n,有a ^(n-1)≡1(mod n)
  • 即Fermat条件a ^(n-1)≡1(mod n)是素数的必要条件 ;反过来说,若a^(n-1)≠1(mod n)则n必为合数
  • 逆定理不成立,但反例不多,特别是当n很大且又是随机选取的时候

​ 方法

  • 直接用Fermat条件2 ^(n-1)≡1(mod n)来判断n是否为素数
  • 此时,若算法的回答是“合数”,则100%正确
  • 若算法的回答是“素数”,则出错概率很小(带单错)
  • 当n不太大时,满足条件2 ^ (n-1)≡1(mod n)的合数n不多

​ 进一步

  • 能否对其它的a去测试是否有a ^(n-1)≡1(mod n)(a=3,4,…),从而再排除一些满足条件2n-1≡1(mod n)的合数?
  • 回答是:可以排除掉一些,但不能完全排除,满足Fermat条件的数未必全是素数
  • 有些合数也满足Fermat条件,这些合数被称为Carmichael数

​ 再进一步之二次探测定理

  • 二次探测定理:如果p是一个素数,且0<x<p,则方程x^2≡ 1(mod p)的解为x=1,p-1
  • 利用二次探测定理,可以在基于Fermat条件判断时,增加二次探测,一旦违背二次探测条件,则可得出不是素数的结论

13 n后问题

​ 问题

  • 在n×n格的棋盘上放置彼此不受攻击的n个皇后(在同一行,同一列,同一对角线都不能有其他皇后)

Las Vegas算法

  • 在棋盘上相继的各行中随机地放置皇后,并注意使新放置的皇后与已放置的皇后互不攻击,直至n个皇后均已相容地放置好,或已没有下一个皇后的可放置位置时为止
  • 如果将上述随机放置策略与回溯法相结合,可能会获得更好的效果
    • 可以先在棋盘的若干行中随机地放置皇后
    • 然后在后继行中用回溯法继续放置,直至找到一个解或宣告失败
    • 随机放置的皇后越多,后继回溯搜索所需的时间就越少,但失败的概率也就越大
  • n后问题的Las Vegas算法思路:各行随机放置皇后,使新放的与已有的互不攻击,until(n皇后放好||无可供下一皇后放置的位置)

​ 针对上述方式的8皇后问题

  • 随机放两个皇后,再回溯比完全用回溯快大约两倍
  • 随机放3个皇后,再回溯比完全用回溯快大约一倍
  • 随机放所有皇后,比完全用回溯慢大约一倍

14 思考题:在平面中有一堆点,找一个最小的圆,可以将所有点都包括在里面

posted @ 2021-11-29 20:39  fao99  阅读(274)  评论(0)    收藏  举报