隨機化演算法基礎

2021-06-16 00:40:40 字數 1067 閱讀 5638

隨機化演算法在分析某些涉及概率分析的問題上具有重要意義,因為輸入的分布是我們不能預知的,我們想讓分析的問題達到乙個平均的狀態,就得依靠隨機化,把輸入分布重新排列,使之成為乙個脫離其他外界因數的排列,同時要保證出現這個排列的概率為1/n!。

下面,有兩個常用的演算法來實現輸入分布的隨機化,以給定的輸入陣列為例,我們的目標是把a[1..n]隨機排列。

方法一:

為陣列的每個元素a賦乙個隨機的優先順序p,然後依據優先順序對陣列a中的元素進行排序。例如,陣列a = ,選擇乙個隨機優先順序p = ,將得出陣列a的排列b = ,因為第2個優先順序最小,其次是第4個,第1個,第3個。

這個過程稱為permute_by_sorting

permute_by_sorting(a)

1 n <- length[a]

2 for i <- 1 to n

3      do p = random(1,n^3)

4 sort a,using p as sort keys

5 return a

其中第3步選擇的隨機數範圍1--n^3是為了讓產生的隨機數盡可能的唯一。此過程消耗的時間將由第4步的排序決定,如果使用基於比較的排序,這個時間下界可以達到nlgn(合併排序……),其中排序的方法與普通排序一樣,對p進行排序,多的只是在這個過程中將a按p的優先順序排序。

方法二:

乙個更好的原地排序(in place)給定的數列。過程randomize_in_place在o(n)的時間內完成。在第i次迭代時,元素a是從a到a[n]中隨機選取的。第i次迭代之後,a保持不變。

randomize_in_place(a)

1 n <- length[a]

2 for i <- 1 to n

3      do swap a <-> a[random(i,n)]

證明這兩個隨機演算法產生排列的概率為是均勻的即 1/n! ,需要用的概率分析的內容,這裡不再驗證(自己也知之甚少)。

同時,並非所有的隨機化都是這個模式,這裡只說明了常用的模型。例如在quick_sort中使用隨機化使時間接近最優時,只需要在選擇pivot時作乙個隨機選擇。對於這個模型的具體例項,我在以後的學習中遇到將會新增。

隨機化演算法

隨機化演算法的主要目的是希望讓隨機發生在演算法上,而不是發生在輸入分布上,這樣的話,沒有特別的輸入會引起我們的演算法的最壞情況。即使你最壞的敵人也無法產生最壞的輸入陣列。因為隨機排列使得輸入次序不再相關。只有在隨機數生成器產生乙個不走運的排列時,隨機演算法才會執行得很差。一.隨機優先順序陣列法 我們...

c語言 隨機化演算法

srand unsigned int time null 若不隨機則生成的都為1 相同值 做產生隨機數的種子 x double rand rand max rand 後若為 則是隨機生成0 1之間的數 若為 則是生成0 rand max之間的數 rand max為最大值32767 rand 前為產生...

蒙特卡羅 隨機化演算法

蒙特卡羅 monte carlo 方法是一種以概率統計為指導思想的方法,通過使用隨機數來解決許多問題。基本思想 當所求解問題時是一種隨機事件,或者是某個隨機變數的數學期望時,我們通過統計隨機事件出現的頻率,或者得到隨機變數的數字特徵,來得到問題的解。在實際應用中,不論採用確定性演算法,還是隨機化演算...