算法导论第三版代码python实现与部分习题答案-第五章:概率分析和随机算法(一)

算法导论代码实现与部分习题答案-第五章:概率分析和随机算法(一)

5.1 雇佣问题

Exercise 5.1-1

题目:
证明在比较模型中,假设我们总能确定哪个候选人是最佳的,这意味着我们知道所有候选人的完整排序。

证明:

假设我们有 n 个候选人,记为 c₁, c₂, …, cₙ。

在比较模型中,我们只能通过两两比较来获得信息,即对于任意两个候选人 cᵢ 和 cⱼ,我们可以知道 cᵢ ≥ cⱼ 还是 cᵢ < cⱼ。

关键观察:
如果我们能够确定哪个候选人是最佳的,这意味着我们有一个算法,对于任意输入的候选人序列,都能正确输出最佳候选人。

为了能够正确识别最佳候选人,我们的算法必须能够区分所有可能的输入情况。具体来说:

  1. 对于 n 个候选人的任何一种排列,算法都必须能够正确识别出最佳候选人(即排序中的最大元素)。

  2. 如果存在两种不同的候选人排列,使得算法无法区分它们,那么算法就可能在这两种情况下给出相同的答案,这会导致错误,因为我们无法总是确定正确的最佳候选人。

  3. 因此,为了能够总是确定最佳候选人,算法必须能够区分所有 n! 种可能的排列。

  4. 要区分 n! 种不同的排列,我们需要至少获得足够的比较信息来确定完整的排序关系。

  5. 换句话说,如果我们能够确定谁是最佳的,那么我们必然已经获得了足够的信息来确定任意两个候选人之间的相对顺序。

结论:
因此,在比较模型中,能够总是确定最佳候选人的假设,实际上意味着我们知道所有候选人之间的完整排序关系。

另一种理解:
如果我们将"最佳"定义为按某种标准排序后的最后一个元素,那么要能够正确识别这个元素,我们必须知道完整的排序信息。否则,我们就无法保证在所有情况下都能正确识别最佳候选人。

Exercise 5.1-2

题目:
请描述 RANDOM(a, b)过程的一种实现, 它只调用 RANDOM(0, 1)。作为 a 和 b 的函数, 你的过程的期望运行时间是多少?

算法实现python:

import math

def random_0_1():
    # 假设这是给定的随机函数,返回0或1
    import random
    return random.randint(0, 1)

def random_a_b(a, b):
    # 计算需要的二进制位数
    n = math.floor(math.log2(b - a + 1)) + 1
    
    while True:
        # 生成n位随机二进制数
        result = 0
        for i in range(n):
            bit = random_0_1()
            result = result * 2 + bit
        
        # 如果结果在有效范围内,则返回
        if result <= (b - a):
            return a + result
        # 否则重新生成

算法解释:

  1. 计算位数: 首先计算需要多少位二进制数才能表示 b−a+1b-a+1ba+1 个不同的值

    • 需要 n=⌈lg⁡(b−a+1)⌉n = \lceil\lg(b-a+1)\rceiln=lg(ba+1)⌉ 位二进制数
    • 在代码中用 math.floor(math.log2(b - a + 1)) + 1 实现
  2. 生成随机数:

    • 通过循环调用 RANDOM(0,1) nnn次,生成一个nnn位的二进制数
    • 将二进制位逐位组合成十进制数
  3. 范围检查:

    • 如果生成的数在 [0,b−a][0, b-a][0,ba] 范围内,则返回 a+a +a+ 这个数
    • 如果超出范围,则重新生成(拒绝采样)

举例说明:
假设要实现 RANDOM(3, 8):

  • b−a+1=6b-a+1 = 6ba+1=6,需要 ⌈lg⁡(6)⌉=3\lceil\lg(6)\rceil = 3lg(6)⌉=3 位二进制数
  • 3位二进制数可以表示 0−70-707(共8个数)
  • 其中 0,1,2,3,4,50,1,2,3,4,50,1,2,3,4,5 对应我们需要的 3,4,5,6,7,83,4,5,6,7,83,4,5,6,7,8
  • 6,76,76,7 超出范围需要重新生成

