算法导论里的习题,有很多都是经典,不少题目都做不出来,到网络上找答案,再自己慢慢理解,这样的过程使我受益。我精选了一部分习题,写出思路作为存档以供查阅。从这篇博文开始,我尝试使用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)$ 。
思考题2-4.d 给出运行时间为 $\Theta(nlgn)$ 的算法,确定 $n$ 个元素的排列 $S$ 中逆序对的数目。(提示:修改合并排序。)
思路:将 $S$ 的某个子集 $[s_{p},s_{r}]$ 分成两个子集 $[s_{p},s_{q}]$ 和 $[s_{q+1},s_{r}]$ 。$[s_{p},s_{r}]$ 中逆序对的数目等于两个子集各自内部的逆序对数目和子集间逆序对的数目——前者可以递归地求解,直到子集中只有一个元素,逆序对数目为 $0$ ,后者在两个子集已经排过序的情况下也可以在线性运行时间下求得(该过程的伪代码如下)。
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{n}{k}=\binom{n-1}{k}+\binom{n-1}{k-1}$$
思路:从 $n$ 个元素中选取 $k$ 个元素的方法数 = 选取某个元素并从剩下的 $n-1$ 个元素中选取 $k-1$ 个元素的方法数 + 不选这个元素并从剩下的 $n-1$ 个元素中选取 $k$ 个元素的方法数。
练习C.2-7 描述怎样构造一个 $n$ 个事件的集合,使其两两独立,但不存在 $k>2$ 个相互独立元素的子集。
思路:先取 $s_{1}$ 和 $s_{2}$ 为随机实数,且相互独立,然后设定 $s_{i}=s_{i-1}+s_{i-2}$,则由 $s_{i}$ 构成的序列满足题设条件。
练习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\{X\geq a\right \}\leq \frac{E[X]}{a}$$
根据在连续正随机变量上期望的定义:
$$E[X]=\int_{0}^{a}xf(x)dx+\int_{a}^{\infty}xf(x)dx\geq\int_{a}^{\infty}xf(x)dx\geq \int_{a}^{\infty}af(x)dx=aPr\left \{ x\geq a \right \}$$
练习C.4-5 证明在每次成功概率为 $1/n$ 的伯努利实验中, $n$ 次都没有成功的概率约为 $1/e$。
思路:$n$ 次都没有成功的概率 $p$ :
$$p(n)=(1-\frac{1}{n})^{n}$$
当 $n$ 较大时,有
$$\lim_{n \to \infty } p(n)=\lim_{n \to 0 }(1-n)^{\frac{1}{n}}=\frac{1}{e}$$
练习C.4-6 两个人分别抛一个均值硬币 $n$ 次,他们获得正面向上次数相同的概率是多少?利用该思路验证:
$$\sum_{k=0}^{n}\binom{n}{k}^{2}=\binom{2n}{n}$$
思路:计算两个人都是都抛了 $1$ 次正面朝上、$2$ 次正面朝上……的概率,为
$$Pr\{x_{A}=x_{B}\}=\sum_{k=0}^{n}Pr\{x_{A}=x_{B}=k\}=\sum_{k=0}^{n}\binom{n}{k}^{2}(\frac{1}{2})^{2}$$
虽然这是一个正确的结果,但是我们可能希望化简掉 $\sum$ 符号。
绝妙的思路是:两个人分别抛 $n$ 次可以视作抛了 $2n$ 次,前 $n$ 次算 $A$ 抛的,后 $n$ 次算 $B$ 抛的——完全没有问题吧?重点来了,对于 $A$ 每次正面朝上算正面朝上,而对于 $B$ 每次反面朝上算正面朝上(他认为反面才是正面),因为硬币是均质的,这样做也不会影响两个人得到同样正面个数的概率。这就是一种非常简单的情况:$2n$ 次抛掷产生了 $n$ 个正面(对于 $A$ 来说)。
所以两个人获得正面向上次数相同的概率是
$$Pr\{x_{A}=x_{B}\}=\binom{2n}{n}(1/2)^{2n}$$
思考题C-1 基于以下的不同假设,考虑将 $n$ 个球放入 $b$ 个相同盒子中,有多少种方法?
(b) 假设 $n$ 个球是不同的,每个盒子中的球是有顺序的,有多少种放法?
将 $b$ 个盒子视为 $b-1$ 跟棍子,棍子将球分隔开,相当于对 $n+b-1$ 个物件全排列,方法数为 $(n+b-1)!$ 。由于 $b-1$ 跟棍子是相同的,所以再除以 $(b-1)!$ ,答案是:
$$\frac{(n+b-1)!}{(b-1)!}$$
(c) 假设球是相同的,盒子也是相同的,又多少种放法?
很显然,如果球是相同的,$n!$ 个(b)中的方法才会共享一个(c)的方法,答案是:
$$\binom{b+n-1}{n}=\frac{(n+b-1)!}{(b-1)!\cdot n!}$$
练习5.4-6 将 $n$ 个球投入到 $n$ 个盒子中,每次投球独立,落入盒子的机会相等,最后空盒子数量的期望是多少?
思路:解决这类问题的关键就是随机指示器变量,如果根据期望的定义计算空盒子为 $0$ 的概率,为 $1$ 的概率……就会陷入死胡同中。正确的解法是:定义随机指示器变量 $A_{i}$ 表示第 $i$ 个盒子为空的概率。上文练习C.4-5中已经求得,约为 $1/e$ ,那么空盒子数量的期望就很简单为 $n/e$ 了。