演算法導論 2 隨機演算法習題選

2022-02-13 13:14:58 字數 3278 閱讀 7306

演算法導論裡的習題,有很多都是經典,不少題目都做不出來,到網路上找答案,再自己慢慢理解,這樣的過程使我受益。我精選了一部分習題,寫出思路作為存檔以供查閱。從這篇博文開始,我嘗試使用mathjax來顯示公式,而不是之前若干篇博文中使用,如果你的瀏覽有什麼問題,請告訴我。

前兩題是演算法入門一節挑的,太少就沒有單獨做一篇。

練習2.3-7給出執行時間為 $\theta(nlgn)$ 的演算法,使之能在給定乙個由 $n$ 個整數構成的集合 $s$ 和另乙個整數 $x$ 時,判斷 $s$ 中是否有兩個和為 $x$ 的元素。

思路:首先用合併排序將陣列 $s$ 排序,所需要的執行時間為 $\theta(nlgn)$ 。再用兩個哨兵一頭一尾向中部「巡邏」,如果兩個哨兵的和恰巧為 $x$ ,則找到解,如果哨兵之和大於 $x$ 則將右側哨兵左移一格,若哨兵之和小於 $x$ 則將左側哨兵右移一格,直到兩個哨兵相遇,這個過程所需要的執行時間顯然是 $\theta(n)$ ,整個演算法的執行時間為 $\theta(nlgn)+\theta(n)=\theta(nlgn)$ 。

inverse_num(s, p, q, r)

/*s[p~q] and s[q+1~r] are sorted*/

while i=q to p, j=r to q+1

if s[i]>=s[j]

result+=j-q

i--else

j--

從這裡開始是隨機演算法部分精選的部分習題。

練習c.1-7證明 $$\binom=\binom+\binom$$

思路:從 $n$ 個元素中選取 $k$ 個元素的方法數 = 選取某個元素並從剩下的 $n-1$ 個元素中選取 $k-1$ 個元素的方法數 + 不選這個元素並從剩下的 $n-1$ 個元素中選取 $k$ 個元素的方法數。

練習c.2-7描述怎樣構造乙個 $n$ 個事件的集合,使其兩兩獨立,但不存在 $k>2$ 個相互獨立元素的子集。

思路:先取 $s_$ 和 $s_$ 為隨機實數,且相互獨立,然後設定 $s_=s_+s_$,則由 $s_$ 構成的序列滿足題設條件。

練習c.2-9 c.2-10蒙提霍爾問題(三門問題)。

電視遊戲中,獎品放在三個幕布後。選手選擇乙個幕布後,主持人開啟剩餘兩塊幕布,展示後面是空的,此時選手是否應該改變選擇另一塊幕布以增大自己贏得獎勵的機會?

答案是:應該改變選擇,雖然這和直覺相違背。原因就是主持人知道哪一塊幕布後面是大獎,如果選手指定了有獎品的幕布,主持人隨機開啟剩下兩塊空幕布中的一塊;如果選手指定的幕布後是空的,主持人只會開啟剩下的一塊空幕布,而不會隨機開啟一塊(後面有可能是獎品,遊戲結束了,實際上這種情況從不會發生)。有 $2/3$的情況主持人並不是隨機選擇的,而在計算條件概率的時候往往會忽略這點。

監獄看守從三個罪犯 $x$ 、$y$ 、$z$中隨機選擇乙個並處死。$x$ 問監獄看守 $y$ 和 $z$ 誰會被處死,看守回答 $y$ 會被處死,$x$ 認為自己的生還機率由$1/3$ 提高到 $1/2$,是否是這樣?

答案是:概率並沒有提公升為 $1/2$ ,仍然是 $1/3$ 。這裡似乎會出現兩種直覺相衝突的現象,罪犯 $x$ 問看守的問題中暗含了判斷,他問的是 $y$ 和 $z$ 誰會被處死,不管這三個人誰生還,$y$ 和 $z$ 中必定有乙個人死,看守的回答實際上沒有資訊,但是如果罪犯問 $y$ 是被釋放還是處死,而看守回答是處死(這種情況下看守不會主動規避誰被釋放),那麼 $x$ 才有理由高興。

練習c.3-6令 $x$ 為非負隨機變數,假設 $e[x]$ 有良定義(即收斂)。對任意 $t>0$ 證明馬爾科夫不等式:

$$pr\left\\leq \frac$$

根據在連續正隨機變數上期望的定義:

