随机算法之拉斯维加斯算法及蒙特卡罗算法初步

2019-04-14 12:09发布

一. 特征: 确定性算法的每一个计算步骤都是确定的,而随机算法允许算法在执行过程中随机地选择下一个计算步骤。在很多情况下,当算法在执行过程中面临一个选择时,随机性选择常比最优选择省时。因此随机算法可在很大程度上降低算法度。 拉斯维加斯算法不会得到不正确的解,但是有时找不到解。求得正确解的概率也依赖于算法所用的时间。 蒙特卡罗算法可求问题的精确解,但这个解不一定是正确的,求得正确解的概率也依赖于算法所用的时间。   二.原理 A.拉斯维加斯算法 通常采用bool型方法来表示拉斯维加斯算法。当算法找到一个解时返回true,否则false. 当返回false时,说明未得到解,那么可再次独立调用该算法,在时间允许的情况一直运算到出解为止。   B.蒙特卡罗算法 设P是一个实数,且0.5。如果蒙特卡罗算法对于问题的任一实例得到正确解的概率不小于P,则称该算法是p正确的。对于统一实例,蒙特卡罗算法不会给出两个不同的正确解答,则称该算法是一致的。而对于一个一致的p正确的蒙特卡罗算法,要提高获得正确解的概率,只要执行该算法若干次,并选择出现频率最高的解即可。   三.著名算法 Apollard_rho算法。 最著名的拉斯维加斯算法。可在O(n1/4)时间内找到n的一个素因子。详见算法导论第三十一章。  
  1. Miler_Robin算法 或 基于wilson定理的判素算法。
典型蒙特卡罗算法,前者返回false时,整数一定是一个合数,而返回为true时,该整数高概率意义下为素数。错误概率不超过1/4kk取足够大时,错误概率可忽略不计。   四.具体应用 例1:矩阵乘法验证(PKU monthly contest 2007.8) 题意:给定矩阵A,B,C, 要求在O(n^2)时间内验证A*B == C是否成立。 算法:随机生成x[i],计算A*(B*x) C*x,判断结果是否相等。此算法为偏假1/2正确的蒙特卡罗算法。即当AB=C时,算法返回false的概率至少为1/2。 总结:这道题给我很大教训,思维日益僵化已经使我付出严重代价。   例2:模平方根问题 题意:设p为奇素数,1<= x <=p-1, 如果存在一个整数y1<= y <= p-1, 使得 x ≡ y*y (mod p) 则称yx的模p平方根。试设计一个求模p平方根的拉斯维加斯算法。 分析与解答: 这个问题的解决存在成名算法Tonelli算法,流程如下:
  1. 随机选取g;
  2. p-1 = 2g * tt为奇数。
  3. E= 0;
  4. For(i= 2 to s) if( (x* g-e) (p-1)/2^I != 1) e = e + 2i;
  5. H= x * g-e;
  6. B = ge/2 * h(t+1)/2
  7. Return b;
该算法返回正确解的概率为1/2,所需计算时间为O(log4p);   例3.多项式乘积验证问题。 给定多项式p(x),q(x),r(x);验证p(x) * q(x) ==r(x). 阶分别为p,q,r; 解法: 多项式的阶为 k = max(m*n,l). 随机选取k+1个实数,测试等式是否成立。   五.总结 随机算法在计算机科学中非常重要。但在竞赛中由于环境限制和验证困难,出现频率较小。其中出现概率较大的为随机算法中的成名算法。但在问题要求的时间复杂度或空间复杂度由确定性算法不可能解决的情况下,随机算法不失为一个好的思考方向。大胆猜想,细致证明,灵活运用是这类题目主要考察的地方。