前置知识:[随机函数](../misc/random.md)和[概率初步](../math/expectation.md)
-æ\9c¬æ\96\87å°\86对 OI/ICPC ä¸ç\9a\84é\9a\8fæ\9cºå\8c\96ç\9b¸å\85³æ\8a\80å·§å\81\9aä¸\80个ç®\80å\8d\95ç\9a\84å\88\86ç±»ï¼\8c并对æ¯\8f个å\88\86ç±»äº\88以ä»\8bç»\8dã\80\82æ\9c¬æ\96\87ä¹\9få°\86ä»\8bç»\8dä¸\80äº\9bå\9c¨ OI/ICPC ä¸å°\9aæ\9cªä½¿ç\94¨ï¼\8cä½\86ä¸\8e OI/ICPC å\9c¨é£\8eæ ¼ç\89æ\96¹é\9d¢è¾\83为贴è¿\91ç\9a\84æ\8a\80å·§,这些内容前将用 `*` 标注。
+æ\9c¬æ\96\87å°\86对 OI/ICPC ä¸ç\9a\84é\9a\8fæ\9cºå\8c\96ç\9b¸å\85³æ\8a\80å·§å\81\9aä¸\80个ç®\80å\8d\95ç\9a\84å\88\86ç±»ï¼\8c并对æ¯\8f个å\88\86ç±»äº\88以ä»\8bç»\8dã\80\82æ\9c¬æ\96\87ä¹\9få°\86ä»\8bç»\8dä¸\80äº\9bå\9c¨ OI/ICPC ä¸å¾\88å°\91使ç\94¨ï¼\8cä½\86ä¸\8e OI/ICPC å\9c¨é£\8eæ ¼ç\89æ\96¹é\9d¢è¾\83为贴è¿\91ç\9a\84æ\96¹æ³\95,这些内容前将用 `*` 标注。
-这一分类并不代表广泛共识,或许也并不能囊括所有可能性,因此仅供参考。
+这一分类并不代表广泛共识,也并不能囊括所有可能性,因此仅供参考。
**记号和约定** :
- $\mathrm{Pr}[A]$ 表示事件 $A$ 发生的概率。
- $\mathrm{E}[X]$ 表示随机变量 $X$ 的期望。
-## 随机化用于非完美算法
+## 用随机元素命中目标集合
-随机化被广泛应用于 OI 中各种骗分、偷懒的场景下。在这种场景下,随机化的作用通常包括:
+### 例: [Gym 101550I](https://codeforces.com/gym/101550/attachments)
-- 防止被出题人用针对性数据卡掉。例如在搜索时随机打乱邻居的顺序。
+### 例: [CSES 1685 New Flight Routes](https://cses.fi/problemset/task/1685)
+
+## 用随机集合覆盖目标元素
+
+### 例:三部图的判定
+
+### 例: [CodeChef SELEDGE](https://www.codechef.com/problems/SELEDGE)
+
+## 用随机化获得随机数据的性质
+
+### 例:随机增量法
+
+随机生成的元素序列可能具有“前缀最优解变化次数期望下很小”等性质,而随机增量法就通过随机打乱输入的序列来获得这些性质。
+
+详见 [随机增量法](../geometry/random-incremental.md) 。
+
+### 例: [TopCoder MagicMolecule](https://community.topcoder.com/stat?c=problem_statement&pm=11705) 随机化解法
+
+## 随机化用于哈希
+
+### 例: [UOJ #207 共价大爷游长沙](https://uoj.ac/problem/207)
+
+### 例: [CodeChef PANIC](https://www.codechef.com/problems/PANIC)
+
+### 例: [UOJ #552 同构判定鸭](https://uoj.ac/problem/552) 及其错误率分析
+
+???+ note "(\*)Schwartz-Zippel 引理"
+ To be written
+
+### 例:(\*)子矩阵不同元素个数
+
+???+ note "问题"
+ 给定 $n\times m$ 的矩阵, $q$ 次询问一个连续子矩阵中不同元素的个数,要求在线算法。
+
+ 允许 $\epsilon$ 的相对误差和 $\delta$ 的错误率,换句话说,你要对至少 $(1-\delta)q$ 个询问给出离正确答案相对误差不超过 $\epsilon$ 的回答。
+
+ $n\cdot m\leq 2\cdot10^5;q\leq 10^6;\epsilon=0.5,\delta=0.2$
+
+??? "解法"
+ 引理:令 $X_{1\cdots k}$ 为独立的随机变量,且取值在 $[0,1]$ 中均匀分布,则 $\mathrm{E}\big[\min\limits_i X_i\big]=\dfrac 1{k+1}$ 。
+
+ - 证明:考虑一个单位圆,其上分布着 **相对位置** 均匀随机的 $k+1$ 个点,分别在位置 $0,X_1,X_2,\cdots,X_k$ 处。那么 $\min\limits_i X_i$ 就等于 $k+1$ 段空隙中特定的一段的长度。而因为这些空隙之间是“对称”的,所以其中任何一段特定空隙的期望长度都是 $\dfrac 1{k+1}$ 。
+
+ 我们取 $k$ 为不同元素的个数,并借助上述引理来从 $\min\limits_i X_i$ 反推得到 $k$ 。
+
+ 考虑采用某个哈希函数,将矩阵中每个元素都均匀、独立地随机映射到 $[0,1]$ 中的实数上去,且相等的元素会映射到相等的实数。这样的话,一个子矩阵中的所有元素对应的那些实数,在去重后就恰好是先前的集合 $\{X_1,\cdots,X_k\}$ 的一个实例,其中 $k$ 等于子矩阵中不同元素的个数。
+
+ 于是我们得到了算法:
+
+ 1. 给矩阵中元素赋 $[0,1]$ 中的哈希值。为保证随机性,哈希函数可以直接用 `map` 和随机数生成器实现,即每遇到一个新的未出现过的值就给它随机一个哈希值。
+ 2. 回答询问时设法求出子矩阵中哈希值的最小值 $M$ ,并输出 $\dfrac 1M-1$ 。
+
+ 然而,这个算法并不能令人满意。它的输出值的期望是 $\mathrm{E}\Big[\dfrac 1{\min\limits_i X_i}-1\Big]$ ,但事实上这个值并不等于 $\dfrac 1{\mathrm{E}\big[\min\limits_i X_i\big]}-1=k$ ,而(可以证明)等于 $\infty$ 。
+
+ 也就是说,我们不能直接把 $\min\limits_i X_i$ 的单次取值放在分母上,而要先算得这个式子的期望,再把期望值放在分母上。
+
+ 怎么算期望值呢?多次随机取平均!
+
+ 我们用 $C$ 组不同的哈希函数分别执行前述过程,回答询问时计算出 $C$ 个不同的 $M$ 值,并算出其平均数 $\overline M$ ,然后输出 $\big(\overline M\big)^{-1}-1$ 。
+
+ 实验发现取 $C\approx 80$ 即可满足要求。严格证明十分繁琐,在此略去。
+
+ 最后,怎么求子矩阵最小值?用二维 S-T 表即可,预处理 $O(nm\log n\log m)$ ,回答询问 $O(1)$ 。
+
+## 随机化在算法中的其他应用
+
+随机化的其他作用还包括:
+
+- 防止被造数据者用针对性数据卡掉。例如在搜索时随机打乱邻居的顺序。
- 保证算法过程中进行的“操作”具有(某种意义上的)均匀性。例如 [模拟退火](../misc/simulated-annealing.md) 算法。
+在这些场景下,随机化常常(但并不总是)与乱搞、骗分等做法挂钩。
+
### 例:[「TJOI2015」线性代数](https://loj.ac/problem/2100)
-本题的标准算法是网络流,但这里我们采取这样的做法:
+本题的标准算法是网络流,但这里我们采取这样的乱搞做法:
- 每次随机一个位置,把这个位置取反,判断大小并更新答案。
}
```
-### 例:用随机化实现可并堆
+### 例:(\*)随机堆
可并堆最常用的写法应该是左偏树了,通过维护树高让树左偏来保证合并的复杂度。然而维护树高有点麻烦,我们希望尽量避开。
-那么可以考虑使用极其难卡的随机堆,即不按照树高来交换儿子,而是随机交换。
+那么可以考虑使用随机堆,即不按照树高来交换儿子,而是随机交换。
??? note "代码"
```cpp
void pop(int &now) { now = merge(nd[now].child[0], nd[now].child[1]); }
```
+???+ note "期望复杂度的证明"
+ To be written
+
## 与随机性有关的证明技巧
以下列举几个比较有用的技巧。
### 概率上界的分析
-随机算法的正确性或复杂度经常依赖于某些“坏事件”不发生或很少发生。例如,快速排序的复杂度依赖于“所选的 `pivot` 元素恰好是最小或最大元素”这一坏事件较少发生。本节介绍几个常用于分析“坏事件”发生概率的工具。
+随机算法的正确性或复杂度经常依赖于某些“坏事件”不发生或很少发生。例如,快速排序的复杂度依赖于“所选的 `pivot` 元素恰好是最小或最大元素”这一坏事件较少发生。
+
+本节介绍几个常用于分析“坏事件”发生概率的工具。
#### 工具
- **Union Bound** :记 $A_{1\cdots m}$ 为坏事件,则
+**Union Bound** :记 $A_{1\cdots m}$ 为坏事件,则
- $$
- \mathrm{Pr}\Big[\bigcup\limits_{i=1}^m A_i \Big]\leq \sum\limits_{i=1}^m \mathrm{Pr}[A_i]
- $$
+$$
+\mathrm{Pr}\Big[\bigcup\limits_{i=1}^m A_i \Big]\leq \sum\limits_{i=1}^m \mathrm{Pr}[A_i]
+$$
- 即:坏事件中至少一者发生的概率,不超过每一个的发生概率之和。
- 证明:回到概率的定义,把事件看成单位事件的集合,发现这个结论是显然的。
- ……
- 随着层数越来越多,交替出现的上界和下界也越来越紧。这一系列结论形式上类似容斥原理,证明过程也和容斥类似,这里略去。
-**自然常数的使用** : $\Big(1-\dfrac 1n\Big)^n\leq \dfrac 1e,\forall n\geq0$
+**自然常数的使用** : $\Big(1-\dfrac 1n\Big)^n\leq \dfrac 1e,\forall n\geq1$
-- 左式关于 $n\geq 0$ 单调递增且在 $+\infty$ 处的极限是 $\dfrac 1e$ ,因此有这个结论。
+- 左式关于 $n\geq 1$ 单调递增且在 $+\infty$ 处的极限是 $\dfrac 1e$ ,因此有这个结论。
- 这告诉我们,如果 $n$ 个独立的坏事件,每个的发生概率为 $1-\dfrac 1n$ ,则它们全部发生的概率至多为 $\dfrac 1e$ 。
-**(\*) Hoeffding** 不等式:若 $X_{1\cdots n}$ 为互相独立的实随机变量且 $X_i\in [a_i,b_i]$ ,记随机变量 $X:=\sum\limits_{i=1}^n X_i$ ,则
+**(\*) Hoeffding** 不等式:若 $X_{1\cdots n}$ 为互相独立的实随机变量且 $X_i\in [a_i,b_i]$ ,记随机变量 $X:=\sum\limits_{i=1}^n X_i$ ,则
$$
\mathrm{Pr}\Big[\big|X-\mathrm{E}[X]\big|\geq t\Big]\leq2\exp {-\dfrac {t^2}{\sum\limits_{i=1}^n (b_i-a_i)^2}}
$$
-- è¿\99ä¸\80ä¸\8dç\89å¼\8fé\99\90å\88¶äº\86é\9a\8fæ\9cºå\8f\98é\87\8få\81\8f离å\85¶æ\9c\9fæ\9c\9bå\80¼ç\9a\84ç¨\8b度ã\80\82ä»\8eç»\8féª\8cä¸\8a讲ï¼\8cå¦\82æ\9e\9c $\mathrm{E}[X]$ ä¸\8d太æ\8e¥è¿\91 $a_1+\cdots+a_n$ ï¼\8cå\88\99该ä¸\8dç\89å¼\8fç»\99å\87ºç\9a\84ç\95\8cå¾\80å¾\80ç\9b¸å¯¹æ¯\94è¾\83ç´§ï¼\9bå¦\82æ\9e\9cé\9d\9e常æ\8e¥è¿\91ç\9a\84è¯\9dï¼\8cç»\99å\87ºç\9a\84ç\95\8cå\88\99å¾\88æ\9d¾ï¼\8cæ¤æ\97¶æ\9b´å¥½ç\9a\84é\80\89æ\8b©æ\98¯ä½¿ç\94¨ [Chernoff Bound](https://en.jinzhao.wiki/wiki/Chernoff_bound) 。
+- è¿\99ä¸\80ä¸\8dç\89å¼\8fé\99\90å\88¶äº\86é\9a\8fæ\9cºå\8f\98é\87\8få\81\8f离å\85¶æ\9c\9fæ\9c\9bå\80¼ç\9a\84ç¨\8b度ã\80\82ä»\8eç»\8féª\8cä¸\8a讲ï¼\8cå¦\82æ\9e\9c $\mathrm{E}[X]$ ä¸\8d太æ\8e¥è¿\91 $a_1+\cdots+a_n$ ï¼\8cå\88\99该ä¸\8dç\89å¼\8fç»\99å\87ºç\9a\84ç\95\8cå¾\80å¾\80ç\9b¸å¯¹æ¯\94è¾\83ç´§ï¼\9bå¦\82æ\9e\9cé\9d\9e常æ\8e¥è¿\91ç\9a\84è¯\9dï¼\88ä¾\8bå¦\82å\9c¨ [UOJ #72 å\85¨æ\96°å\81\9aæ³\95](https://matthew99.blog.uoj.ac/blog/5511) ä¸ï¼\89ï¼\8cç»\99å\87ºç\9a\84ç\95\8cå\88\99å¾\80å¾\80å¾\88æ\9d¾ï¼\8cæ¤æ\97¶æ\9b´å¥½ç\9a\84é\80\89æ\8b©æ\98¯ä½¿ç\94¨ (\*)[Chernoff Bound](https://en.jinzhao.wiki/wiki/Chernoff_bound) ï¼\8cå®\83å\92\8c Hoeffding ä¸\8dç\89å¼\8få\90\8cå±\9eäº\8e (\*)[Concentration Inequality](https://en.wikipedia.org/wiki/Concentration_inequality) 。
#### 例子
???+ note "例:抽奖问题"
一个箱子里有 $n$ 个球,其中恰有 $k$ 个球对应着大奖。你要进行若干次独立、等概率的随机抽取,每次抽完之后会把球放回箱子。请问抽多少次能保证以至少 $1-\epsilon$ 的概率,满足 **每一个** 奖球都被抽到至少一次?
+与该问题类似的模型经常出现在随机算法的复杂度分析中。
+
??? note "解答"
假如只有一个奖球 ,则抽取 $M:=-n\log\epsilon$ 次即可保证,因为 $M$ 次全不中的概率 $\Big(1-\dfrac 1n\Big)^{n\cdot (-\log\epsilon)}\leq e^{\log\epsilon}=\epsilon$ 。
现在有 $k>1$ 个奖球,那么根据 Union Bound ,我们只需保证每个奖球被漏掉的概率都不超过 $\dfrac \epsilon k$ 即可。于是答案是 $-n\log\dfrac \epsilon k$ 。
-???+ note "例:随机选取一半元素"
+???+ note "例:(\*)随机选取一半元素"
给出一个算法,从 $n$ 个元素中等概率随机选取一个大小为 $\dfrac n2$ 的子集,保证 $n$ 是偶数。你能使用的唯一的随机源是一枚均匀硬币,同时请你尽可能减少抛硬币的次数。
??? note "解法"
另一个算法:
- 我们可以通过抛期望 $2\lceil\log_2 n\rceil$ 次硬币来实现随机 $n$ 选 1 。
- - 具体方法:随机生成 $\lceil\log_2 n\rceil$ 位的 2 进制数,如果大于等于 $n$ 则重新随机,否则选择对应编号(编号从 0 开始)的元素并结束过程。
+ - 具体方法:随机生成 $\lceil\log_2 n\rceil$ 位的二进制数,如果大于等于 $n$ 则重新随机,否则选择对应编号(编号从 0 开始)的元素并结束过程。
- 然后我们从所有元素中选一个,再从剩下的元素中再选一个,以此类推,直到选出 $\dfrac n2$ 个元素为止。
这一算法期望需要抛 $n\lceil\log_2 n\rceil$ 次硬币。
尝试分析第二步所需的操作次数:
- - 记 01 随机变量 $X_i$ 表示 $i$ 是否被选入初始的子集,令 $X:=X_1+\cdots+X_n$ 表示子集大小,则第二步所需的操作次数等于 $\big|X-\mathrm{E}[X]\big|$ 。在 Hoeffding 不等式中取 $t=c\cdot\sqrt n$ (其中 $c$ 为任意常数),得到 $\mathrm{Pr}\Big[\big|X-\mathrm{E}[X]\big|\geq t\Big]\leq 2e^{-c^2}$ 。也就是说,我们可以通过允许 $\Theta(\sqrt n)$ 级别的偏移,来得到任意小的常数级别的失败概率。
+ - 记 01 随机变量 $X_i$ 表示 $i$ 是否被选入初始的子集,令 $X:=X_1+\cdots+X_n$ 表示子集大小,则第二步所需的操作次数等于 $\big|X-\mathrm{E}[X]\big|$ 。在 Hoeffding 不等式中取 $t=c\cdot\sqrt n$ (其中 $c$ 为任意常数),得到 $\mathrm{Pr}\Big[\big|X-\mathrm{E}[X]\big|\geq t\Big]\leq 2e^{-c^2}$ 。也就是说,我们可以通过允许 $\Theta(\sqrt n)$ 级别的偏移,来得到任意小的常数级别的失败概率。(注意到这并不一定说明偏移量的期望值就是 $\Theta(\sqrt n)$ )
至此我们已经基本能够确信,第二步的操作次数应该不是瓶颈,该算法的期望抛硬币次数应该是 $n+o(n)$ 。
??? mdui-shadow-6 "闲得无聊想算精确的式子"
尝试用 Hoeffding 不等式求第二步中操作次数期望值的上界:
+
$$
E\Big[\big|X-E[X]\big|\Big]=\int\limits_0^\infty \mathrm{Pr}\Big[\big|X-\mathrm{E}[X]\big|\geq t\Big]\mathrm{d}t\leq2\int\limits_0^\infty \exp {-\dfrac {t^2}n}\mathrm{d}t=\sqrt{\pi n}
$$
最后,我们枚举所有可能的局面(即已经拥有的元素集合),算出这种局面出现的概率(已有元素的排列方案数除以总方案数),乘上当前局面最优决策的代价(由拥有元素个数和剩余物品总价确定),再加起来即可。这个过程可以用背包式的DP优化,即可通过本题。
-**小结** :可以看到,耦合的技巧在本题中使用了两次。第一次是在证明过程中,令两个随机过程使用同一个随机源;第二次是把购买转化成随机购买(即引入随机源),从而使得购买和抽取这两种操作实质上“耦合”为同一种操作(即令抽取和购买操作共享一个随机源)。
\ No newline at end of file
+**小结** :可以看到,耦合的技巧在本题中使用了两次。第一次是在证明过程中,令两个随机过程使用同一个随机源;第二次是把购买转化成随机购买(即引入随机源),从而使得购买和抽取这两种操作实质上“耦合”为同一种操作(即令抽取和购买操作共享一个随机源)。
+
+## 参考资料
+
+[Anna Gambin and Adam Malinowski, Randomized Meldable Priority Queues](https://www.researchgate.net/publication/2801527_Randomized_Meldable_Priority_Queues)
\ No newline at end of file