1. 程式人生 > >第5章 概率分析和隨機演算法

第5章 概率分析和隨機演算法

練習

5.1-1

證明:因為在過程HIRE-ASSISTANT的第4行中,我們總能決定哪一個應聘者最佳,所以我們能比較任意兩個應聘者的好壞,則意味著我們知道應聘者排名的全部次序。

5.2-1

  1. 當面試的第一個應聘者是最好的應聘者時,你正好僱用一次。所以你正好僱用一次的概率是1/n。
  2. 當應聘者恰好以由次到優的順序出現時,你正好僱用n次。所以你正好僱用n次的概率是1/n!。

5.2-2

假設第一個僱用的應聘者的排名是i,所有排名大於i的應聘者都在排名為n的應聘者後被面試。共有n-i個應聘者排名大於i,排名為n的應聘者在其中最先出現的概率為1/(n-i),此時你正好僱用兩次的概率是Pr\left \{ \right T_{i} \left \right \}=\frac{1}{n}\frac{1}{n-i}

所以,你正好僱用兩次的概率是Pr\left \{ \right.T\left.\right \}=\sum _{i=1}^{n-1}{Pr\left \{ \right T_{i} \left \right \}}=

\sum _{i=1}^{n-1}{\frac{1}{n}\frac{1}{n-i}}=\frac{1}{n}\sum _{i=1}^{n-1}{\frac{1}{i}}=\frac{1}{n}(\lg{(n-1)}+O(1))

5.2-3

設X是一個隨機變數,其值等於n個骰子之和。特別地,假設X_{i}對應於第i個骰子點數的指示器隨機變數。E[X_{i}]=\sum _{i=1}^{6}{iPr\left \{ \right.X_{i}=i\left. \right \}}=\frac{1+2+3+4+5+6}{6}=\frac{21}{6}\RightarrowE[X]=E[\sum _{i=1}^{n}{X_{i}}]=\sum _{i=1}^{n}{E[X_{i}]}=\sum _{i=1}^{n}{\frac{21}{6}}=\frac{21}{6}n

5.2-4

設X是一個隨機變數,其值等於拿到自己帽子的顧客的數量。特別地,假設X_{i}對應於第i個顧客拿到自己帽子該事件的指示器隨機變數。E[X_{i}]=Pr\left \{ \right.顧客i拿到自己帽子\left. \right \}=1/n\Rightarrow E[X]=E[\sum _{i=1}^{n}{X_{i}}]=\sum _{i=1}^{n}{E[X_{i}]}=\sum _{i=1}^{n}{1/n}=1

5.2-5

設X是一個隨機變數,其值等於數列中逆序對的數目。特別地,假設X_{ij}對應於(i,j)為A的一個逆序對該事件的指示器隨機變數。E[X_{ij}]=1/2\Rightarrow E[X]=E[\sum _{i=1}^{n-1}{\sum _{j=i+1}^{n}{X_{ij}}}]=E[\sum _{i=1}^{n-1}{\sum _{j=i+1}^{n}{1/2}}]=\frac{n(n-1)}{4}

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排列的概率是(n-i+1)!/n!=(n-1)!/n!=1/n。子陣列A[1...1]中只有一個元素,其包含任何一個元素的概率都是1/n,並且1排列也只有一個元素。因而,A[1..1]包含任何1排列的概率是1/n,在第1次迴圈迭代以前迴圈不變式成立。

保持:我們假設在第i次迭代之前,每種可能的(i-1)排列出現在子陣列A[1..i-1]中的概率是(n-i+1)!/n!,我們要說明在第i次迭代以後,每種可能的i排列出現在子陣列A[1..i]中的概率是(n-i)!/n!。下一次迭代i累加後,還將保持這個迴圈不變式。

我們來檢查第i次迭代。考慮一個特殊的i排列,並以<x_{1},x_{2},...,x_{i}>

來表示其中的元素。這個排列中包含一個(i-1)排列<x_{1},x_{2},...,x_{i-1}>,後面接著演算法在A[i]裡放置的值x_{i}。設E_{1}表示前i-1次迭代已經在A[1..i-1]中構造了特殊(i-1)排列的事件。根據迴圈不變式,Pr\left \{ \right.E_{1}\left. \right \}=(n-i+1)!/n!。設E_{2}表示第i次迭代在位置A[i]放置x_{i}的事件。當E_{1}E_{2}恰好都發生時,i排列<x_{1},...,x_{i}>出現在A[1..i]中,因此,我們希望計算Pr\{E_{2}\cap E_{1}\}。利用等式(C.14),我們有Pr\{E_{2}\cap E_{1}\}=Pr\{E_{2}|E_{1}\}Pr\{E_{1}\}。概率Pr\{E_{2}|E_{1}\}等於1/(n-i+1),因為在演算法第3行,從A[i..n]的n-i+1個值中隨機選取x_{i}。因此,我們有Pr\{E_{2}|E_{1}\}=Pr\{E_{2}|E_{1}\}Pr\{E_{1}\}=\frac{1}{n-i+1}\cdot \frac{(n-i+1)!}{n!}=\frac{(n-i)!}{n!}

終止:終止時,i=n+1,子陣列A[1..n]是一個給定n排列的概率為(n-(n+1)+1)/n!=0!/n!=1/n!

因此,RANDOMIZE-IN-PLACE產生一個均勻隨機排列。

5.3-2

不能。這段程式碼更換了每個元素的位置,雖然不會產生恆等排列,但是也不能產生有若干但不是全部元素的位置不變的排列。因此,這個過程不能隨機產生除恆等排列外的任意排列。

