隨機化演算法

漆楚衡發表於2015-03-07

隨機化演算法

數值隨機演算法

這類演算法常用於數值問題的求解。 得到的往往是近似解,而近似解的精度與計算時間正相關。

E.g. 用投點方式計算圓的面積

圓半徑已知。 設想一個將整個圓包括其中的矩形,面積已知。 在矩形內隨機投入一定數量的點,對每個點檢測是否在圓內。

通過計算在圓內的點的數量比上投點的總量是圓佔矩形的比例。再乘以矩形面積可得圓的面積。

舍伍德演算法

我們知道一些演算法對特定的輸入會有不同的效率表現(我記得這類演算法被稱為輸入敏感型演算法)。

一個經典的例子是快速排序。對於接近有序的輸入,快速排序的效率會退化到O(n ^ 2)的水平。 好在一般來說,這類壞例子所佔比例不大。如果我們的輸入資料是完全隨機的,效率表現還是可以的。

實際應用時的資料集其實不太可能符合完全隨機的要求,更有可能是在輸入空間內區域性聚集的。 一種解決辦法是消除特定資料與演算法表現之間的關係。在演算法過程中引入隨機。這就是舍伍德演算法的思想。

E.g. 隨機化快速排序

快速排序演算法中的特定資料與演算法表現之間的關係是通過固定的軸點選取引起的。

當我們始終選取第一個元素作為軸點,則演算法對於已排序的資料退化。 如果我們隨機選取軸點,則不會有一個固定輸入例項與退化情形關聯。

注意,在具體執行時仍有可能會出現一個輸入例項和一個隨機軸點序列一起發生退化,但此時這種退化不針對具體輸入空間,即演算法已對輸入不敏感。

E.g. 跳躍表

拉斯維加斯演算法

拉斯維加斯演算法是一種搜尋解的演算法,類似於貪心演算法,不想通過完備的計算得出一個區域性決策的解。 對此,拉斯維加斯演算法的解決方法是引入隨機決策。

引入隨機決策直接導致演算法的準確性下降,這一點可以由得到了巨大提升的演算法效率來彌補,也就是多執行幾次。 另一方面,可以採用混合策略:通過隨機決策迅速縮小搜尋空間,到達某一閥值後改用完全的搜尋。

E.g. : Pollard整數分解

蒙特卡羅演算法

蒙特卡羅演算法與拉斯維加斯演算法相似,通過在搜尋過程中引入隨機決策來提高演算法的效率。 與拉斯維加斯演算法不同的是:

  • 拉斯維加斯演算法可以給出問題的準確解,或者告知演算法沒有找到解
  • 蒙特卡羅演算法只給出概率意義上的解,即給出的解有p的概率是正確的

多次應用蒙特卡羅演算法可以快速提高演算法正確的概率。例如,如果演算法的正確解是唯一的,一次執行可以得出一個1 / 2正確的答案。如果演算法執行n次的結果都是x,則x為正解的概率為1 - (1 / 2) ^ n

由此可見,蒙特卡羅演算法比較適用於判定問題,我們可以用一個p正確的隨機決策來代替確定的判定演算法,而執行隨機決策足夠多次就可以得出極可能正確的答案。

E.g. 尋找主元素

對於一個存在主元素的陣列,主元素是這個陣列中出現次數過陣列大小一半的元素。

我們可以在陣列中任選一個,(對於主元素存在的陣列)它是主元素的概率至少是1 / 2。 此時我們掃描整個陣列,可以判斷其是否是主元素,這個演算法有超過1 / 2的概率找到主元素,並且它找到的一定是主元素。

如果我們重複執行上述演算法常數(c)次,得到一個O(n)的演算法,有1 - (1 / 2) ^ c的可能性正確。

PS:尋找主元素存在O(n)的確定演算法,參考《程式設計之美》

E.g. :素性測試

相關文章