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{E1∩E2∩E3∩⋯∩En−1∩En}
根据条件概率的链式法则,有:
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=1⋂nEi}=Pr{E1}⋅Pr{E2∣E1}⋅Pr{E3∣E1∩E2}⋯Pr{En∣E1∩⋯∩En−1}
下面我们逐项分析每一项的概率。
-
$ \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{E2∣E1}=n−11 -
一般地,对于 $ 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{Ei∣E1∩E2∩⋯∩Ei−1}=n−i+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{E1∩E2∩⋯∩En}=n1⋅n−11⋅n−21⋯21⋅11=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!(n−i+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!(n−1+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{E1∩E2}=Pr{E2∣E1}⋅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{E1∩E2}=n−i+11⋅n!(n−i+1)!=n!(n−i)!
这正是第 $ 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 产生一个均匀随机排列。

被折叠的 条评论
为什么被折叠?