期望运行时间分析:

  • 每次迭代需要 nnn 次 RANDOM(0,1) 调用
  • 成功概率 = (b−a+1)/2n(b-a+1)/2^n(ba+1)/2n(共2n2^n2n种可能 其中b-a+1种是可行的)
  • 期望迭代次数 = 2n/(b−a+1)2^n/(b-a+1)2n/(ba+1)
  • 期望运行时间 = n×2n/(b−a+1)n \times 2^n/(b-a+1)n×2n/(ba+1)

由于 n=⌈lg⁡(b−a+1)⌉n = \lceil\lg(b-a+1)\rceiln=lg(ba+1)⌉,所以 2n−1<b−a+1≤2n2^{n-1} < b-a+1 \leq 2^n2n1<ba+12n

这意味着 1≤2nb−a+1<21 \leq \frac{2^n}{b-a+1} < 21ba+12n<2

因此 2nb−a+1=O(1)\frac{2^n}{b-a+1} = O(1)ba+12n=O(1),所以期望运行时间为 O(n)=O(lg⁡(b−a+1))O(n) = O(\lg(b-a+1))O(n)=O(lg(ba+1))

Exercise 5.1-3

[!IMPORTANT]

在概率算法中,“有偏”和“无偏”描述的是随机过程输出结果的公平性


