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

5.3 随机算法

引理 5.4

假设所有优先级都不同,则过程 PERMUTE-BY-SORTING 产生输入的均匀随机排列。

证明:

我们考虑数组 $ A[1…n] $ 中每个元素 $ A[i] $ 被分配到第 $ i $ 个最小优先级的事件,即最终排列恰好为某一个特定排列。我们将证明:每一个特定排列出现的概率均为 $ \frac{1}{n!} $,从而说明该过程生成的是一个均匀随机排列

[!NOTE]

为什么要定义事件 $ E_i $:元素 $ A[i] $ 被分配到第 $ i $ 小的优先级?

这个定义的目的是为了分析某一个特定排列出现的概率,进而证明 PERMUTE-BY-SORTING 算法生成的是均匀随机排列

具体原因如下:

  • 算法通过为每个元素分配随机优先级,然后按优先级排序来打乱数组。
  • 要证明结果是“均匀随机”的,就必须证明:每一个可能的排列出现的概率都相等,且为 $ \frac{1}{n!} $
  • 为了计算某个排列的概率,我们选择一个简单的目标排列——原始顺序(即 $ A[1], A[2], \dots, A[n] $ 保持不变)。
  • 这个排列出现的条件是:$ A[1] $ 的优先级最小,$ A[2] $ 的优先级第二小,……,$ A[n] $ 的优先级最大。
  • 因此,定义事件 $ E_i :“:“ A[i] $ 获得第 $ i $ 小的优先级”,正是描述这一条件。
  • 所有 $ E_1 \cap E_2 \cap \cdots \cap E_n $ 同时发生 ⇨ 原始顺序出现。

通过计算这个联合事件的概率为 $ \frac{1}{n!} $,我们验证了至少有一个排列的概率是 $ \frac{1}{n!} $

再结合算法的对称性(每个元素被分配优先级的方式完全对称),可推出:所有排列的概率都等于 $ \frac{1}{n!} $

因此,定义 $ E_i $ 是一种构造性方法,用于精确计算一个典型排列的概率,从而推导出整个分布的均匀性。

定义事件 $ E_i $ 为:元素 $ A[i] $ 被分配到第 $ i $ 小的优先级(即在所有优先级中排名第 $ i $)。

我们要求的是所有事件同时发生的概率:
Pr⁡{E1∩E2∩E3∩⋯∩En−1∩En} \Pr\{E_1 \cap E_2 \cap E_3 \cap \cdots \cap E_{n-1} \cap E_n\} Pr{E1E2E3En1En}

根据条件概率的链式法则,有:
Pr⁡{⋂i=1nEi}=Pr⁡{E1}⋅Pr⁡{E2∣E1}⋅Pr⁡{E3∣E1∩E2}⋯Pr⁡{En∣E1∩⋯∩En−1} \Pr\left\{\bigcap_{i=1}^n E_i\right\} = \Pr\{E_1\} \cdot \Pr\{E_2 \mid E_1\} \cdot \Pr\{E_3 \mid E_1 \cap E_2\} \cdots \Pr\{E_n \mid E_1 \cap \cdots \cap E_{n-1}\} Pr{i=1nEi}=Pr{E1}Pr{E2E1}Pr{E3E1E2}Pr{EnE1En1}

下面我们逐项分析每一项的概率。

  • $ \Pr{E_1} $:元素 $ A[1] $ 被分配最小优先级的概率。
    在 $ n $ 个互异优先级中,每个元素等可能获得最小优先级,故:
    Pr⁡{E1}=1n \Pr\{E_1\} = \frac{1}{n} Pr{E1}=n1

  • $ \Pr{E_2 \mid E_1} $:在 $ A[1] $ 已获得最小优先级的前提下,$ A[2] $ 获得剩余 $ n-1 $ 个优先级中最小者(即全局第二小)的概率。
    剩余 $ n-1 $ 个元素机会均等,故:
    Pr⁡{E2∣E1}=1n−1 \Pr\{E_2 \mid E_1\} = \frac{1}{n-1} Pr{E2E1}=n11

  • 一般地,对于 $ i = 2, 3, \dots, n $,在事件 $ E_1, E_2, \dots, E_{i-1} $ 都发生的前提下,前 $ i-1 $ 个元素已占据前 $ i-1 $ 小的优先级,剩余 $ n - (i-1) = n - i + 1 $ 个元素中,每个都等可能获得第 $ i $ 小的优先级。因此:
    Pr⁡{Ei∣E1∩E2∩⋯∩Ei−1}=1n−i+1 \Pr\{E_i \mid E_1 \cap E_2 \cap \cdots \cap E_{i-1}\} = \frac{1}{n - i + 1} Pr{EiE1E2Ei1}=ni+11

