第5章 概率分析和隨機演算法
練習
5.1-1
證明:因為在過程HIRE-ASSISTANT的第4行中,我們總能決定哪一個應聘者最佳,所以我們能比較任意兩個應聘者的好壞,則意味著我們知道應聘者排名的全部次序。
5.2-1
- 當面試的第一個應聘者是最好的應聘者時,你正好僱用一次。所以你正好僱用一次的概率是1/n。
- 當應聘者恰好以由次到優的順序出現時,你正好僱用n次。所以你正好僱用n次的概率是1/n!。
5.2-2
假設第一個僱用的應聘者的排名是i,所有排名大於i的應聘者都在排名為n的應聘者後被面試。共有n-i個應聘者排名大於i,排名為n的應聘者在其中最先出現的概率為1/(n-i),此時你正好僱用兩次的概率是。
所以,你正好僱用兩次的概率是
5.2-3
設X是一個隨機變數,其值等於n個骰子之和。特別地,假設對應於第i個骰子點數的指示器隨機變數。。
5.2-4
設X是一個隨機變數,其值等於拿到自己帽子的顧客的數量。特別地,假設對應於第i個顧客拿到自己帽子該事件的指示器隨機變數。顧客i拿到自己帽子。
5.2-5
設X是一個隨機變數,其值等於數列中逆序對的數目。特別地,假設對應於(i,j)為A的一個逆序對該事件的指示器隨機變數。。
5.3-1
RANDOMIZE-IN-PLACE(A) n = A.length swap A[1] with A[RANDOM(1, n)] for i = 2 to n swap A[i] with A[RANDOM(i, n)]
證明:
初始化:考慮正好在第1次迴圈迭代以前的情況,此時i=2。由迴圈不變式可知,對每個可能地1排列,子陣列A[1..1]包含這個1排列的概率是。子陣列A[1...1]中只有一個元素,其包含任何一個元素的概率都是1/n,並且1排列也只有一個元素。因而,A[1..1]包含任何1排列的概率是1/n,在第1次迴圈迭代以前迴圈不變式成立。
保持:我們假設在第i次迭代之前,每種可能的(i-1)排列出現在子陣列A[1..i-1]中的概率是,我們要說明在第i次迭代以後,每種可能的i排列出現在子陣列A[1..i]中的概率是。下一次迭代i累加後,還將保持這個迴圈不變式。
我們來檢查第i次迭代。考慮一個特殊的i排列,並以
終止:終止時,,子陣列A[1..n]是一個給定n排列的概率為。
因此,RANDOMIZE-IN-PLACE產生一個均勻隨機排列。
5.3-2
不能。這段程式碼更換了每個元素的位置,雖然不會產生恆等排列,但是也不能產生有若干但不是全部元素的位置不變的排列。因此,這個過程不能隨機產生除恆等排列外的任意排列。
5.3-3
不能。顯然,這段程式碼產生了種結果,但總共只有種排列。因為不能整除,所以這不可能是個均勻分佈。因此,這段程式碼不會產生一個均勻隨機排列。
5.3-4
因為B是通過將A中的元素向右迴圈移動一個隨機距離得到的,這個隨機距離介於1到n之間,所以每個元素A[i]出現在B中任何特定位置的概率是。因為排列結果只有n種,所以排列結果不是均勻隨機排列。
5.3-6
PERMUTE-BY-SORTING(A)
n = A.length
if n <= 1
return A
let B[1..n] be a new array
let P[1..n] be a new array
for i = 1 to n
P[i] = RANDOM(1, n^3)
mined = 0
for i = 1 to n
for m = 1 to n
if P[m] > mined
min = m
break
mins = []
mins.push(min)
for j = 1 to n
if P[j] > mined
if P[j] < P[min]
mins = []
mins.push(j)
min = j
else if P[j] == P[min]
mins.push(j)
if mins.length >= 2
mins = PERMUTE-BY-SORTING(mins)
for k = 1 to mins.length
B[i] = A[mins[k]]
if k < mins.length
i = i + 1
else B[i] = A[min]
mined = P[min]
return B
5.3-7
當呼叫RANDOM-SAMPLE(1, n-m+1)時,返回的集合總共有n-m+1種情況,所以返回每種情況的概率為。
假設呼叫RANDOM-SAMPLE(m-1, n-1)返回的集合每種組合的概率為,現在考慮呼叫RANDOM-SAMPLE(m, n)返回的集合,共有兩種結果:
- 集合包含元素n。i有兩種可能:1、,此時i有m-1種取值情況;2、,此時i只有一種取值情況即。所以集合包含元素n的概率為。剩餘的m-1個元素是呼叫RANDOM-SAMPLE(m-1, n-1)返回的集合,所以集合每種組合的概率為。
- 集合不包含元素n,此概率為。此時i有n-m種取值情況,所以集合每種組合的概率為。
所以,每次呼叫RANDOM-SAMPLE(m, n)返回集合的每種組合的概率都為。因此,此遞迴過程返回{1, 2, 3, ..., n}的一個隨機m子集S,其中每個m子集是等可能的,然而只對RANDOM呼叫m次。
思考題
5-1
a.設X是一個隨機變數,其值等於在執行n次INCREMENT操作後,計數器所表示的數。特別地,假設對應於在執行第i次INCREMENT操作時,計數器所表示的數增加數量的指示器隨機變數。。
b.。
5-2
a.過程RANDOM-SEARCH的虛擬碼:
RANDOM-SEARCH(A, x)
n = A.length
let P[1..n] be a new array
for i = 1 to n
P[i] = 0
m = 0
while m < n
i = RANDOM(1, n)
if P[i] == 0
if A[i] == x
return i
P[i] = 1
m = m + 1
b.假設恰好有一個下標i使得A[i]=x。因為從A中挑選到下標i使得A[i]=x的概率服從伯努利分佈,所以在找到x和RANDOM-SEARCH結束之前,必須挑選A下標的數目期望是n。
c.假設恰好有k≥1個下標i使得A[i]=x。從A中挑選到下標i使得A[i]=x的概率服從伯努利分佈,所以在找到x和RANDOM-SEARCH結束之前,必須挑選A下標的數目期望是n/k。
d.假設沒有下標i使得A[i]=x。根據 5.4.2 球與箱子 的結論,在檢查完A的所有元素或RANDOM-SEARCH結束之前,必須挑選A的下標的數目期望是。
e.假設恰好有一個下標i使得A[i]=x。設X是一個隨機變數,其值等於直到找到A[i]=x挑選A下標的數目。特別地,假設對應於A[i]=x時挑選A下標的數目的指示器隨機變數。,所以DETERMINISTIC-SEARCH平均情形的執行時間是,最壞情形的執行時間是n。
f.假設有個下標i使得A[i]=x。設X是一個隨機變數,其值等於直到找到A[i]=x挑選A下標的數目。特別地,假設對應於下標i被挑選該事件的指示器隨機變數。當A[i]≠x時,;當A[i]=x時,。所以,所以DETERMINISTIC-SEARCH平均情形的執行時間是,最壞情形的執行時間是n-k+1。
g.假設沒有下標i使得A[i]=x。DETERMINISTIC-SEARCH平均情形的執行時間是n,最壞情形的執行時間是n。
h.
- 在k=0情況下,演算法SCRAMBLE-SEARCH最壞情形的執行時間和執行時間期望都是n。
- 在k=1情況下,演算法SCRAMBLE-SEARCH最壞情形的執行時間是n,執行時間期望是。
- 在k≥1情況下,演算法SCRAMBLE-SEARCH最壞情形的執行時間是n-k+1,執行時間期望是。
i.將會使用DETERMINISTIC-SEARCH。雖然SCRAMBLE-SEARCH有更好的執行時間期望,但是它需要先用的時間將輸入陣列隨機變換排列,這段時間內我們足夠將輸入陣列線性查詢一遍並得出結果。