$$e[x]=\int_^xf(x)dx+\int_^xf(x)dx\geq\int_^xf(x)dx\geq \int_^af(x)dx=apr\left \$$

練習c.4-5證明在每次成功概率為 $1/n$ 的伯努利實驗中, $n$ 次都沒有成功的概率約為 $1/e$。

思路:$n$ 次都沒有成功的概率 $p$ :

$$p(n)=(1-\frac)^$$

當 $n$ 較大時,有

$$\lim_ p(n)=\lim_(1-n)^}=\frac$$

練習c.4-6兩個人分別拋乙個均值硬幣 $n$ 次,他們獲得正面向上次數相同的概率是多少?利用該思路驗證:

$$\sum_^\binom^=\binom$$

思路:計算兩個人都是都拋了 $1$ 次正面朝上、$2$ 次正面朝上……的概率,為

$$pr\=x_\}=\sum_^pr\=x_=k\}=\sum_^\binom^(\frac)^$$

雖然這是乙個正確的結果,但是我們可能希望化簡掉 $\sum$ 符號。

絕妙的思路是:兩個人分別拋 $n$ 次可以視作拋了 $2n$ 次,前 $n$ 次算 $a$ 拋的,後 $n$ 次算 $b$ 拋的——完全沒有問題吧?重點來了,對於 $a$ 每次正面朝上算正面朝上,而對於 $b$ 每次反面朝上算正面朝上(他認為反面才是正面),因為硬幣是均質的,這樣做也不會影響兩個人得到同樣正面個數的概率。這就是一種非常簡單的情況:$2n$ 次拋擲產生了 $n$ 個正面(對於 $a$ 來說)。

所以兩個人獲得正面向上次數相同的概率是

$$pr\=x_\}=\binom(1/2)^$$

思考題c-1基於以下的不同假設,考慮將 $n$ 個球放入 $b$ 個相同盒子中,有多少種方法?

(b) 假設 $n$ 個球是不同的,每個盒子中的球是有順序的,有多少種放法?

將 $b$ 個盒子視為 $b-1$ 跟棍子,棍子將球分隔開,相當於對 $n+b-1$ 個物件全排列,方法數為 $(n+b-1)!$ 。由於 $b-1$ 跟棍子是相同的,所以再除以 $(b-1)!$ ,答案是:

$$\frac$$

(c) 假設球是相同的,盒子也是相同的,又多少種放法?

很顯然,如果球是相同的,$n!$ 個(b)中的方法才會共享乙個(c)的方法,答案是:

$$\binom=\frac$$

練習5.4-6將 $n$ 個球投入到 $n$ 個盒子中,每次投球獨立,落入盒子的機會相等,最後空盒子數量的期望是多少?

思路:解決這類問題的關鍵就是隨機指示器變數,如果根據期望的定義計算空盒子為 $0$ 的概率,為 $1$ 的概率……就會陷入死胡同中。正確的解法是:定義隨機指示器變數 $a_$ 表示第 $i$ 個盒子為空的概率。上文練習c.4-5中已經求得,約為 $1/e$ ,那麼空盒子數量的期望就很簡單為 $n/e$ 了。

演算法導論 隨機演算法

一.概率分布 對於有些問題本身是屬於概率問題,如僱傭問題 對於此類問題,我們需要利用概率分析來得到演算法的執行時間,有時也用來分析其他的量。例如,僱傭問題中的費用問題也需要結合概率分析來計算得到。為了使用概率分析,我們必須使用或者假設已知關於輸入的概率分布,然後通過分析該演算法計算出平均情況下的執行...

演算法導論2 幾個習題 2016 1 2

二 氣泡排序 氣泡排序效率幾乎是所有排序裡最低的,但卻很流行,就是因為它的程式設計複雜度也是最低的。大多數時候,效率還不及插入排序,其實氣泡排序 插入排序 選擇排序基本上效果是差不多的 這個效果不是功能。功能上講肯定差不多啊都是排序 只是過程略有區別。既然寫到這裡,就自己總結一下三者吧。1.插入排序...

演算法導論 習題 5 4 1

題 乙個房間裡必須要有多少人,才能讓某人和你生日相同的概率至少為1 2?必須要有多少人,才能讓至少兩個人生日為7月4日的概率大於1 2?解 1.假設一年有n 365 天,房間裡面有x人 不算自己 為求某人與自己生日相同,可求其反面,即房間裡面沒人跟自己生日相同,他們每個人生日可以在n天中選擇除去我生...