有偏(Biased)

  • 定义:如果一个随机过程输出不同结果的概率不相等,则称其为有偏

  • 数学表示:设输出为 0 或 1,若
    Pr⁡(输出 1)=p,Pr⁡(输出 0)=1−p \Pr(\text{输出 } 1) = p,\quad \Pr(\text{输出 } 0) = 1 - p Pr(输出 1)=p,Pr(输出 0)=1p
    且 $ p \neq \frac{1}{2} $,则该过程有偏。

  • 现实类比:抛一枚“偏心的硬币”,正面(1)更容易朝上。

  • 在本题中的体现

    • BIASED-RANDOM 是一个有偏随机源。
    • 它以未知概率 $ p (( 0 < p < 1 $)返回 1,但 $ p $ 不一定等于 $ \frac{1}{2} $。
    • 不能依赖它直接做出公平决策,因为它“不公平”。

无偏(Unbiased)

  • 定义:如果一个随机过程输出不同结果的概率完全相等,则称其为无偏

  • 数学表示
    Pr⁡(输出 0)=Pr⁡(输出 1)=12 \Pr(\text{输出 } 0) = \Pr(\text{输出 } 1) = \frac{1}{2} Pr(输出 0)=Pr(输出 1)=21

  • 现实类比:抛一枚完美的公平硬币,正反面机会均等。

  • 在本题中的目标

    • 使用有偏的 BIASED-RANDOM 作为唯一随机源,

    • 设计算法,使得最终输出满足:
      Pr⁡(返回 0)=Pr⁡(返回 1)=12 \Pr(\text{返回 } 0) = \Pr(\text{返回 } 1) = \frac{1}{2} Pr(返回 0)=Pr(返回 1)=21

    • 即构造一个无偏的随机比特生成器


🔹 核心思想:从有偏到无偏

虽然单次调用 BIASED-RANDOM 有偏,但我们可以利用成对结果的对称性

结果对概率
(0,1)$ p(1-p) $
(1,0)$ p(1-p) $

→ 两者概率完全相同

因此:

  • 遇到 (0,1) → 返回 0
  • 遇到 (1,0) → 返回 1
  • 遇到 (0,0)(1,1) → 丢弃重试(拒绝采样)

这样,输出 0 和 1 的机会完全相等,实现了无偏。


📌 关键结论
即使原始随机源有偏,只要存在对称事件,就可以通过拒绝采样构造出无偏输出。
这就是冯·诺依曼去偏法(Von Neumann Extractor)的核心思想。

题目:
假设你希望以 1/21/21/2 的概率输出 0 与 1。你可以自由使用一个输出 0 或 1 的过程 BIASED-RANDOM。它以某未知概率 ppp 输出 1,以概率 1−p1-p1p 输出 0,其中 0<p<10 < p < 10<p<1,但 ppp 的值未知。请给出一个利用 BIASED-RANDOM 作为子程序的算法,返回一个无偏的结果,能以概率 1/21/21/2 返回 0,以概率 1/21/21/2 返回 1。作为 ppp 的函数,你的算法的期望运行时间是多少?


BIASED-RANDOM 定义

BIASED-RANDOM 是一个理论上的随机比特生成过程,其行为如下:

  • 每次调用返回 01
  • 返回 1 的概率为 $ p $(未知)
  • 返回 0 的概率为 $ 1-p $
  • 其中 $ 0 < p < 1 $,但 $ p $ 的具体值不可知
  • 输出具有偏置(bias),即不保证 $ p = 1/2 $

算法实现(Python):

def biased_random():
    # 假设这是给定的有偏随机函数,返回 0 或 1
    # 实际中 p 未知,这里仅为演示(例如 p=0.3)
    import random
    return 1 if random.random() < 0.3 else 0

def unbiased_random():
    while True:
        a = biased_random()
        b = biased_random()
        
        if a == 0 and b == 1:
            return 0
        elif a == 1 and b == 0:
            return 1
        # 否则继续循环(拒绝 (0,0) 和 (1,1))

算法解释:

  1. 核心思想(冯·诺依曼技巧):
    利用两次独立调用 BIASED-RANDOM 的对称性来消除偏置。虽然单次输出有偏,但成对结果中某些组合的概率相等:

    • Pr⁡(0,1)=(1−p)p\Pr(0,1) = (1-p)pPr(0,1)=(1p)p
    • Pr⁡(1,0)=p(1−p)\Pr(1,0) = p(1-p)Pr(1,0)=p(1p)

    这两个事件的概率完全相同,因此我们可以将 (0,1) 映射为输出 0,将 (1,0) 映射为输出 1,从而得到无偏结果。

  2. 拒绝采样机制:

    • 若结果为 (0,0)(1,1),则丢弃并重新采样。
    • 只有当结果为 (0,1)(1,0) 时才返回输出。
  3. 保证无偏性:
    在返回的情况下,条件概率为:
    Pr⁡(返回 0)=Pr⁡(0,1)Pr⁡(0,1)+Pr⁡(1,0)=p(1−p)2p(1−p)=12 \Pr(\text{返回 } 0) = \frac{\Pr(0,1)}{\Pr(0,1) + \Pr(1,0)} = \frac{p(1-p)}{2p(1-p)} = \frac{1}{2} Pr(返回 0)=Pr(0,1)+Pr(1,0)Pr(0,1)=2p(1p)p(1p)=21
    同理,Pr⁡(返回 1)=12\Pr(\text{返回 } 1) = \frac{1}{2}Pr(返回 1)=21。因此输出是完全无偏的

期望运行时间分析:

  • 每次迭代需要 2 次 BIASED-RANDOM 调用
    → 因为我们成对采样:先调用一次得到 aaa,再调用一次得到 bbb

  • 单次迭代成功的概率为 $ q = 2p(1-p) $
    → 成功是指得到 (0,1)(1,0),这两个事件互斥且概率均为 p(1−p)p(1-p)p(1p),故总成功概率为:
    Pr⁡(返回结果)=Pr⁡(0,1)+Pr⁡(1,0)=p(1−p)+p(1−p)=2p(1−p) \Pr(\text{返回结果}) = \Pr(0,1) + \Pr(1,0) = p(1-p) + p(1-p) = 2p(1-p) Pr(返回结果)=Pr(0,1)+Pr(1,0)=p(1p)+p(1p)=2p(1p)

  • 期望迭代次数 = $ \frac{1}{q} = \frac{1}{2p(1-p)} $
    → 因为每次迭代是否“成功”是一个伯努利试验,成功概率为 qqq,所以迭代次数服从几何分布,其期望为 1/q1/q1/q

[!NOTE]

期望尝试次数公式

当我们重复进行一个随机试验,直到第一次成功为止,且每次试验的成功概率为 $ q $,则:

期望需要尝试的次数 = $ \dfrac{1}{q} $

[!IMPORTANT]

几何分布

几何分布用于描述在一系列独立的伯努利试验中,第一次成功发生在第几次试验


定义

设每次试验成功的概率为 $ q $(其中 $ 0 < q \leq 1 $),且各次试验相互独立。

令随机变量 $ X $ 表示“第一次成功时所进行的试验次数”,则 $ X $ 服从几何分布,记作:

X∼Geometric(q) X \sim \text{Geometric}(q) XGeometric(q)


概率质量函数(PMF)

第 $ k $ 次才第一次成功的概率为:

Pr⁡(X=k)=(1−q)k−1⋅qfor k=1,2,3,… \Pr(X = k) = (1 - q)^{k-1} \cdot q \quad \text{for } k = 1, 2, 3, \dots Pr(X=k)=(1q)k1qfor k=1,2,3,

  • 前 $ k-1 $ 次都失败(每次失败概率 $ 1-q $)
  • 第 $ k $ 次成功(概率 $ q $)

期望值(Expected Value)
E[X]=1q \mathbb{E}[X] = \frac{1}{q} E[X]=q1

平均需要尝试 $ \dfrac{1}{q} $ 次,才能迎来第一次成功。

方差(Variance)
Var(X)=1−qq2 \text{Var}(X) = \frac{1 - q}{q^2} Var(X)=q21q

5.2 指示器随机变量

[!IMPORTANT]

期望的线性性(Linearity of Expectation)

对于任意随机变量 $ X_1, X_2, \dots, X_n $(无论是否独立),都有:

E[∑i=1nXi]=∑i=1nE[Xi] \mathbb{E}\left[\sum_{i=1}^n X_i\right] = \sum_{i=1}^n \mathbb{E}[X_i] E[i=1nXi]=i=1nE[Xi]

  • 不要求变量独立
  • 不要求变量同分布
  • 即使变量高度相关也成立

“期望的和 = 和的期望”,永远成立。

证明过程中调和级数的使用

调和级数定义

调和级数是指前 $ n $ 个正整数倒数之和:

∑i=1n1i=11+12+13+⋯+1n \sum_{i=1}^{n} \frac{1}{i} = \frac{1}{1} + \frac{1}{2} + \frac{1}{3} + \cdots + \frac{1}{n} i=1ni1=11+21+31++n1

这个和没有闭式表达式,但在算法分析中,我们关心它的渐近行为


核心结论

∑i=1n1i=ln⁡n+O(1)(5.5) \sum_{i=1}^{n} \frac{1}{i} = \ln n + O(1) \tag{5.5} i=1ni1=lnn+O(1)(5.5)

调和级数的增长速率与自然对数 ln⁡n\ln nlnn 相同,误差被一个常数所限制

调和数有如下渐近展开(Euler-Maclaurin 公式):

Hn=ln⁡n+γ+12n−112n2+⋯ H_n = \ln n + \gamma + \frac{1}{2n} - \frac{1}{12n^2} + \cdots Hn=lnn+γ+2n112n21+

其中:

  • γ≈0.5772156649\gamma \approx 0.5772156649γ0.5772156649欧拉-马歇罗尼常数(Euler-Mascheroni constant)
  • 后续项随 nnn 增大迅速趋近于 0

因此我们可以写成:
Hn=ln⁡n+γ+o(1) H_n = \ln n + \gamma + o(1) Hn=lnn+γ+o(1)
由于 γ\gammaγ 是常数,故:
Hn=ln⁡n+O(1) H_n = \ln n + O(1) Hn=lnn+O(1)


积分近似法

我们可以用积分来逼近求和。考虑函数 $ f(x) = \frac{1}{x} $,其积分是:

∫1n1x dx=ln⁡n \int_1^n \frac{1}{x} \, dx = \ln n 1nx1dx=lnn

通过上矩形法下矩形法可以得到不等式:

∫1n+11x dx≤∑i=1n1i≤1+∫1n1x dx \int_1^{n+1} \frac{1}{x} \, dx \leq \sum_{i=1}^n \frac{1}{i} \leq 1 + \int_1^n \frac{1}{x} \, dx 1n+1x1dxi=1ni11+1nx1dx

即:
ln⁡(n+1)≤Hn≤1+ln⁡n \ln(n+1) \leq H_n \leq 1 + \ln n ln(n+1)Hn1+lnn

由于 ln⁡(n+1)=ln⁡n+ln⁡(1+1n)≈ln⁡n+O(1n)\ln(n+1) = \ln n + \ln\left(1 + \frac{1}{n}\right) \approx \ln n + O\left(\frac{1}{n}\right)ln(n+1)=lnn+ln(1+n1)lnn+O(n1),所以:

ln⁡n≤Hn≤ln⁡n+1 \ln n \leq H_n \leq \ln n + 1 lnnHnlnn+1

→ 差值不超过 1,因此:
Hn=ln⁡n+O(1) H_n = \ln n + O(1) Hn=lnn+O(1)


在算法中的应用:雇佣问题(Hiring Problem)

在 CLRS 第5章的“雇佣问题”中:

  • 你依次面试 nnn 个候选人
  • 如果当前候选人比之前所有都优秀,就雇佣他
  • 每个排列等可能 ⇒ 第 iii 个候选人是前 iii 个中最优的概率是 1i\frac{1}{i}i1

XiX_iXi 为指示变量:

  • Xi=1X_i = 1Xi=1 如果第 iii 个人被雇佣
  • E[Xi]=Pr⁡[第 i 个是最优]=1i\mathbb{E}[X_i] = \Pr[\text{第 }i\text{ 个是最优}] = \frac{1}{i}E[Xi]=Pr[ i 个是最优]=i1

总期望雇佣次数:
E[X]=E[∑i=1nXi]=∑i=1nE[Xi]=∑i=1n1i=Hn=ln⁡n+O(1) \mathbb{E}[X] = \mathbb{E}\left[\sum_{i=1}^n X_i\right] = \sum_{i=1}^n \mathbb{E}[X_i] = \sum_{i=1}^n \frac{1}{i} = H_n = \ln n + O(1) E[X]=E[i=1nXi]=i=1nE[Xi]=i=1ni1=Hn=lnn+O(1)

结论:平均只雇佣约 ln⁡n\ln nlnn 次,远小于 nnn


常用不等式(可用于证明)
ln⁡(n+1)≤∑i=1n1i≤1+ln⁡n \ln(n+1) \leq \sum_{i=1}^n \frac{1}{i} \leq 1 + \ln n ln(n+1)i=1ni11+lnn

这个不等式可以直接用于严格证明 Hn=Θ(log⁡n)H_n = \Theta(\log n)Hn=Θ(logn)

Exercise 5.2-1

题目:
在 HIRE-ASSISTANT 中, 假设应聘者以随机顺序出现, 你正好雇用一次的概率是多少? 正好雇用 n 次的概率是多少?

解答:

正好雇用一次的概率:

  • 只有当最佳候选人第一个出现时,我们才会只雇用一次
  • 最佳候选人第一个出现的排列数为 (n−1)!(n-1)!(n1)!(固定第一个位置为最佳候选人,其余n−1n-1n1个候选人任意排列)
  • 总的排列数为 n!n!n!
  • 因此概率为 (n−1)!n!=1n\frac{(n-1)!}{n!} = \frac{1}{n}n!(n1)!=n1

正好雇用 n 次的概率:

  • 只有当候选人按能力递增顺序出现时,我们才会雇用 n 次(每次遇到的候选人都比之前的好)
  • 这种情况只对应一种特定的排列
  • 总的排列数为 n!n!n!
  • 因此概率为 1n!\frac{1}{n!}n!1

结论:

  • 正好雇用一次的概率是 1n\frac{1}{n}n1
  • 正好雇用 n 次的概率是 1n!\frac{1}{n!}n!1

Exercise 5.2-2

题目:
在 HIRE-ASSISTANT 中,假设应聘者以随机顺序出现,你正好雇用两次的概率是多少?

解答:

核心思路:

  • 第一个候选人总是被雇用
  • 正好雇用两次意味着:全局最大值是第二个被雇用的候选人
  • 这等价于随机排列中恰好有两个前缀最大值

关键观察:

  • 第一个前缀最大值:第一个候选人(位置 1)
  • 第二个前缀最大值:全局最大值 nnn
  • 要求在全局最大值 nnn 出现之前,不能有其他元素大于第一个候选人

概率计算:
枚举全局最大值 nnn 出现的位置 kkk,其中 k=2,3,…,nk = 2, 3, \dots, nk=2,3,,n

对每个固定的 kkk

  • 从前 n−1n-1n1 个元素中选出 k−1k-1k1 个放入前 k−1k-1k1 个位置,方式数为 Cn−1k−1C_{n-1}^{k-1}Cn1k1
  • k−1k-1k1 个数中的最大值必须放在第一个位置(以保证第一个候选人是前 k−1k-1k1 个中的最大值),方式数为 1
  • 剩余 k−2k-2k2 个数可在第 2 到第 k−1k-1k1 位任意排列,方式数为 (k−2)!(k-2)!(k2)!
  • 位置 kkk 固定为 nnn
  • 剩下的 n−kn-knk 个数在位置 k+1k+1k+1nnn 上任意排列,方式数为 (n−k)!(n-k)!(nk)!

因此,对每个 kkk,合法排列数为:
Cn−1k−1⋅(k−2)!⋅(n−k)!=(n−1)!(k−1)!(n−k)!⋅(k−2)!⋅(n−k)!=(n−1)!k−1 C_{n-1}^{k-1} \cdot (k-2)! \cdot (n-k)! = \frac{(n-1)!}{(k-1)!(n-k)!} \cdot (k-2)! \cdot (n-k)! = \frac{(n-1)!}{k-1} Cn1k1(k2)!(nk)!=(k1)!(nk)!(n1)!(k2)!(nk)!=k1(n1)!

对所有 k=2k=2k=2nnn 求和,得到总合法排列数:
∑k=2n(n−1)!k−1=(n−1)!∑j=1n−11j=(n−1)!⋅Hn−1 \sum_{k=2}^{n} \frac{(n-1)!}{k-1} = (n-1)! \sum_{j=1}^{n-1} \frac{1}{j} = (n-1)! \cdot H_{n-1} k=2nk1(n1)!=(n1)!j=1n1j1=(n1)!Hn1
其中 Hn−1=∑i=1n−11iH_{n-1} = \sum_{i=1}^{n-1} \frac{1}{i}Hn1=i=1n1i1 是第 n−1n-1n1 个调和数。

总排列数为 n!n!n!,因此所求概率为:
Pr⁡(正好雇用两次)=(n−1)!⋅Hn−1n!=Hn−1n=1n∑i=1n−11i \Pr(\text{正好雇用两次}) = \frac{(n-1)! \cdot H_{n-1}}{n!} = \frac{H_{n-1}}{n} = \frac{1}{n} \sum_{i=1}^{n-1} \frac{1}{i} Pr(正好雇用两次)=n!(n1)!Hn1=nHn1=n1i=1n1i1

结论:
正好雇用两次的概率是 Hn−1n\frac{H_{n-1}}{n}nHn1,其中 Hn−1H_{n-1}Hn1 是第 n−1n-1n1 个调和数。

Exercise 5.2-3

题目:
利用指示器随机变量来计算掷 nnn 个骰子之和的期望值。

解答:

方法一:直接使用线性性(标准解法)

XiX_iXi 表示第 iii 个骰子的点数,X=∑i=1nXiX = \sum_{i=1}^{n} X_iX=i=1nXi 表示 nnn 个骰子的点数之和。

对于单个骰子,其点数取值为 111666,且每个结果等概率,即 P(Xi=j)=16P(X_i = j) = \frac{1}{6}P(Xi=j)=61j=1,2,…,6j = 1,2,\dots,6j=1,2,,6

单个骰子的期望为:
E[Xi]=∑j=16j⋅P(Xi=j)=16∑j=16j=16⋅6⋅72=216=3.5 E[X_i] = \sum_{j=1}^{6} j \cdot P(X_i = j) = \frac{1}{6} \sum_{j=1}^{6} j = \frac{1}{6} \cdot \frac{6 \cdot 7}{2} = \frac{21}{6} = 3.5 E[Xi]=j=16jP(Xi=j)=61j=16j=61267=621=3.5

由期望的线性性,无论随机变量是否独立,都有:
E[X]=E[∑i=1nXi]=∑i=1nE[Xi]=∑i=1n3.5=3.5n E[X] = E\left[\sum_{i=1}^{n} X_i\right] = \sum_{i=1}^{n} E[X_i] = \sum_{i=1}^{n} 3.5 = 3.5n E[X]=E[i=1nXi]=i=1nE[Xi]=i=1n3.5=3.5n

方法二:使用指示器随机变量

定义指示器随机变量 Xi,jX_{i,j}Xi,j,其中 1≤i≤n1 \leq i \leq n1in1≤j≤61 \leq j \leq 61j6
Xi,j={1,第 i 个骰子显示点数 j0,否则 X_{i,j} = \begin{cases} 1, & \text{第 } i \text{ 个骰子显示点数 } j \\ 0, & \text{否则} \end{cases} Xi,j={1,0, i 个骰子显示点数 j否则

则第 iii 个骰子的点数可表示为:
Xi=∑j=16j⋅Xi,j X_i = \sum_{j=1}^{6} j \cdot X_{i,j} Xi=j=16jXi,j

nnn 个骰子的总点数为:
X=∑i=1nXi=∑i=1n∑j=16j⋅Xi,j X = \sum_{i=1}^{n} X_i = \sum_{i=1}^{n} \sum_{j=1}^{6} j \cdot X_{i,j} X=i=1nXi=i=1nj=16jXi,j

计算期望:
E[X]=E[∑i=1n∑j=16j⋅Xi,j]=∑i=1n∑j=16j⋅E[Xi,j] E[X] = E\left[\sum_{i=1}^{n} \sum_{j=1}^{6} j \cdot X_{i,j}\right] = \sum_{i=1}^{n} \sum_{j=1}^{6} j \cdot E[X_{i,j}] E[X]=E[i=1nj=16jXi,j]=i=1nj=16jE[Xi,j]

由于每个点数 jjj 出现的概率为 16\frac{1}{6}61,有:
E[Xi,j]=P(Xi,j=1)=16 E[X_{i,j}] = P(X_{i,j} = 1) = \frac{1}{6} E[Xi,j]=P(Xi,j=1)=61

代入得:
E[X]=∑i=1n∑j=16j⋅16=∑i=1n(16∑j=16j)=∑i=1n(16⋅21)=∑i=1n3.5=3.5n E[X] = \sum_{i=1}^{n} \sum_{j=1}^{6} j \cdot \frac{1}{6} = \sum_{i=1}^{n} \left( \frac{1}{6} \sum_{j=1}^{6} j \right) = \sum_{i=1}^{n} \left( \frac{1}{6} \cdot 21 \right) = \sum_{i=1}^{n} 3.5 = 3.5n E[X]=i=1nj=16j61=i=1n(61j=16j)=i=1n(6121)=i=1n3.5=3.5n

结论:
nnn 个骰子之和的期望值是 3.5n3.5n3.5n

Exercise 5.2-4

题目:
利用指示器随机变量来解如下的帽子核对问题(hat-check problem):n 位顾客,他们每个人给餐厅核对帽子的服务生一顶帽子。服务生以随机顺序将帽子归还给顾客。请问拿到自己帽子的顾客的期望人数是多少?

解答:

定义指示器随机变量:
对每一位顾客 i=1,2,…,ni = 1, 2, \dots, ni=1,2,,n,定义指示器随机变量:
Xi={1,顾客 i 拿到自己的帽子0,否则 X_i = \begin{cases} 1, & \text{顾客 } i \text{ 拿到自己的帽子} \\ 0, & \text{否则} \end{cases} Xi={1,0,顾客 i 拿到自己的帽子否则

XXX 表示拿到自己帽子的顾客总数,则:
X=∑i=1nXi X = \sum_{i=1}^{n} X_i X=i=1nXi

计算期望:
由期望的线性性,有:
E[X]=E[∑i=1nXi]=∑i=1nE[Xi] E[X] = E\left[\sum_{i=1}^{n} X_i\right] = \sum_{i=1}^{n} E[X_i] E[X]=E[i=1nXi]=i=1nE[Xi]

对每个 iii,计算 E[Xi]=P(Xi=1)E[X_i] = P(X_i = 1)E[Xi]=P(Xi=1),即顾客 iii 拿到自己帽子的概率。

由于服务生以随机顺序归还帽子,相当于对 nnn 顶帽子进行均匀随机排列,每位顾客收到对应位置的帽子。

顾客 iii 拿到自己帽子的概率等于在随机排列中,第 iii 个位置是其自身帽子的概率。由于排列是随机的,每个帽子等可能出现在任意位置,
P(第 i 个位置是帽子 i)=1n P(\text{第 } i \text{ 个位置是帽子 } i) = \frac{1}{n} P( i 个位置是帽子 i)=n1

更严谨地说:总共有 n!n!n! 个排列,其中固定第 iii 个位置为 iii 的排列数为 (n−1)!(n-1)!(n1)!(其余 n−1n-1n1 个元素任意排列),因此:
P(Xi=1)=(n−1)!n!=1n P(X_i = 1) = \frac{(n-1)!}{n!} = \frac{1}{n} P(Xi=1)=n!(n1)!=n1

于是:
E[Xi]=1n E[X_i] = \frac{1}{n} E[Xi]=n1

代入总期望:
E[X]=∑i=1nE[Xi]=∑i=1n1n=n⋅1n=1 E[X] = \sum_{i=1}^{n} E[X_i] = \sum_{i=1}^{n} \frac{1}{n} = n \cdot \frac{1}{n} = 1 E[X]=i=1nE[Xi]=i=1nn1=nn1=1

结论:
拿到自己帽子的顾客的期望人数是 111,无论 nnn 的大小如何。

Exercise 5.2-5

题目:
A[1..n]A[1..n]A[1..n] 是由 nnn 个互异元素构成的数组。如果 i<ji < ji<jA[i]>A[j]A[i] > A[j]A[i]>A[j],则称 (i,j)(i, j)(i,j)AAA 的一个逆序对。假设 AAA 的元素构成 {1,2,…,n}\{1, 2, \dots, n\}{1,2,,n} 上的一个均匀随机排列。请用指示器随机变量来计算逆序对数目的期望。

解答:

定义指示器随机变量:
对每一对下标 (i,j)(i, j)(i,j),其中 1≤i<j≤n1 \leq i < j \leq n1i<jn,定义指示器随机变量:
Xij={1,若 (i,j) 是一个逆序对,即 A[i]>A[j]0,否则 X_{ij} = \begin{cases} 1, & \text{若 } (i, j) \text{ 是一个逆序对,即 } A[i] > A[j] \\ 0, & \text{否则} \end{cases} Xij={1,0, (i,j) 是一个逆序对,即 A[i]>A[j]否则

XXX 表示数组 AAA 中逆序对的总数,则:
X=∑1≤i<j≤nXij X = \sum_{1 \leq i < j \leq n} X_{ij} X=1i<jnXij

计算期望:
由期望的线性性,有:
E[X]=E[∑1≤i<j≤nXij]=∑1≤i<j≤nE[Xij] E[X] = E\left[\sum_{1 \leq i < j \leq n} X_{ij}\right] = \sum_{1 \leq i < j \leq n} E[X_{ij}] E[X]=E[1i<jnXij]=1i<jnE[Xij]

对任意固定的 i<ji < ji<j,计算 E[Xij]=P(Xij=1)=P(A[i]>A[j])E[X_{ij}] = P(X_{ij} = 1) = P(A[i] > A[j])E[Xij]=P(Xij=1)=P(A[i]>A[j])

由于 AAA{1,2,…,n}\{1, 2, \dots, n\}{1,2,,n} 的一个均匀随机排列,任意两个不同元素在位置 iiijjj 上的相对顺序是等可能的。即:

  • A[i]>A[j]A[i] > A[j]A[i]>A[j] 的概率为 12\frac{1}{2}21
  • A[i]<A[j]A[i] < A[j]A[i]<A[j] 的概率也为 12\frac{1}{2}21

因此:
E[Xij]=12 E[X_{ij}] = \frac{1}{2} E[Xij]=21

满足 1≤i<j≤n1 \leq i < j \leq n1i<jn(i,j)(i, j)(i,j) 对的总数为从 nnn 个下标中任取两个不同下标并按 i<ji < ji<j 排序的组合数,即:
Cn2=n(n−1)2 C_n^2 = \frac{n(n-1)}{2} Cn2=2n(n1)

代入期望公式:
E[X]=∑1≤i<j≤n12=Cn2⋅12=n(n−1)2⋅12=n(n−1)4 E[X] = \sum_{1 \leq i < j \leq n} \frac{1}{2} = C_n^2 \cdot \frac{1}{2} = \frac{n(n-1)}{2} \cdot \frac{1}{2} = \frac{n(n-1)}{4} E[X]=1i<jn21=Cn221=2n(n1)21=4n(n1)

结论:
在随机排列中,逆序对数目的期望为 n(n−1)4\dfrac{n(n-1)}{4}4n(n1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值