隨機化演算法在分析某些涉及概率分析的問題上具有重要意義,因為輸入的分布是我們不能預知的,我們想讓分析的問題達到乙個平均的狀態,就得依靠隨機化,把輸入分布重新排列,使之成為乙個脫離其他外界因數的排列,同時要保證出現這個排列的概率為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 方法是一種以概率統計為指導思想的方法,通過使用隨機數來解決許多問題。基本思想 當所求解問題時是一種隨機事件,或者是某個隨機變數的數學期望時,我們通過統計隨機事件出現的頻率,或者得到隨機變數的數字特徵,來得到問題的解。在實際應用中,不論採用確定性演算法,還是隨機化演算...