概率算法:概率算法的一个基本特征是,对所求问题的同一实例用同一概率算法求解两次可能得到完全不同的效果。
1. 随机数。
随机数在概率算法设计中扮演着十分重要的角色。在现实计算机上无法产生真正的随机数,因此在概率算法中使用的随机数都是一定程度上随机的,即伪随机数。
线性同余法是产生伪随机数的最常用的方法。由线性同余法产生的随机序列a0,a1,…,an满足
其中b >= 0,c >= 0,d <= m。d称为该随机序列的种子。如何选取该方法中的常数b、c和m直接关系到所产生的随机序列的随机性能。这是随机性理论研究的内容,已超出本书讨论的范围。从直观上看,m应取得充分大,因此可取m为机器大数,另外应取gcd(m, b) = 1,因此可取b为一素数。
应用: 抛硬币,统计频率。
2. 数值概率算法。
应用: 随机投点,计算π值。
随机投点,计算定积分。
平均值法,计算定积分。
解非线性方程组。
常用于数值问题的求解。 往往求的是 近似解 。近似解的精度随计算时间的增加而不断提高。
3.舍伍德算法:
排序算法中,枢轴元素,选用拟中位数 可以保证 最坏情况下用线性时间完成,采用划分数组第一个元素作为划分基准的话,最坏情况下需要要O(n^2) , 平均较好。
舍伍德选择算法则随机地选择一个数组元素作为划分基准,这样既保证算法的线性时间平均性能,又避免了计算拟中位数的麻烦。如果事先把要排序的元素打乱,就不需要舍伍德 了。就是 所谓的 随机洗牌。
舍伍德算法总能求得问题的一个解,且所求得的解总是正确的。当一个算法的最坏复杂度 与平均复杂度 相差较大时,可在 其中 引入 随机性,将其改造成一个 舍伍德算法, 用以消除 好坏实例间的差别。其精髓不是避免算法的最坏情况行为,而是设法消除这种最坏情形行为与特定实例之间的关联性。
应用:线性时间选择算法
跳跃表
4.拉斯维加斯算法。
该算法不会得到不正确的解。但是它可能找不到解。与蒙特卡罗算法类似,找到正确解的概率随着所用的时间增加而提高。
应用 一:n后 问题。注意:之前回溯法是 系统性的搜索棋盘,找一个合适的位置。采用拉斯维加斯算法,可以给每个皇后 随机性的选择一个位置,然后,判断这个皇后可否放在此(剪枝?)此方法,一旦发现一个皇后无法正确放置,就要重新开始。
改进: 选取 m 个皇后 随机放置, 后面的 利用 回溯法 找合适位置。 其中,m越大,后面回溯所需时间越小,失败概率越大。
应用二:整数因子分解
5. 蒙特卡罗算法。
用于求解问题的【准确解】。 用蒙特卡罗算法求得的正确解的概率依赖于算法所用的时间,算法所用的时间越多,得到正确解的概率越高。但无法有效判断该解 是否肯定正确。
应用:主元素问题
素数测试