将这些概率相乘,得到联合概率:
Pr⁡{E1∩E2∩⋯∩En}=1n⋅1n−1⋅1n−2⋯12⋅11=1n! \Pr\{E_1 \cap E_2 \cap \cdots \cap E_n\} = \frac{1}{n} \cdot \frac{1}{n-1} \cdot \frac{1}{n-2} \cdots \frac{1}{2} \cdot \frac{1}{1} = \frac{1}{n!} Pr{E1E2En}=n1n11n212111=n!1

这表明:任何一个特定排列(由优先级排序决定)出现的概率为 $ \frac{1}{n!} $

由于共有 $ n! $ 个不同的排列,且每个排列的概率均为 $ \frac{1}{n!} $,因此该过程生成的是一个均匀随机排列

结论:
在所有优先级互异的前提下,过程 PERMUTE-BY-SORTING 产生输入数组的一个均匀随机排列。

引理 5.5

目标:
证明 RANDOMIZE-IN-PLACE 生成的是一个均匀随机排列,即每一个 $ n $ 排列出现的概率均为 $ \frac{1}{n!} $。


关键定义:

  • 一个 $ k $-排列是从 $ n $ 个元素中选出 $ k $ 个并排序的结果。
  • 共有 $ A_n^k = \frac{n!}{(n-k)!} $ 个不同的 $ k $-排列。

循环不变式(Loop Invariant):
在 for 循环的第 $ i $ 次迭代之前,对于每一个可能的 $ (i-1) $-排列,子数组 $ A[1…i-1] $ 包含该排列的概率为:
(n−i+1)!n! \frac{(n - i + 1)!}{n!} n!(ni+1)!

我们用此不变式来证明算法的正确性。


证明:

1. 初始化(Initialization):
当 $ i = 1 $ 时,尚未开始循环,子数组 $ A[1…0] $ 为空。
此时考虑 $ 0 $-排列(空排列),只有一种可能。
根据公式:
(n−1+1)!n!=n!n!=1 \frac{(n - 1 + 1)!}{n!} = \frac{n!}{n!} = 1 n!(n1+1)!=n!n!=1
即空子数组包含空排列的概率为 1,成立。
不变式在初始时成立。


2. 保持(Maintenance):
假设在第 $ i $ 次迭代前,不变式成立:
每个 $ (i-1) $-排列出现在 $ A[1…i-1] $ 的概率为 $ \frac{(n-i+1)!}{n!} $。

现在分析第 $ i $ 次迭代后,某个特定的 $ i $-排列 $ \langle x_1, x_2, \dots, x_i \rangle $ 出现在 $ A[1…i] $ 的概率。

令:

  • $ E_1 $:前 $ i-1 $ 次迭代使 $ A[1…i-1] $ 恰好为 $ \langle x_1, \dots, x_{i-1} \rangle $
  • $ E_2 $:第 $ i $ 次迭代将 $ x_i $ 放入 $ A[i] $

我们要求事件 $ E_1 \cap E_2 $ 的概率。

由条件概率公式:
Pr⁡{E1∩E2}=Pr⁡{E2∣E1}⋅Pr⁡{E1} \Pr\{E_1 \cap E_2\} = \Pr\{E_2 \mid E_1\} \cdot \Pr\{E_1\} Pr{E1E2}=Pr{E2E1}Pr{E1}

  • $ \Pr{E_1} = \frac{(n-i+1)!}{n!} $(由归纳假设)
  • $ \Pr{E_2 \mid E_1} = \frac{1}{n-i+1} $:因为在第 $ i $ 步,算法从 $ A[i…n] $ 的 $ n-i+1 $ 个元素中均匀随机选择一个与 $ A[i] $ 交换,因此每个元素(包括 $ x_i $)被选中的概率为 $ \frac{1}{n-i+1} $

代入得:
Pr⁡{E1∩E2}=1n−i+1⋅(n−i+1)!n!=(n−i)!n! \Pr\{E_1 \cap E_2\} = \frac{1}{n-i+1} \cdot \frac{(n-i+1)!}{n!} = \frac{(n-i)!}{n!} Pr{E1E2}=ni+11n!(ni+1)!=n!(ni)!

这正是第 $ i+1 $ 次迭代前不变式所要求的概率(将 $ i $ 替换为 $ i+1 $)。

不变式在每次迭代后仍成立。


3. 终止(Termination):
当循环结束时,$ i = n+1 $,子数组 $ A[1…n] $ 是整个数组。

根据不变式,每一个 $ n $-排列(即完整排列)出现的概率为:
(n−(n+1)+1)!n!=0!n!=1n! \frac{(n - (n+1) + 1)!}{n!} = \frac{0!}{n!} = \frac{1}{n!} n!(n(n+1)+1)!=n!0!=n!1

共有 $ n! $ 个排列,每个概率为 $ \frac{1}{n!} $,说明所有排列等可能。


结论:
过程 RANDOMIZE-IN-PLACE 产生一个均匀随机排列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值