5.3-3

不能。顯然,這段程式碼產生了n^n種結果,但總共只有n!種排列。因為n!不能整除n^n,所以這不可能是個均勻分佈。因此,這段程式碼不會產生一個均勻隨機排列。

5.3-4

因為B是通過將A中的元素向右迴圈移動一個隨機距離得到的,這個隨機距離介於1到n之間,所以每個元素A[i]出現在B中任何特定位置的概率是1/n。因為排列結果只有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)時,返回的集合S_{1}總共有n-m+1種情況,所以返回每種情況的概率為1/\binom{n-m+1}{1}

假設呼叫RANDOM-SAMPLE(m-1, n-1)返回的集合S_{m-1}每種組合的概率為1/\binom{n-1}{m-1},現在考慮呼叫RANDOM-SAMPLE(m, n)返回的集合S_{m},共有兩種結果:

  1. 集合S_{m}包含元素n。i有兩種可能:1、i\in S,此時i有m-1種取值情況;2、i\notin S,此時i只有一種取值情況即i=n。所以集合S_{m}包含元素n的概率為m/n。剩餘的m-1個元素是呼叫RANDOM-SAMPLE(m-1, n-1)返回的集合S_{m-1},所以集合S_{m}每種組合的概率為\frac{m}{n}\left ( 1/\binom{n-1}{m-1} \right )=1/\binom{n}{m}
  2. 集合S_{m}不包含元素n,此概率為1-m/n=(n-m)/n。此時i有n-m種取值情況,所以集合S_{m}每種組合的概率為\frac{n-m}{n}\frac{1}{n-m}\left ( 1/\binom{n-1}{m-1} \right )=\frac{n-m}{n}\left ( 1/\binom{n-1}{m} \right )=1/\binom{n}{m}

所以,每次呼叫RANDOM-SAMPLE(m, n)返回集合S_{m}的每種組合的概率都為1/\binom{n}{m}。因此,此遞迴過程返回{1, 2, 3, ..., n}的一個隨機m子集S,其中每個m子集是等可能的,然而只對RANDOM呼叫m次。

思考題

5-1

a.設X是一個隨機變數,其值等於在執行n次INCREMENT操作後,計數器所表示的數。特別地,假設X_{i}對應於在執行第i次INCREMENT操作時,計數器所表示的數增加數量的指示器隨機變數。E[X_{i}]=(n_{i+1}-n_{i})(1/(n_{i+1}-n_{i}))\Rightarrow E[X]=E[\sum _{i=1}^{n}{X_{i}]=\sum _{i=1}^{n}{E[X_{i}]}=\sum _{i=1}^{n}{1}=n

b.var[X_{i}]=E[X_{i}^{2}]-E^{2}[X_{i}]=(0^{2}\cdot \frac{99}{100}+100^{2}\cdot \frac{1}{100})-1=99\Rightarrowvar[X]=var[\sum _{i=1}^{n}{X_{i}}]=\sum _{i=1}^{n}{var[X_{i}]}=99n

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的下標的數目期望是n(\ln{n}+O(1))

e.假設恰好有一個下標i使得A[i]=x。設X是一個隨機變數,其值等於直到找到A[i]=x挑選A下標的數目。特別地,假設X_{i}對應於A[i]=x時挑選A下標的數目的指示器隨機變數。E[X_{i}]=i\cdot Pr\left \{A[i]=x\right \}=i\cdot \frac{1}{n}\Rightarrow E[X]=E[\sum _{i=1}^{n}{X_{i}}]=\sum _{i=1}^{n}{E[X_{i}]}=\sum _{i=1}^{n}{i\cdot \frac{1}{n}}=\frac{1}{n}\sum _{i=1}^{n}{i}=\frac{1}{n}\cdot \frac{n(n+1)}{2}=\frac{n+1}{2},所以DETERMINISTIC-SEARCH平均情形的執行時間是\frac{n+1}{2},最壞情形的執行時間是n。

f.假設有k\geqslant 1個下標i使得A[i]=x。設X是一個隨機變數,其值等於直到找到A[i]=x挑選A下標的數目。特別地,假設X_{i}對應於下標i被挑選該事件的指示器隨機變數。當A[i]≠x時,P[X_{i}]=\frac{1}{k+1};當A[i]=x時,P[X_{i}]=\frac{1}{k}。所以E[X]=E[\sum _{i=1}^{n}{X_{i}}]=\sum _{i=1}^{n}{E[X_{i}]}=k\cdot \frac{1}{k}+(n-k)\cdot \frac{1}{k+1}=\frac{n+1}{k+1},所以DETERMINISTIC-SEARCH平均情形的執行時間是\frac{n+1}{k+1},最壞情形的執行時間是n-k+1。

g.假設沒有下標i使得A[i]=x。DETERMINISTIC-SEARCH平均情形的執行時間是n,最壞情形的執行時間是n。

h.

  • 在k=0情況下,演算法SCRAMBLE-SEARCH最壞情形的執行時間和執行時間期望都是n。
  • 在k=1情況下,演算法SCRAMBLE-SEARCH最壞情形的執行時間是n,執行時間期望是\frac{n+1}{2}
  • 在k≥1情況下,演算法SCRAMBLE-SEARCH最壞情形的執行時間是n-k+1,執行時間期望是\frac{n+1}{k+1}

i.將會使用DETERMINISTIC-SEARCH。雖然SCRAMBLE-SEARCH有更好的執行時間期望,但是它需要先用\Theta (n)的時間將輸入陣列隨機變換排列,這段時間內我們足夠將輸入陣列線性查詢一遍並得出結果。