OSDN Git Service

feat(random-incremental.md,rand-technique.md)
authorTianyi Qiu <gordanqiu@outlook.com>
Wed, 4 Nov 2020 03:24:33 +0000 (11:24 +0800)
committerTianyi Qiu <gordanqiu@outlook.com>
Wed, 4 Nov 2020 03:24:33 +0000 (11:24 +0800)
docs/geometry/random-incremental.md
docs/misc/rand-technique.md
mkdocs.yml

index 4933fae..692efdc 100644 (file)
@@ -1,4 +1,4 @@
-author: Ir1d
+author: Ir1d, TianyiQ
 
 ## 简介
 
@@ -30,7 +30,7 @@ $$
 
 遍历完所有点之后,所得到的圆就是覆盖所有点得最小圆。
 
- **时间复杂度**  $O(n)$ 
+ **时间复杂度**  $O(n)$ ,证明详见参考资料。
 
  **空间复杂度**  $O(n)$ 
 
@@ -112,10 +112,15 @@ $$
 
  [「HNOI2012」射箭](https://www.luogu.com.cn/problem/P3222) 
 
-## 参考资料
+ [CodeForces 442E](https://codeforces.com/problemset/problem/442/E)
+
+
+## 参考资料与扩展阅读
 
  <http://www.doc88.com/p-007257893177.html> 
 
  <https://www.cnblogs.com/aininot260/p/9635757.html> 
 
  <https://wenku.baidu.com/view/162699d63186bceb19e8bbe6.html> 
+
+ <https://blog.csdn.net/u014609452/article/details/62039612>
\ No newline at end of file
index 6b1cbe3..7aaa243 100644 (file)
@@ -4,25 +4,95 @@ author: Ir1d, partychicken, ouuan, Marcythm, TianyiQ
 
 前置知识:[随机函数](../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) 
 
-本题的标准算法是网络流,但这里我们采取这样的做法:
+本题的标准算法是网络流,但这里我们采取这样的乱搞做法:
 
 -  每次随机一个位置,把这个位置取反,判断大小并更新答案。
 
@@ -65,11 +135,11 @@ author: Ir1d, partychicken, ouuan, Marcythm, TianyiQ
     }
     ```
 
-### 例:用随机化实现可并
+### 例:(\*)随机
 
 可并堆最常用的写法应该是左偏树了,通过维护树高让树左偏来保证合并的复杂度。然而维护树高有点麻烦,我们希望尽量避开。
 
-那么可以考虑使用极其难卡的随机堆,即不按照树高来交换儿子,而是随机交换。
+那么可以考虑使用随机堆,即不按照树高来交换儿子,而是随机交换。
 
 ??? note "代码"
     ```cpp
@@ -89,6 +159,9 @@ author: Ir1d, partychicken, ouuan, Marcythm, TianyiQ
     void pop(int &now) { now = merge(nd[now].child[0], nd[now].child[1]); }
     ```
 
+???+ note "期望复杂度的证明"
+    To be written
+
 ## 与随机性有关的证明技巧
 
 以下列举几个比较有用的技巧。
@@ -97,15 +170,17 @@ author: Ir1d, partychicken, ouuan, Marcythm, TianyiQ
 
 ### 概率上界的分析
 
-随机算法的正确性或复杂度经常依赖于某些“坏事件”不发生或很少发生。例如,快速排序的复杂度依赖于“所选的 `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]
+$$
 
 -  即:坏事件中至少一者发生的概率,不超过每一个的发生概率之和。
 -  证明:回到概率的定义,把事件看成单位事件的集合,发现这个结论是显然的。
@@ -115,30 +190,32 @@ author: Ir1d, partychicken, ouuan, Marcythm, TianyiQ
     -  ……
     -  随着层数越来越多,交替出现的上界和下界也越来越紧。这一系列结论形式上类似容斥原理,证明过程也和容斥类似,这里略去。
 
-**自然常数的使用** : $\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 "解法"
@@ -153,7 +230,7 @@ $$
     另一个算法:
 
     - 我们可以通过抛期望 $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$ 次硬币。
@@ -166,12 +243,13 @@ $$
 
     尝试分析第二步所需的操作次数:
 
-    - 记 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}
         $$
@@ -251,4 +329,8 @@ $$
 
 最后,我们枚举所有可能的局面(即已经拥有的元素集合),算出这种局面出现的概率(已有元素的排列方案数除以总方案数),乘上当前局面最优决策的代价(由拥有元素个数和剩余物品总价确定),再加起来即可。这个过程可以用背包式的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
index 4919332..6e93113 100644 (file)
@@ -401,7 +401,7 @@ nav:
     - 分数规划: misc/frac-programming.md
     - 随机化:
       - 随机函数: misc/random.md
-      - 随机化常见技巧: misc/rand-technique.md
+      - 随机化技巧: misc/rand-technique.md
       - 爬山算法: misc/hill-climbing.md
       - 模拟退火: misc/simulated-annealing.md
     - 悬线法: misc/hoverline.md