概率算法
第一节 概率算法的分类
数值概率算法
Monte Carlo(蒙特卡罗)
- 求解准确解(但是此解不一定是正确解)
- 解是正确解的概率依赖算法所用时间,时间越长,概率越高
Las Vegas(拉斯维加斯)
- 求解准确解(只要求出解,此解就一定是正确解,但是可能求不出解)
- 求出解的概率依赖算法时间,时间越长,概率越大
Sherwood(舍伍德)
- 求解准确解(此解定是正确解)
- 此法不是避免算法的最坏情况,而是减少最坏情况和好情况的差距。适用于算法最坏情况和平均情况差距过大时。
第二节 随机数
- 在计算机中无法产生真正的随机数,所以概率算法中使用的随机数在一定程度上是随机的,称为伪随机数。
- 线性同余法是产生伪随机数最常用的办法。
第三节 数值概率算法
随机投点法求解Π的值
- 圆的半径为r,外切正方形变长即为2r。则投点在圆上的概率为 Πr2/4r2 = Π/4。设向正方形投点次数为n,投入圆形内次数为k,则k/n = Π/4,可推 Π ≈ 4k/n。投点次数越多,Π的精确度越高。
随机投点法求解定积分
Monte Carlo(蒙特卡罗)
- 设p是一个实数,1/2 < p < 1,如果MC算法对于问题的任一实例得到正确解的概率>=p,则称该MC算法是p正确的,p-1/2为该算法的优势。
- 如果对于同一实例,MC算法给出2个相同的正确解,则称此时的MC算法是一致的。
- 代表问题:主元素问题,素数测试
Las Vegas(拉斯维加斯)
- 求出的解必是正确解,但可能无解。
- 一般用boolean型方法表示Las Vegas算法,lv算法找到解后返回true,否则false。x是输入参数,y是返回的解,success = true时,返回y,success = false时,表明没有找到解,对同一实例再次独立调用相同算法直到求出解。
public static void obstinate(Object x, Object y){
boolean success = false;
while(!success) success = lv(x,y);
}
Sherwood(舍伍德)
- 核心思想是减少最坏和平均(准确说是特定实例)算法复杂度的差距。
- 如随机化的快排;线性时间选择算法;跳跃表。