隨機排列算法及《算法導論》5.3節習題解答

隨機排列算法及《算法導論》5.3節習題解答

  《算法導論》介紹了兩種隨機排列數組的算法。

  第一種算法是爲數組的每個元素A[i]賦一個隨機的優先級P[i],然後依據優先級對數組A中的元素進行排序。例如,如果初始數組A=(1,2,3,4),隨機選擇的優先級P=(36,3,62,19),則將產生一個數組B=(2,4,1,3),因爲第2個優先級最小,接下來是第4個,然後第1個,最後第3個。我們稱這個過程爲PERMUTE-BY-SORTING:


1
2
3
4
5
6

PERMUTE-BY-SORTING(A)
n = A.length
let P[1..n] be a new array
for i = 1 to n
P[i] = RANDOM(1,n^3)
sort A, using P as sort keys

第5行選取一個在1~n3之間的隨機數。我們使用範圍1~n3是爲了讓P中所有優先級儘可能唯一。我們假設所有的優先級都唯一。

  第二種算法是原址排列給定數組。過程RANDOMIZE-IN-PLACE在O(n)時間內完成。在進行第i次迭代時,元素A[i]是從元素A[i]到A[n]中隨機選取的。第i次迭代以後,A[i]不再改變。


1
2
3
4

RANDOMIZE-IN-PLACE(A)
n = A.length
for i = 1 to n
swap A[i] with A[RANDOM(i,n)]

  以上兩種算法都能計算出數組A的一個均勻隨機排列,明顯第二種算法更加漂亮。

  練習5.3有幾個RANDOMIZE-IN-PLACE算法的變形,但他們計算出的排列都不是A的均勻隨機排列,下面一起來看一下。


5.3-2 Kelp教授決定寫一個過程來隨機產生除恆等排列(identity permutation)外的任意排列。他提出瞭如下過程:


1
2
3
4

PERMUTE-WITHOUT-IDENTITY(A)
n = A.length
for i = 1 to n-1
swap A[i] with A[RANDOM(i+1,n)]

這段代碼實現了Kelp教授的意圖嗎?

  沒有。雖然這個過程不能產生恆等排列,但也不能產生除恆等排列完的任意排列。

  除恆等排列外的任意排列共有n!-1個,但是此過程只能產生(n-1)(n-2)…1=(n-1)!個,還有(n!-1)-(n-1)!個排列不能產生。舉個例子:A=(a1,a2,…,an),a1必須和a2,a3,…,an中的某一個交換,假設和aj交換,則a1永遠不可能回到第一個位置了,因爲當循環到位置j時,aj(原來的a1)也只能被交換到a(j+1),…,an中。而除恆等排列外的任意排列明顯包含a1在第一個位置上的排列。

  所以過程PERMUTE-WITHOUT-IDENTITY不能產生除恆等排列外的任意排列。


5.3-3 假設我們不是將元素A[i]與子數組A[i..n]中的一個隨機元素交換,而是將它與數組任何位置上的隨機元素交換:


1
2
3
4

PERMUTE-WITH-ALL(A)
n = A.length
for i = 1 to n
swap A[i] with A[RANDOM(1,n)]

這段代碼會產生一個均勻隨機排列嗎?爲什麼會或爲什麼不會?

  這段代碼不會產生一個均勻隨機的排列,使用反證法如下。

  假設這段代碼會產生一個均勻隨機的排列,且假設n=3,則三個元素的均勻隨機排列共有3!=6個,且每個排列出現的概率爲1/6。但是過程PERMUTE-WITH-ALL一共產生n3=27(n=3,3次for循環,每次RANDOM(1,3)有3可能)個排列,假設共有m個互異的排列,且排列是均勻隨機的,則每個互異的排列的概率爲m/27,且滿足m/27=1/6。但是m沒有整數解,所以原假設不成立,即過程PERMUTE-WITH-ALL不能產生一個均勻隨機的排列。

  實際上當n=3時,產生的排列及概率如下:

(1,2,3)4/27(1,3,2)5/27(2,1,3)5/27(2,3,1)5/27(3,1,2)4/27(3,2,1)4/27

雖然他們產生了所有的排列,且概率總和爲1,但是他們不是隨機均勻的,因爲每一種排列的概率不相等。


5.3-4 Armstrong教授建議用下面的過程來產生一個均勻隨機排列:


1
2
3
4
5
6
7
8
9
10

PERMUTE-BY-CYCLIC(A)
n = A.length
let B[1..n] be a new array
offset = RANDOM(1,n)
for i = 1 to n
dest = i + offset
if dest > n
dest = dest - n
B[dest] = A[i]
return B

請說明每個元素A[i]出現在B中任何特定位置的概率是1/n。然後通過說明排列結果不是均勻隨機排列,表明Armstrong教授錯了。

  A[i]出現在B中的位置是由offset決定的,而且只要offset決定了,則整個B就決定了;又因爲offset=RANDOM(1,n),所以特定的offset出現的概率相等,都爲1/n,所以每個元素A[i]出現在B中任何特定位置的概率是1/n。

  因爲offset只有n種可能,所以B也只有n種可能,但是A的所有均勻隨機排列共有n!種情況,所以還有n!-n種情況沒有出現,即排列結果不是均勻隨機的。


*5.3-5 證明:在過程PERMUTE-BY-SORTING的數組P中,所有元素都唯一的概率至少是1-1/n。

  假設RANDOM(1,n3)產生的n個數爲a1,a2,…,an,事件Xi表示a1~ai互不相等,則Xn表示a1~an互不相等,Xn是在X(n-1)的基礎上保證an和a1~a(n-1)互不相等,即Xn={an不等於a1,a2,…,a(n-1)之一}∩X(n-1),於是P(Xn)=P{{an不等於a1,a2,…,a(n-1)之一}∩X(n-1)},根據條件概率公式得:

隨機排列算法及《算法導論》5.3節習題解答

所以數組P中,所有元素都唯一的概率至少是1-1/n。

 

 


5.3-6 請解釋如何實現算法PERMUTE-BY-SORTING,以處理兩個或更多優先級相同的情形。也就是說,即使有兩個或更多優先級相同,你的算法也應該產生一個均勻隨機排列

  對幾個優先級相同的項,再進行一輪隨機優先級排序;如果再有相同,再進行一次…思路就是要確保這幾個優先級相同的項得到隨機的排列。

轉自http://beeder.github.io/2014/12/19/random-permutation-algorithms-and-some-solutions-to-clrs-ch5-3/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章