概率算法:概率算法的一個基本特征是,對所求問題的同一實例用同一概率算法求解兩次可能得到完全不同的效果。
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. 蒙特卡羅算法。
用於求解問題的【准確解】。 用蒙特卡羅算法求得的正確解的概率依賴於算法所用的時間,算法所用的時間越多,得到正確解的概率越高。但無法有效判斷該解 是否肯定正確。
應用:主元素問題
素數測試