
简介《The Probabilistic Method》第三版PDF面向数学、理论计算机科学及组合优化方向的研究生与研究人员系统讲解如何借助概率模型与随机化论证证明存在性结论适用于图论、复杂性理论、编码与算法分析等场景。压缩包仅含1个PDF文件大小约7.77MB为Wiley-Interscience系列英文原版教材便于在电脑或平板上检索与研读。内容围绕随机化证明、二项式系数与组合恒等式、大数定律和中心极限定理展开并延伸到Ramsey数、边色数、纠错码、随机算法平均性能及Lovász局部引理、零一法律等主题书中以概率方法处理传统构造性手段难以奏效的问题强调平均行为分析并配合清晰阐述与实例帮助读者掌握非构造性证明思路。已有150人学习适合具备概率论、图论和线性代数基础、希望拓宽研究视野的读者查阅参考。1. 概率方法到底在做什么先给一句能记住的定义想证明“世界上存在一只黑天鹅”最直接的路是跑到湖边拍张照片可湖太大、你根本走不完。还有另一条路假设湖里所有天鹅都是白的算出“随手捞一只恰好是白的”这个概率发现它严格小于 1——于是黑天鹅必然存在哪怕你一只都没抓到。概率方法The Probabilistic Method干的就是这件事它不把目标结构一个个造出来而是把所有可能的结构摊成一个概率空间证明“随机挑一个恰好满足要求”的概率大于零从而断定这样的结构一定存在。这本第三版教材把它拆成两半前半讲工具——期望、方差、局部引理、鞅与集中不等式后半讲战场——随机图与相变、电路复杂度、偏差理论、几何、编码与熵、去随机化、图性质测试。它之所以值得搞懂是因为很多“构造不出来但又确实存在”的结论只有这条路走得通。2. 为什么“随机”就能证明“必然”基本方法的三步骨架初次接触的人几乎都会卡在同一个疑问上随机的东西凭什么叫证明这背后其实是一个很朴素的逻辑——如果一件事发生的概率严格大于零那它就一定存在至少一个实例。你要的不是“找出它”而是“确认它没被排除干净”。这套思路在组合数学里被反复使用原因是组合对象的数量往往大到无法枚举而概率恰好是处理“海量可能性”的天然语言。2.1 造空间、算概率、取正数基本方法的骨架只有三步但每一步都有讲究。第一步是造空间把你想证明存在的那类结构全部放进一个概率模型里让每个结构都有一个被抽中的概率。第二步是算概率在这个模型里算出“抽到的结构满足目标性质”这件事的概率。第三步是取正数只要这个概率大于零就说明满足性质的结构至少有一个。听起来简单得过分难点全在第二步。因为目标性质通常是一个“全称命题”——比如“不存在某个坏子结构”直接算它的概率几乎不可能。于是实际操作中大家不会正面硬算而是绕到反面算“存在坏子结构”的概率再证明它小于 1。这个“小于 1”就是全部的胜负手。举个书里的经典场景。给一张有 n 个顶点的完全图的每条边随机染成红或蓝问能不能保证一定没有单色的 K_kk 个顶点之间所有边同色一张图的染色方案有 2 的指数多次方种逐个检查是天方夜谭。但换成概率语言就轻松了固定 k 个顶点它们之间所有边同色的概率是 2 乘以 2 的负 k(k-1)/2 次方这样的顶点组一共有 C(n,k) 个于是“至少存在一个单色 K_k”的概率不超过二者相乘。只要这个乘积小于 1就存在一种染色方案完全没有单色 K_k。这里藏着一个非常关键的思维转向你要证明的不是“随机染色一定好”而是“随机染色不至于全军覆没”。全军覆没才需要每条路都坏而概率计算告诉你坏路占不满。2.2 线性期望把整体拆成一个个小事件上一步用的是“坏事件的并集概率上界”属于最粗的一把锤子。更精细的工具是期望。期望有个几乎不讲道理的好性质它永远可以拆。不管这些小事件之间怎么纠缠、怎么相关整体的期望等于每个小事件期望的和。这条性质被称为线性期望是整个方法里最耐用的一条。举个通俗的例子。一个班随机点名 30 个人去搬书问平均有多少人会被点到两次以上你不需要知道点名结果的具体分布只需要对每个人算一下“被点到两次以上”的概率再乘以人数。相关性再复杂也不影响这个加法。线性期望常常能直接给出存在性如果某个量的期望是 M那么必然存在一个实例它的取值不超过 M否则所有实例都大于 M平均值就大于 M 了。这一步不需要任何集中不等式也不需要独立性。代价是结论比较弱——它只保证“存在一个不太差”不保证“绝大多数都不差”。所以在书的前几章里线性期望承担的是“打开局面”的角色先证明存在一个还行的结构再用别的手段把它修剪得更好。这种“先给个粗糙的存在性再优化”的流程是后面所有高级工具的共同起点。提示线性期望不需要独立性这一点经常被忽略。很多人一看到“期望可加”就下意识去检查独立其实只有算方差、算乘积的期望时才需要。2.3 修正法先造一个差不多的再把坏的部分剪掉纯粹靠概率给出的存在性往往是“平均水平的烂”。修正法Alterations的思路很务实先随机构造一个东西它大概率只坏了少数几个地方然后把这些坏地方一个个修掉看修完之后还剩多少。这个思路的妙处在于它把“造一个完美的”换成了“造一个接近完美的再付一点修补费”。在双色完全图的下界估计里随机构造会留下一些单色团你把每个单色团里的一个顶点删掉剩下的图就干净了。删掉的顶点数是可控的于是最终得到一个更大的、可以保证无单色团的规模下界。这类论证在组合几何、集合系、编码构造里反复出现。它的思维方式和工程里的“先做出来再修 bug”很像不追求一次到位而是接受一个有缺陷的中间产物把缺陷量化为可以补偿的成本。很多看起来需要精巧构造的结论用这条路反而更快。代价是结论会打折扣。你损失了被剪掉的那部分所以最终数字不如理想中漂亮。但只要剪掉的量相对整体很小这个折扣是值得的。书里很多下界都是这么一点点抠出来的。2.4 用十行代码验证一次随机染色的下界概念听过一遍容易飘跑一遍会踏实很多。下面这段代码不证明任何定理它只是把上面的概率计算“翻译”成可观察的随机实验帮你建立直觉。import random from itertools import combinations def random_coloring(n): # 用字典存边 (i, j) 的颜色0 表示红1 表示蓝 return {(i, j): random.randint(0, 1) for i in range(n) for j in range(i 1, n)} def has_mono_clique(coloring, n, k): # 枚举所有 k 元顶点子集检查内部所有边是否同色 for verts in combinations(range(n), k): colors {coloring[(a, b)] for a, b in combinations(verts, 2)} if len(colors) 1: return True return False def estimate(n, k, trials1000): # trials 越大估计越稳n 越大单次检查越慢 hits sum(has_mono_clique(random_coloring(n), n, k) for _ in range(trials)) return hits / trials print(estimate(n10, k4, trials2000))这段代码有三处值得看。第一random_coloring里每条边的颜色是独立抽的这正是概率模型本身第二has_mono_clique用的判定方式是“全称检查”它对应理论上要算的那个坏事件第三estimate返回的是频率它只是对概率的近似不是证明。参数方面n是图的顶点数k是你盯的单色团大小trials是重复次数。把k调大你会发现单色团出现的频率迅速掉下去——这就是理论上那个“概率小于 1”的直观来源。但要清楚跑一万次得到零次命中也不能推出“概率为零”只能说明这个概率小。概率方法和模拟实验的分界线就在这里后面第 5 章会专门讲。3. 从期望到方差第二矩方法在管什么期望只描述“平均水平”而平均水平是会骗人的。一个随机变量可以期望为零却几乎总是取很大的正值或很大的负值只要两者抵消。存在性论证里这种情况很致命你算出期望很小就想说“所以存在一个小的”但万一它其实是“一半极大一半为零”呢这时候需要第二个数字——方差来管住波动。3.1 方差出现的位置围绕均值的集中程度方差衡量的是随机变量偏离期望的程度。方差小说明取值紧贴平均值方差大说明取值飘。第二矩方法的核心动作就是用方差去证明“这个量大概率落在均值附近”从而把“平均值好”升级为“大部分实例都好”。这个升级很值钱。因为一旦你知道某个性质在绝大多数实例上成立你就同时得到了两样东西存在性自然成立以及一个可以反复使用的结构性结论。很多关于随机图、随机矩阵、随机赋值的定理都是这么来的。代价是计算量陡增。算方差需要处理两两之间的相关性也就是说你要对每一对小事件估计它们“同时发生”的概率。这个量在事件互相独立时等于概率之积但在组合结构里几乎从不独立。第二矩方法的全部技术难度都花在证明“相关性虽然存在但小到可以忽略”上。通俗地说第一矩是“看平均分”第二矩是“看分数有多集中”。只看平均分你没法判断这个班是真的整体不错还是一个满分拖着一群零分。3.2 固定套路先算两项再卡一个阈值第二矩方法的操作流程高度模板化几乎可以背下来。第一步定义你要数的量通常是某个坏结构的个数。第二步算出它的期望。第三步算出它的方差或者等价的二阶矩。第四步套一个集中不等式得到“这个量偏离期望超过某个阈值”的概率上界。第五步让这个上界小于 1得到结论。真正决定成败的是第三步。算方差时会出现形如“两个坏结构同时存在”的项你需要对每一对结构判断它们是否“足够独立”。如果两个坏结构共享了大量顶点或边它们就高度相关这一项就消不掉如果它们要么完全不重叠、要么重叠极少那相关性就弱可以控制。这套流程在图论里用得极多。比如估计随机图中某种子图的数量、判断某个阈值附近性质是否突变走的都是这条路。它也解释了为什么很多结论只在“足够稀疏”或“足够稠密”的区域成立——在中间地带两个坏结构共享的部分太多方差控制不住。3.3 鞅与大偏差把“大概率”推到“指数小”第二矩给出的通常是多项式级别的概率界也就是“坏事件概率大约是 n 的负若干次方”。这个强度在很多场景下够用但在需要“几乎必然”或者需要同时处理指数多个事件时就不够了。于是书里引入了鞅和大偏差工具。鞅的直观含义是“公平游戏”给定到目前为止的全部信息下一步的期望值等于当前值。它的威力在于即使每一步之间有复杂的依赖关系只要满足这个条件就能推出整体偏离均值的概率随步数指数衰减。这比第二矩强得多因为它不需要逐一检查两两相关性而是用一种“逐层揭露信息”的方式统一处理。大偏差界则更直接它给出一族显式的指数型上界用起来像查表。你只要确认随机变量是若干个“有界且独立”的部分之和就能立刻写下一个形如“偏离超过 t 的概率不超过 2 乘以 e 的负 2t²/总数 次方”的界。这类界在算法分析和随机图里出现频率极高属于必须记住的手册级工具。不过这类工具都有前提要么要求各部分独立要么要求每步的变化幅度有界。前提不满足时硬套得到的界会松到毫无意义。这也是初学者最容易翻车的地方——看到结论漂亮就直接引用忘了检查条件。3.4 什么时候第二矩会失效第二矩不是万能的。它在两类场景下会明显失灵。第一类是“临界区”参数刚好卡在性质突变的边界上此时坏结构的数量和它们的相关性同时变得棘手方差往往和期望同阶集中性彻底崩掉。随机图的相变附近就是典型例子那一带的结论需要更精细的分支过程分析而不是简单的矩计算。第二类是“全局性性质”。第二矩擅长处理“数一数有多少个局部坏结构”这类问题但对“整个图是否连通”“是否存在一条贯穿的路径”这种需要全局协调的性质局部计数帮不上忙。这时候需要换工具比如探索过程、分支过程近似或者把问题拆成前后两半分别处理。识别失效信号有个实用办法如果你算出的方差和期望的平方同阶说明波动和均值一样大集中不等式给不出任何有用信息。这时候别硬凑换路子。4. 局部引理与集中不等式坏事件纠缠在一起怎么办前面几章的坏事件要么是“只有一个”要么是“彼此几乎不沾边”。可现实里的组合结构很少这么干净一个坏事件成立往往会牵动周围一大片。局部引理就是为这种“坏事件互相纠缠但纠缠得有限”的局面准备的。4.1 局部引理在说什么依赖有限就够了局部引理的核心结论可以这样通俗理解假设你有一堆坏事件每个坏事件发生的概率都很小并且每个坏事件只与有限个其他坏事件“有牵连”那么只要这个牵连数量和单个概率的乘积足够小所有坏事件同时不发生的概率就严格大于零。关键在于它不要求独立。传统概率论里想算“所有坏事件都不发生”最省事的办法是假设它们互相独立然后把概率乘起来。可组合结构里这个假设几乎总是不成立。局部引理说的是你不需要独立你只需要“局部有限”——每个事件只跟很少几个事件有关剩下的隔得远影响可以忽略。打个比方。一栋楼里每个房间都可能出问题但每个房间的问题只影响隔壁几间不会传到十层之外。那么只要单间出问题的概率够低、隔壁数量够少整栋楼同时平安的概率就是正的。你不需要假设每间房完全独立只需要承认影响是局部的。4.2 三个参数怎么配概率、依赖度、常数局部引理的使用几乎总是围绕三个量展开。第一个是单个坏事件发生的概率 p。第二个是依赖度 d也就是每个坏事件最多和多少个其他坏事件“有牵连”。第三个是那个决定成败的常数条件通常写成 p 乘以 (d1) 小于某个固定的临界值常见形式是小于 e 的负一次方或者更宽松的 1/4。这三个量构成一个三角制约。p 越小允许的 d 越大d 越小允许的 p 越大。实际做题时通常是先算出 p 和 d然后看乘积够不够小。如果不够就得想办法降低其中一个要么把随机模型调得更稀疏以降低 p要么换个构造方式减少依赖。这里最容易犯的错是低估依赖度。依赖度不是“看起来相关的事件数”而是严格定义下“改变一个随机选择会影响到的事件数”。在图的场景里一条边的颜色改变会影响所有包含这条边的坏结构这个数量常常比直觉大得多。算错了 d整个论证就架空了。4.3 从“存在”到“能找到”算法化那一面局部引理最初是个纯存在性工具只告诉你“这样的结构存在”不告诉你“怎么找到”。后来的发展把它算法化了在某些参数条件下可以通过反复重采样resampling的方式实际构造出满足条件的结构并且期望重采样次数是可控的。这个转变意义很大。存在性证明在数学上很漂亮但对工程没用能实际构造出来才谈得上应用。重采样算法的直觉也很朴素随机生成一个配置如果某个坏事件发生了就把它涉及的那部分随机选择重新抽一遍其他部分保持不变。局部性保证了每次重抽只影响一小片不会把全局搅乱。书里对这部分有专门的讨论也指出了算法化的边界——参数条件比纯存在性版本更严格。也就是说有些结构确实存在但按目前的方法还找不到高效的构造路径。这种“知道有但拿不到”的状态在组合数学里并不罕见。4.4 去随机化把掷硬币换成算条件期望随机方法还有一个绕不开的追问既然结论是确定性的能不能不用随机性就把它证出来去随机化derandomization就是回答这个问题的方向其中最经典的手法是条件期望法。条件期望法的思路是把随机过程一步步拆开本来你要一次性随机决定所有变量现在改成按顺序一个一个决定。每决定一个变量时枚举它的所有取值算出每种取值下目标量的条件期望然后选那个让期望最不坏或最好的取值固定下来。因为一开始的期望是好的而每一步都选不劣于平均的分支走到底就得到一个确定性的好结果。这个过程的代价是计算量。每一步都要枚举所有取值并重算期望如果变量多、取值多开销会爆炸。所以实际使用时要配合小样本空间、成对独立之类的结构把枚举成本压下来。书里专门有一章讲这些技术也是“概率方法”从纯理论走向算法设计的关键接口。5. 最容易搞混的五组概念概率方法的名字里带“概率”天然容易被归到“随机算法”或“统计实验”那一类去。实际上它和这些概念的关系比字面上疏远得多。下面这五组混淆是初学者最常踩的坑。5.1 误区一概率方法是一种随机算法易混点在于两者都用随机性、都谈概率名字还像。之所以容易混是因为很多教材把它们放在同一章里讲读者顺手就归成一类了。区别在于目的完全不同。随机算法是“我要算出一个答案”随机性是手段跑一次可能对可能错靠重复降低错误率。概率方法是“我要证明某个东西存在”随机性只是论证的载体它跑不跑得起来根本不重要重要的是那个概率大于零。前者产出结果后者产出定理。判断办法很简单问一句“这个论证能不能被一个具体构造替代”。如果能那它多半是存在性论证如果替代不了、必须真的掷骰子才能得到答案那才是随机算法。5.2 误区二期望小就等于概率小易混点在于两者都描述“这个量不大”。之所以容易混是因为期望确实常被当作“典型值”来用日常语境里“平均”和“通常”几乎同义。区别在于期望可以被极端值绑架。一个随机变量期望是 1完全可能是“以极小概率取一个极大的值其余时候取 0”。这种情况下“期望小”根本不蕴含“大概率小”。想从期望推到概率中间必须补一个集中性论证而集中性恰恰是最难的部分。判断办法看结论里有没有出现“以高概率”或者“概率至少 1 减去某个量”这类措辞。如果只有期望那就只到期望为止别自己加戏。5.3 误区三局部引理是“独立条件”的弱化版易混点在于两者都在处理“一堆事件同时不发生”的概率。之所以容易混是因为局部引理的结论形式和一串概率相乘很像。区别在于方向反了。独立是最强的假设有了它你可以精确计算联合概率局部引理不是去弱化独立而是彻底绕开独立——它允许事件相关只要相关性是局部的、每个事件牵连的邻居数量有限。换句话说独立是“没有关联”局部引理是“有关联但关联不扩散”。判断办法看你手里的事件是不是“改一个随机选择只影响少数几个事件”。是就用局部引理不是就得换工具。5.4 误区四跑一万次模拟就等于证明了结论易混点在于模拟确实会给出一个频率频率看起来就像概率。之所以容易混是因为模拟的门槛极低写几行代码就能出数给人一种“我已经验证过了”的踏实感。区别在于频率永远只是估计。跑一万次全没命中只能说明概率大概小于万分之一这个量级不能说明概率为零。而存在性证明需要的恰恰是“严格大于零”或者“严格小于一”这种精确的边界判断。模拟能给的是方向感不是结论。判断办法如果你的结论要写进论文或者要用在必须保证正确的地方模拟只能放在前面探路不能放在后面收尾。5.5 误区五相变和零一律意味着“每个随机实例都这样”易混点在于这类结论的措辞往往是“几乎必然”“以概率 1 成立”听起来像“全部”。之所以容易混是因为“几乎”这个词在日常里约等于“基本上就是”。区别在于“几乎必然”是相对于概率模型说的当规模趋于无穷时违反性质的实例所占的比例趋于零。它不排除存在个别例外也不保证你手上这一个实例一定符合。随机图的相变尤其容易被误读——超过阈值后巨型连通分支“几乎必然”出现但具体某一张图长什么样仍然可能完全不同。判断办法看结论里有没有限定“当 n 趋于无穷”。有就是渐近命题别拿它去断言某个具体实例。6. 什么时候该用概率方法什么时候别碰判断要不要用先看你的问题长什么样。如果你要的是“存在一个满足某组约束的结构”而这组约束是局部的、可以逐个检查的概率方法通常很顺手。反过来如果你需要的是精确计数、最优构造、或者对某个具体实例下结论这条路会很别扭。下面这张表是我自己在读这类材料时用的粗略判断供参考。你面对的问题概率方法合适吗原因证明某类结构在足够大的规模下一定存在合适正概率即存在是最直接的用法估计某个量的下界或上界合适期望加修正法能给出生得出来的界需要实际构造出一个具体实例谨慎只有算法化版本才能落地条件更严需要精确的计数值不合适概率方法给的是界不是精确值约束之间高度全局耦合不合适局部性假设不成立工具用不上参数正好卡在相变临界点谨慎矩方法在临界区普遍失效需要专门分析还有一类情况值得单独提醒当问题规模很小的时候概率方法给的渐近界往往毫无意义。理论上“n 足够大时成立”可你手上只有几十个元素那个“足够大”可能永远达不到。这时候老老实实枚举或者用精确算法比套一个漂亮但空洞的界强得多。我自己就栽过一次。做一个子图筛选的小工具时看到某个下界公式很漂亮直接拿来当阈值用了跑出来的结果和预期差了一大截。回头一查那个界的前提是顶点数远大于某个常数而我的测试数据只有二十几个顶点根本不在适用范围内。翻车的成本不高但那种“公式没错、我用错了”的挫败感挺难忘。从那以后我每次想引用一个渐近结论都强制走一遍三问前提条件满足了没有、规模够不够大、结论是存在性还是构造性。三问过不去就老老实实退回枚举或者模拟。这份第三版教材的价值也在这里它不只是把工具摆出来还把每个工具的前提、失效边界和彼此之间的衔接讲清楚了。前半部分的期望、方差、局部引理、鞅后半部分的随机图、偏差、编码、去随机化构成一条从“证明存在”走到“实际构造”的完整链路。想系统过一遍这套方法完整资料就在手边按自己需要的章节挑着读比从头硬啃效率高得多。希望帮到你。本文还有配套的精品资源点击获取