0%

递推关系与生成函数

递推关系

斐波那契数列通项

俗话说,斐波那契数列的通项是:

$\frac{1}{\sqrt{5}}(\frac{1 + \sqrt{5}}{2})^n - \frac{1}{\sqrt{5}}(\frac{1 - \sqrt{5}}{2})^n (n \geq 0)$

看上去如此玄妙的式子是怎么推出来的呢?

我们都知道,斐波那契数列是:$0,1,1,2,3,5,8,13,21,34,55…$。规律是,从第三项开始,后一项等于前两项之和,即$h_n = h_{n - 1} + h_{n - 2} (n >= 2), h_0 = 0, h_1 = 1$。通过观察,我们发现这个数列增长得十分快,速度似乎和指数函数差不多。因此我们产生了大胆的假设:假设$h_n = a^n$。

由通项公式:$h_n = h_{n - 1} + h_{n - 2}$,$a^n = a^{n - 1}+a^{n - 2}$。由于此时$n\geq2,a_n\neq0$,式子化简为:

$h_n$有多个解,这些解的线性组合同样满足条件。因此可以将解表示为$h_n = c_1(\frac{1 + \sqrt{5}}{2})^n + c_2(\frac{1 - \sqrt{5}}{2})^n$。注意到还有条件$h_0 = 0, h_1 = 1$没有使用。等式有两个,未知数也有两个,因此可以解出$c_1, c_2$来:

解得:

所以就得到了开头说的那个通项公式。

可以发现,解通项公式的过程和求常系数线性微分方程的方法是类似的,碰到一些的问题的处理方式也是类似的。

常系数线性齐次递推关系

通过上述的斐波那契数列的通项的求解,我们已经可以感受到递推关系的解法了。

若某序列$h_i$满足递推关系$h_n = a_1 h_{n - 1} + … + a_k h_{n - k} + b$,其中$a_i,b$可能依赖于$n$,$a_k \neq 0$,则称序列满足k阶线性递推关系。若$b = 0$,则还称它是齐次。若$a_i$都是常数,则称它还是常系数。正如标题所讲,本节讨论常系数线性齐次递推关系

由递推关系得到的方程$x^k = a_1x^{k - 1} + … a_k$被叫做特征方程。特征方程的k个根叫特征根,一个特征根对应一个原递推关系的解。如果p是根,则$p^n$是$h_n$的一个解。如果p是二重根,则$p^n,np^n$是$h_n$的解,依此类推。$h_n$解的最终表达形式是每个特征根对应的解的线性组合。如果此时数列$h_n$有初始值,那么再解个多元一次方程,就可以完全求出$h_n$的通项了。

综上,求常系数线性齐次递推关系就是先解一个一元多次的特征方程,求出数列的表达形式,才根据初始条件解一个多元一次方程,得到数列的通项。

常系数线性非齐次递推关系

由于特征方程有多个根,因此递推关系有多个解,这些解要以通解的形式写出来。而某一个单独能满足条件的递推关系叫做特解。又根据叠加原理,$h_n + a_1 h_{n - 1} + … + a_k h_{n - k} = b$和$h_n + a_1 h_{n - 1} + … + a_k h_{n - k} = c$的解加起来,就是$h_n + a_1 h_{n - 1} + … + a_k h_{n - k} = b + c$的解。因此对于一个常系数线性非齐次递推关系,不用再像之前一样直接求出通解,而是只要求出一个特解,再加上齐次情况的通解,就可以得到该递推关系的特解。我们现在要完成的任务就是求常系数线性非齐次递推关系的特解。

求非齐次的特解我只知道公式,不理解公式的由来,这里就直接给公式了。若:

则将

代入$h_n$,解出这些$c$来,就可以得到一个特解。如果$r$还是特征方程的根,且是$m$重根,则要代入

可以看出,求特解时,就是把等式右边的非齐次项按$r^n$的指数分个类。再顺便看一下$r$是否是特征方程的解,若是的话要乘上$n$的次方项。特解的未知数个数取决于非齐次项中的多项式的次数,把这个式子套回去可以解出所有的未知数来。具体看下面的例子。

例:求$h_n = 2h_{n - 1} + n^2$的特解。
解:
特征方程:

代入得:

上式恒成立,因此:

解得:
$
\left\{
\begin{aligned}
c_0 &= -6 \\
c_1 &= -4 \\
c_2 &= -1
\end{aligned}
\right.
$

得到一个特解:
$h_n = -6 - 4n - n^2$

生成函数

生成函数的用处

若有一个数列$h_0,h_1,h_2…$,则它的生成函数定义为$g(x) = h_0 + h_1x + h_2x^2…$。若数列是无穷的,则这个级数也是无穷的。

生成函数乍看上去非常奇怪,因此必须要先理解生成函数是用来做什么的。生成函数正是为了解决一些问题而定义出来的。

设$h_n$为从集合$\{2a\}$中取出n个字母的方案数,则数列为$1,1,1,0,0…$,生成函数$g_1(x) = 1 + x + x^2$。同理,从集合$\{3b\}$中取出n个字母的方案数得到的生成函数$g_2(x) = 1 + x + x^2 + x^3$。那么现在,从集合$\{2a,3b\}$中取出n个字母的方案数得到的生成函数是什么呢?

还是先求出方案数序列。$h_0 = 1,h_1 = |\{a,b\}| = 2, h_2 = |\{aa,ab,bb\}| = 3,h_3 = |\{aab,abb,bbb\}| = 3, h_4 = |\{aabb,abbb\}| = 2, h_5 = |\{aabbb\}| = 1$。则其生成函数$g(x) = 1 + 2x + 3x^2 + 3x^3 + 2x^4 + x^5 = (1 + x + x^2)(1 + x + x^2 + x^3) = g_1(x)g_2(x)$。“巧合”发生了。一个问题的解的生成函数等于子问题的解的生成函数相乘。

生成函数的本质,就是把“总和”为$n$的方案数放到$x^n$的系数上。多项式在进行乘法时,会很自然地进行排列组合,排列组合计算的结果依然保留在系数上。我目前的理解是,生成函数就是用来计算排列组合的。

生成函数既然是用来计算排列组合的,但我们现在都是在通过排列组合反推生成函数。如果是用多个生成函数的乘积来计算总的生成函数,再算出方案数,那么我们还是要手动进行多项式乘法,这个过程和我们算排列组合的过程是一样的,计算量完全没有减少。那么,生成函数到底有什么用呢?

当生成函数是无穷级数时,生成函数的形式就美观了许多,比如:

这样,再求一个复杂的排列组合时,可以先求出简单的子问题的生成函数,才把这些生成函数相乘。当生成函数是无穷级数的时候,往往能进行某些化简。求最终的生成生成函数的某个系数,就可以得到对应的方案数。

看一道经典例题:
例:确定苹果、橘子、香蕉和梨的袋装水果的袋数$h_n$的生成函数,其中各袋要有偶数个苹果,最多两个橘子,3的倍数个香蕉,最多一个梨。然后从该生成函数求出$h_n$的公式。
解:

$\therefore h_n = n + 1$

指数生成函数

在求多重集合的排列问题,比如从集合$\{2a,3b\}$中能拼出多少个长度为3的单词这样的问题时,我们要先求出各种组合的方案,除以每个数出现次数的阶乘,最后再乘上总数的阶乘。生成函数既然是解决排列组合问题的,自然也能解决此类多重集排列问题。在刚才的生成函数的基础上,加上我们平时求多重集排列的方法,就得到了指数生成函数的概念。

类似地,对于序列$h_n$,其指数生成函数定义为$g^{(e)}(x) = h_0 + h_1\frac{x}{1} + h_2\frac{x^2}{2}…$。由于在分母上除了一个阶乘,生成函数很容易变成$e^x$之类的形式,大概指数生成函数的名字就是这样得来的。$x^n$前面的系数再乘一个$n!$就是多重集n排列的方案数。

用法看例题即可快速理解:
例:如果偶数个方格被涂成红色以及奇数个方格被涂成白色,试确定用红、白、蓝和绿为1行$n$列棋盘的方格着色的方案数$h_n$。
解:

$\therefore h_0 = 0, h_n = 4^{n - 1}(n \geq 1)$
无穷级数带了一个常数项,因此通项在0的时候要单独写出来。

ACM中也有一些题要用到生成函数的思想,但解题时最后还是要用FFT。等以后碰到了相关的题目,我会把题解写在ACM分类中。

递推关系与生成函数

用生成函数解递推关系

好吧,生成函数还是有其他用途的,比如求解递推关系。不然为什么课本把这两个概念放在同一章呢?

只用一道例题来说明用生成函数求常系数线性齐次递推关系的方法:
例:
求$h_n - 5h_{n - 1} + 6h_{n - 2} = 0,h_0 = 0, h_1 = 1, h_2 = 5$的解。
设数列的生成函数为$g(x)$,可以得到:

把上面三个式子左右相加,由$h_n - 5h_{n - 1} + 6h_{n - 2} = 0$:

$\therefore h_n = 3^n - 2^n$

虽然感觉这种方法很高大上,但是比起直接解特征方程来,这种方法还是太麻烦了。既然如此,我们是不是可以不用生成函数来解递推关系的问题了?

当然不是。仔细看一下上面的解题过程,我们求解递推关系完全是在对生成函数$g(x)$做各种各样的操作,好像和递推关系是否线性、齐次什么的一点关系也没有。对于最开始特征方程法解不了的一些递推,用生成函数可能可以解出来。不妨看下面一个问题:

例:(Catalan数)对于一个有$n$个节点的二叉树,在保持左右子树的有序性,即不考虑任何变换的情况下,有多少种可能的形态?(比如$n = 2$时有两种,一个节点是根,另一个节点是根的左儿子或者右儿子)

解:
为了方便,记$n$个节点的二叉树的形态数为$h_n$。

考虑把问题转换成子问题。当现在有$n$个节点时,我们需要先选一个节点为根,再把剩下的节点放到根的左右子树中。如果根的左子树放了$a$个节点,那么右子树就要放$n - 1 - a$个节点,也就是说左右子树的节点和一定是$n - 1$。在这种情况下,问题就变成了两个子问题:$a$个节点的二叉树和$n - 1 - a$个节点的二叉树有多少个?我们把这两个数算出来,再一乘,就是当左边放$a$个节点时,$n$个节点的二叉树的形态数。

当然,我们不能只算$a$个节点,因为根左右子树的节点数可能是$0, 1,2,3…n - 1$。因此我们要讨论所有情况,并且把每种情况下的总情况数算出来,再进行累加。因此可以得到递推公式:

$h_n = \Sigma_{i = 0}^{n - 1}h_{i}h_{n-1-i}$

特别地,这里要令$h_0 = 1$。

由于这个递推关系根本不是线性的,我们无法用特征函数来解。考虑用生成函数$g(x)$来表示数列的每一项,即:

$g(x) = \Sigma_{i = 0}^{\infty}h_ix^i$

突然,我们发现:

$g^2(x) = h_0 + (h_0h_1 + h_1h_0)x + (h_0h_2 + h_1h_1 + h_2h_0)x^2 + …$

每一项中x的系数在递推公式中都可以找到。把递推公式代入式子:

$g^2(x) = h_0 + h_2x + h_3x^2 + …$

由于$h_0 = h_1 = 1$:

$
\begin{aligned}
g^2(x) &= h_1 + h_2x + h_3x^2 + … \\
&= \frac{1}{x}(h_1x + h_2x^2 + h_3x^3 + …) \\
&= \frac{1}{x}(g(x) - h_0) \\
&= \frac{1}{x}(g(x) - 1) \\
xg^2(x) &= g(x) - 1 \\
\end{aligned}
\\
\begin{aligned}
xg^2(x) - g(x) + 1 &= 0 \\
g(x) &= \frac{1 \pm \sqrt{1-4x}}{2x}
\end{aligned}
$
由于$h_0 = 0$,$g(x) = \frac{1 - \sqrt{1-4x}}{2x} = \frac{1}{x}(\frac{1}{2} - \frac{1}{2}(1 - 4x)^{1/2})$

根据牛顿二项式定理:
$
\begin{aligned}
(1 + x)^{1/2} = 1 + \Sigma_{n = 1}^{\infty}\frac{(-1)^{n - 1}}{n\times 2^{2n-1}}\tbinom{2n - 2}{n - 1}x^n
\end{aligned}
$

所以:
$
\begin{aligned}
(1 - 4x)^{1/2} &= 1 + \Sigma_{n = 1}^{\infty}\frac{(-1)^{n - 1}}{n\times 2^{2n-1}}\tbinom{2n - 2}{n - 1}x^n(-4)^n \\
&= 1 + \Sigma_{n = 1}^{\infty}\frac{(-1)^{1}}{n\times 2^{-1}}\tbinom{2n - 2}{n - 1}x^n \\
&= 1 - 2\times \Sigma_{n = 1}^{\infty}\frac{1}{n}\tbinom{2n - 2}{n - 1}x^n
\end{aligned}
$

套回开始的式子中:
$g(x) = \Sigma_{n = 1}^{\infty}\frac{1}{n}\tbinom{2n - 2}{n - 1}x^{n - 1}$

所以,$h_n = \frac{1}{n + 1}\tbinom{2n}{n}$。

如果我们把$h_0$看成第一项的话,那么第$n$项的值就是$\frac{1}{n}\tbinom{2n - 2}{n - 1}$。这个数就是著名的卡特兰(Catalan)数。

在这个过程中,我们完全是在对生成函数进行求解,而没有管递推关系的形式是怎么样的。这其中最妙的一步是发现了$g^2(x)$正好可以得到递推关系中的右半部分,只能说这种解法不是推算出来,而是突发奇想的。

总结

有时候推出来看似花里胡哨的递推关系,只要式子是线性的,就可以利用特征方程的方法求出通项来,从而把O(n)的时间复杂度变成O(1),把编程问题变成数学问题。

生成函数是用来解决组合问题的,当问固定数量的方案数时,就要想到生成函数了。在求排列时,要利用之前的方法,求出指数生成函数,再在结果前乘一个阶乘。

递推关系对应一个生成函数,可以用生成函数来解递推关系。对普通的线性方程,这种解法太麻烦了,还不如用普通的解法。对于一些比较复杂的递推关系,生成函数才能发挥出它的用途。

计算是什么呢?

数学,一门从数字与计算中出现的学科,在发展到一定阶段后,开始追问起了计算的本质。

数学家们用数学的语言,把“计算”这个早就存在的词语严格定义。用自身定义自身,这正是数学之美。

更令人开心的是,数学家在研究计算的过程中,开创了计算理论这门学科。人们在计算理论的基础上,制造了计算机。再随着计算机的应用不断变广,计算机成了一门单独的学科——计算机科学。

又扯远了。计算理论研究了什么是计算的机器,哪些问题是人们可以计算出来的,可以计算的问题怎么才能计算得更快。为了开始计算理论的学习,我们需要从最简单的计算模型,来一步一步理解计算理论研究的内容。有穷自动机及正则语言,就是我们的第一个学习对象。

第1章 正则语言

事物的状态

每时每刻,世界的万物都在发生变化。比如,昼夜不断交替着,早晨太阳升起,傍晚太阳落下;今天的我,总是比昨天的我更加帅气一点。

有些变化,它变来变去就是那么几种情况。比如,天要么是亮的,要么是暗的。有些变化则不然,是会一直进行下去的。我每天都在变帅,我的帅气程度永远在递增,不会有两个相同的值。

为了更好地掌控那些状态有限的事物,人们用一个有向图来表示这些事物。在有向图中,顶点表示状态,边表示转移条件。比如

黑夜——————-太阳升起————————> 白天
<—————太阳落下———————————-

状态,就是事物本质的情况;状态发生转移,就是外界条件对事物的本质产生了改变。

有限自动机

人们在研究一个数学问题是否可以解决时,想到数学问题涉及的内容都可以转化成字符串。问题解决,就是问题对应的字符串在一系列验证过程后,该字符串被认为是正确的。比如问一个十进制数字是否是偶数,所有问题的输入都转换成一个十进制数字字符串。”1”被认为不是符合要求的字符串,”666”被认为是一个符合要求的字符串。而问题的所有解,则是一个字符串集合,也就是一个语言

于是人们把数学问题转换成字符串是否“正确”的问题。字符串的每一个字符,都会对字符串是否正确产生影响,都会改变字符串的整体性质。联系开始我。们对于状态有向图的分析,状态转移正是事物本质发生变化的过程。我们似乎可以用开始的状态有向图,来判定一个字符串。因此,人们把字符串的每个字符做为状态转移的条件,把一些状态设为“正确状态”,意味着能通过字符一步一步走到这里的字符串是正确的。当然,还有一个初始状态,表示在什么字符也没有读取时的状态。

这样讲还是抽象了一点,还是举个例子吧。假设我们用的字符全部是0(也就是说字母表是$\{0\}$),我们现在碰到的问题是:给定一串字符串,问其长度是否为偶数。我们该怎么样用一个状态有向图来解决这个问题?或者说,如何把所有解表达出来呢?

从本质上来看这个问题,一串只有0的字符串只有长度为奇数和长度为偶数这两种可能。每多加一个0,就会改变字符串长度的奇偶性。也就是说,我们有两个状态:“偶数长度状态”、“奇数长度状态”。在碰到0的时候,两个状态间会互相转移。最开始时,字符串处于“偶数长度状态”,因为我们读入的字符串长度为0,是个偶数。如果我们读完了字符串后,发现我们停留在了“偶数长度状态”,那么这就说明该字符串的长度是偶数。状态图画出来是这样的:

Sample

左上角的箭头表示最开始进入的是q0状态,也就是“偶数长度状态”。右边箭头上的0表示转移碰到0就往箭头的方向转移。左边q0状态里面有一个小圆圈,表示这个状态是最终我们能够认可的状态。

我们构建的这个状态有向图,有一个十分大气的名字“有穷自动机”。这个名字为什么这么叫呢?大概有穷,指的是状态数是有限个。自动机,指的是我们只要把字符串到这个有向图里,按照规则在里面走迷宫,我们最终就可以知道这个字符串是否符合我们的要求。整个有向图就像一个自动工作的机器一样。虽然这个名字看上去很厉害,但正如我们分析的一样,有穷自动机就是一个有向图,它的概念十分容易理解。

每一个有穷自动机都可以由5部分确定:$(Q,\Sigma,\delta,q_0,F)$。$Q$是状态(点)集合,$\sigma$是字母表,$\delta$是转移函数(边)集合,每个转移函数接受的参数是当前状态与碰到的结果,输出的是下一状态,也就是说转移函数集合是$Q\times\Sigma\to Q$。$q_0$是初始状态,也就是我们走迷宫的起点。$F$是接受状态集合,$F\subseteq Q$,也就是迷宫的所有终点。我们需要字母表,是因为无论碰到什么字母,我们都得确切地知道我们下一步该往哪里走。我们在转移函数中,必须写清楚每个字母的转移情况。因此也可以得出,转移函数的集合有$|Q|$行$|\Sigma|$列,代表每个点在碰到每个字母转移到的下一个点。

显然这个定义是数学家给出来的。如果是程序员发明这个东西的话,一定会给每个量取一个好听的变量名,以更好地记忆和理解每个量的意思。不过和其他所有的数学定义一样,这些东西是不用背的,只要理解了它们的意思就好了。这些希腊字母和带下标的字母看起来确实让人头疼。

正则语言与正则运算

有一个很重要的名词,我们明明见过它,却只有现在才能介绍它。正则语言,就是某个有穷自动机可以识别的语言。既然有这个定义,就暗示世界上还有很多语言,很多字符串的集合,是有穷自动机表示不了的。话说回来,作为本章的标题,正则语言竟然是通过有穷自动机定义的,真是没有牌面。

但是,正则语言之所以不叫有穷自动机语言,是因为还有一些概念是“姓”正则的。我们之前讲过,所有数学问题都可以被转换成字符串,问题间的运算就转化成了字符串集合运算,也就是语言运算。比如找到两个问题任一的解,就是这个字符串满足问题一的解或者问题二的解。也就是说,问题转化成了语言求并的过程。类似的,语言还可以互相连接(符号$\circ$)、自我重复(符号$\ast$,所以也被叫做星号)。$A\circ B = \{xy|x\in A \bigwedge y\in B \}$,$A\ast= \{x_1x_2..x_k |k \geq 0 \bigwedge x_i\in A\}$。当然,求并和连接是二元运算,自我重复是一元运算。这三种运算都叫做正则运算。为什么这些也“姓”正则呢?因为正则语言在做了正则运算后,还是正则语言,也就是正则语言在正则运算下封闭。

正则语言在正则运算下封闭这个定理是可以证明的。要证明此定理,要分别证明正则语言在3种运算下封闭。不过在当前条件下,我们比较方便证明的只有求并运算。

定理:正则语言在并运算下封闭。

证明:
设原来的语言为$A_1$,$A_2$,状态集合$Q_1,Q_2$。现在我们构造一个新的自动机的状态集合$Q$,它有$|Q_1|\times|Q_2|$个元素,不妨把它们排成$|Q1|$行$|Q2|$列。其中,第$i$行第$j$列个状态表示处于原来自动机$A_1$的第$i$个状态和$A_2$的第$j$个状态。也就是说,我们在新的自动机上完全模拟出了之前两个自动机的状态。

新自动机字母表是之前字母表的并。在新自动机上,每一列状态都按$A_2$的规则向左右转移,每一行状态都按$A_1$的规则上下转移,如果是碰到某个自动机之前不存在的字母,就转移到一个失败状态——不管碰到任何字符都回到自己,且不是接受状态的状态。初始状态是既处于$A_1$初始状态也处于$A_2$初始状态对应的状态。$A_1$接受状态对应行上、$A_2$接受状态对应列上的所有状态都是新自动机的接受状态。

新自动机表示的语言就是前面两个语言的并。因此正则语言在并运算下封闭。

为了证明另外两种运算,我们还需要一个新的工具。

非确定有限自动机

在一个偌大的迷宫中,路径错综复杂,你会怎么办呢?在毫无办法的情况下,我们只能选择像无头苍蝇一样随便选择下一步了。毕竟,不停地往前走总比站在原地强。

有一类比较任性的有穷自动机,它们在碰到了一个字符后,可能选择往多个地方走,甚至拒绝接受这个字符。它们在某个状态的时候,还没碰到下一个状态,就有可能急不可耐地往其它一些状态触发。这样的有限自动机叫做非确定有限自动机(Nondeterministic Finite Automation,NFA),之前我们熟悉的有限自动机叫做确定有限自动机(Deterministic Finite Automation, DFA)。为了节约宝贵的时间,后文用简称来称呼它们。

NFA可以看成是一个会影分身的人在自动机上走迷宫。读取到下一个字符后,他可能会召唤多个自己的分身,和自己走不一样的路;可能拒绝接受这个字符,让自己就此消失。没有读取到字符,或者说读取到空字符$\epsilon$时,它也有可能召唤一个分身。只要有一个分身到达了终点,那么他就胜利了,这个字符串就算是接收。如果怎么也走不到终点,或者他的所有分身都消失,那么字符串就算是拒绝。NFA中的非确定性,就是指在碰到某个字符后,下一步的状态是非确定,可能有多个的。

要严谨地定义NFA的话,只需要稍微修改一下开始DFA的定义。DFA的状态转移集合$\delta$的类型是$Q\times\Sigma_{\epsilon}\to P(Q)$。$\Sigma_{\epsilon}$是原字母表中附加一个空字符$\epsilon$,$P(Q)$是$Q$的幂集,也就是$Q$的所有子集的集合。换言之,在每个状态,碰到了某个字符或不碰到字符后,下一步得到的状态是一个集合,而不是单个状态。

配上图的话,理解NFA会更方便。但由于图不好放,这里就不贴了。随便翻开一本计算理论的课本,或者去网上搜索非确定有限自动机,都能找到一些很直观、易于理解的NFA运算过程图。

NFA是如此强大,它用了一种很赖皮的方式来走迷宫:我尝试当前字符串表示的所有路径,有一条能走出去,就算我能走出迷宫。而在原来的DFA上,我们只能按照规则,一边读字符,一边往前走一步。但令人惊奇的是,NFA和DFA是等价的,每一个NFA都可以找到一个和它对应的DFA。我们还是使用构造性发发来证明这个定理,也就是证明每个NFA都可以转换成DFA。DFA可以转换成NFA是显然的,因为根据定义,DFA就是NFA。

我们再次回顾一下NFA的定义。NFA转移函数的结果,从单个状态,变成了状态的集合。转移函数的结果集合,不是状态集合$Q$,而是幂集$P(Q)$。仔细一想,$P(Q)$的大小也只是$2^{|Q|}$个啊!它的大小是有限的。我们可以构造一个新的DFA,它有$2^{|Q|}$个状态,每个状态对应$P(Q)$的一个元素。要得到这个对应的话,只需考虑到计算机科学常用的二进制就行了。用一个$|Q|$位二进制数来表示子集,某一位是1就代表NFA中这一个状态里有一个分身。NFA是$Q$子集与子集之间的转移,但如果我们把子集看成单个元素的话,那么子集转移就等价于状态转移了。

上面这段话其实不是用来读的,是用来启发思考的。对于一个证明,往往要通过自己的思考来理解,看别人的证明思路一般是很难看懂的。相信看到了二进制,二进制每一位对应原NFA中的一个状态,你就能灵光一闪地想出整个证明过程来了。

现在,我们知道NFA和DFA等价,它们只是名字不同的同一事物罢了。DFA的有关性质,NFA都有。比如,能被NFA识别的语言都是正则语言

嗯?这说明我们以后可能通过NFA来证明语言的正则性了。正好,我们还差两个正则运算的定理没有证明呢!这两个定理可以用一些直观但不严谨的方法证明。

还是把自动机想象成走迷宫,我们将构造出一台NFA,能在新NFA中走到终点的字符串,就是运算过后的字符串。

先证明连接运算的封闭性,即证明有这样一个DFA或NFA,它可以识别连接后的字符串。但我们手里有的,只有识别之前两种语言的DFA或NFA。如果想用DFA来判定连接后的字符串的话,我们首先要面对一个问题:这个字符串应该在哪个位置拆成两半,使得前一半属于第一种语言,后一半属于第二种语言呢?但NFA就没有这个烦恼。先构造两个语言的DFA,取名为A,B。在机器A的所有接受状态中,连一条$\epsilon$的边到B的初始状态,表示任何一个到了A终点的人都可以影分身抵达B的起点。A的初始状态为新机器的初始状态,B的所有接受状态为新机器的接受状态。NFA没有在哪个位置拆开字符串的烦恼——反正我试遍所有可能就行了。

再证明星号运算的封闭性。根据上面的思路,我们可以构造一台NFA,它的所有接受状态,都连一条$\epsilon$的边到初始状态,表示我们在任何时候从可以尝试把这个字符串“拆开”。但是,星号运算中空字符串一定会被接受,因此我们要额外建立一个初始状态,它一个被接收的状态,有且仅有一条$\epsilon$的边指向原DFA的初始状态。

总算,我们证明了正则运算在正则语言下封闭,它们是一家人,有一样的姓也是理所当然的了。

正则表达式

有了正则运算这一新武器,我们有了一个新的表示语言的工具——正则表达式。如果用一个DFA来表示语言,每次都要画一张图,实在是太麻烦了。但是,使用正则表达式的话,我们只需要用一行文字就可以表达语言了。正则表达式和我们的数字表达式一样,运算符号就是并、连接、星号,“数字”就是空字符、空集和单个字符。数学表达式里有1+1=2,正则表达式里有0*0 = {至少有一个0且全部都是0的字符串}。

等等!DFA可以表示语言,正则表达式也可以表示语言,还没有人说它们是等价的呢!但正则表达式也姓正则,暗示它表达的语言就是正则语言,正则表达式等价于DFA。我们接下来又要用构造来证明这一定理。

唉,要是世界上有这样一台机器就好了。机器只有两个状态,第一个状态是初始状态,第二个状态是接收状态。第一个状态到第二个状态的转移条件是一个正则表达式。我要验证一个正则表达式的字符串,就等价于把字符串放入这个机器中判定。可惜我们的DFA只允许在转移条件上写字符啊!

数学家们向来比较开放,喜欢扩大定义。没有这样的机器,我们就来创造这样的机器。广义非确定有限自动机(GNFA)是一个可以把正则表达式当成转移条件的自动机。为了证明正则表达式和DFA的等价,我们只需要一步一步地把DFA的转移条件变成正则表达式,最后变成我们开始说过的那个梦想中的机器——只有两个状态和一行正则表达式的机器。如果能构造出这样的转换方法,就能证明定理了。

我们这次构造的GNFA,是在原来的DFA上一步一步改造过来的。改造的第一步,是新建两个状态——新起始状态$q_s$,新结束状态$q_e$。在保证正确性的前提下,$q_s$对其它每个点连边,每个点向$q_e$。由于正则表达式包括空集,所以连边总是可行的。我们新建的这两个状态就是保留到最后的状态。我们要删掉其它所有点,并修改转移条件,使得整个GNFA依然正确。

对于任意要删的点$q_{rip}$,对于任意其它点$q_i$,$q_j$,设$q_i\to^{R1} q_{rip},q_{rip}\to^{R2} q_{rip},q_{rip}\to^{R3} q_{j}, q_i\to^{R4} q_{j}$,则$q_i$到$q_j$的正则表达式修改为$(R1)(R2)\ast(R3)\bigcup(R4)$。千言万语,胜不过下面这张图:
Sample

按照这种方法,我们总能在保证正则表达式的意思不变的情况下把中间点删掉。总有一天,我们会删到只剩$q_s,q_e$两个点,这两个点靠一条正则表达式来转移。

我们说明了DFA可以转换成正则表达式。为了证明等价,我们还得证明正则表达式可以转换成DFA。不过这一步要比开始简单得多。

借助证明NFA与DFA等价的方法,我们用如下方法构造NFA,使之与正则表达式等价。一个字符或者是空字符,就连一条边。空集就不连边。并集就是一个点可以通过空字符$\epsilon$移动到并集所表示的两个部分。星号就是结束部分连$\epsilon$连回初始状态,同时再初始状态前加入一个接收状态。同样,说了这么多,不如放一张图:(声明:该图片来自《计算理论导引》(Michael Sipser)第三版 42页)

Sample

DFA和正则表达式互相转化,那它们肯定是等价的了。

非正则语言与泵引理

开始我们提过,正则语言是可以被DFA表达的语言。换言之,还有许许多多的语言无法用DFA表达。举一个经典的例子:设语言$B = \{0^n1^n|n\geq0\}$,也是说该语言表示0和1个数相同,且先出现0再出现1的字符串。仔细一想,你哪怕使出浑身解数,也构造不出识别这种语言的DFA——为了构造一个这样的DFA,我们必须用状态来存储0的数量,但0的数量可以是无穷大,而状态数的有限的。

但有些愣头青喜欢钻牛角尖,他们偏要说道:“我就不管!你构造不出一台DFA,万一别人构造出来了呢?你凭什么说世界上不存在一台DFA识别这种语言?!”

科学家们又想出了一种证明语言不是正则语言的方法,来应对这些“对知识刨根问底”的热心青年。这种方法用了一个引理,叫做泵引理

如果一种语言$A$是正则语言,那么$\exists (int)p,\forall(string)s\bigwedge|s|\geq p\bigwedge s\in A \Rightarrow \exists xyz = s \bigwedge xy^iz \in A (i \geq 0)\bigwedge |y| > 0\bigwedge |xy| \leq p$。这一行一阶逻辑,能够让人充分复习离散数学的知识。但是,你很可能看完了也看不懂这一行话要干什么,或者干脆跳过了这行话。

泵引理是说,如果A是正则语言,我们可以随便选一个泵长度p。对于A中的每一个很长很长,长度至少是p的字符串,我们都可以把它拆成3份xyz。其中y部分一定非空,且xy加起来很短很短,长度必须小于p。如果我们在中间不断插入y部分,也就是对于任意字符串$xy^iz,i\geq0$,这个字符串还是A的语言。这个引理中有很多存在和任意,需要仔细地多看几遍。

泵引理的正确性的证明十分诡异。我们需要证明,一个正则语言对应的DFA,它满足泵引理的条件。引理说我们可以随便选一个泵长度p,那么不妨令p为$|Q|$,也就是这个DFA的状态数。对于语言中任意一个长度大于等于p的字符串s,它经过的状态大于等于p+1,因为p+1个状态需要通过p次状态转移,也就是需要读取p个字符。s经过了p+1个状态,但我们总共就只有$p = |Q|$个状态啊!这是怎么回事呢?这说明我们至少经过某个状态两次。我在走迷宫的时候,两次走到了同一个地方说明什么?说明我绕路了!我绕了一圈,又返回了原地。既然我经过了某个状态两次,就必然存在一个状态序列,通过这个状态序列可以回到同一个状态。状态的转移需要读取字符,也就是说,读取了一些字符后,我们又回到了之前的某个状态,我们绕路了。这些字符,我把它重复若干遍,我还是会回到这个状态,我永远会在这个状态绕不出去了。这个字符序列,就是我们拆成三部分xyz中的y。在第一次碰到重复字符时,也就是第一次绕路结束时,我们至多有一个状态走了两次,其它每个状态走了一次,也就是说最多走了p+1个状态,也就是最多读取p个字符,这一部分就是xy,$|xy| \leq p$。至此,泵引理得到一个描述性的证明。

可以发现,泵引理中“存在一个p”这句话一点用也没有,因为我们在证明泵引理时,直接把p钦定为状态数|Q|了。

等等,泵引理有什么用啊?泵引理说明如果A是正则语言,则可以干嘛干嘛。我都知道正则语言可以通过构造一个DFA来判断了,我要泵引理干嘛?

泵引理给出的正则语言的必要条件。也就是说,泵引理的逆否命题,得到的是判断一个语言不是正则语言的充分条件。如果一个语言满足泵引理的逆否命题,那么很遗憾,这个语言一定不是正则语言。

或者再从另一个角度上来讲,我们可以通过反证法来证明一个语言不是正则语言。我们把这个语言套进泵引理中,发现它无论如何都会导出矛盾,那么就可以得出这个语言不是正则语言了。

泵引理反过来是这样说的:对于一个语言A,如果对于任意泵长度p,A中存在一个很长很长,长度至少是p的字符串,我们无论如何都不能把它拆成3份xyz,满足下列所有条件:y部分一定非空,且xy加起来很短很短,长度必须小于p。如果我们在中间不断插入y部分,也就是对于任意字符串$xy^iz,i\geq0$,这个字符串还是A的语言,那么A不是正则语言。我们把整个引理取反,所有的存在和任意都反了过来。这就是开始说要注意存在和任意的原因。现在我们也发现,泵长度p不是没有用的。正过来时,p可以任意取值;但反过来说时,p就是任意取值了。泵长度p在证明泵引理时是完全没有用途的,因为它是一个存在的条件,可以任意取值;而在说明一个语言不是正则语言的时候,就要考虑泵长度p为任意值的情况了。

就考试而言,证明一个语言不是正则语言都是一个套路。因为要求证明的命题一定是正确的,所以我们可以无脑套入泵引理来导出矛盾反证。以经典的例子$B = \{0^n1^n|n\geq0\}$来说明一下证明语言不是正则语言的方法。

证明:
假设$B = \{0^n1^n|n\geq0\}$是正则语言。令p为泵长度。随便选择一个字符串$0^p1^p$,它属于B,且长度大于等于p。泵引理保证,它可以拆成3部分xyz,且满足之前的三个条件。由于$|xy|\leq p$,所以$xy$肯定全部由0组成。$xy^iz(i\geq0)$也一定属于B。但很明显,假设我把y重复100遍,由于y非空,xyz的前半部分一定出现了许许多多的0.这样的字符串是不属于B的,矛盾产生。因此,我们假设错误,B不是正则语言。

如果能仔细品味泵引理背后涉及的数学、逻辑原理,我相信人们都会被数学之美、思维之美所打动。这种美看不见摸不着,却深深埋藏在每个人脑中。对于那些爱思考的人来说,发现这些美,就能收获到一种无比的喜悦。能成为一名热爱自己的学科,并能在自己的学科里有所成就的科学家,真是一件令人羡慕的事情。可惜不是人人都适合科研,不是人人都有机遇把自己的一生都献给知识荒原的开拓。

总结一下。这一章讲的是正则语言,也就是可以被有限自动机识别的语言。这一章介绍了许多在后面都会介绍的概念:机器、状态、接收与拒绝、非确定性等。这些概念,是研究后面一些更强大的计算机器的基础。从全书的角度来看,这一章为后续的知识学习奠定了最低层次的基础。同时,这一章也围绕有限自动机,讲了许多实际的内容。有限自动机本身是最低级的计算机器,通过学习它我们能隐隐体会到计算的本质。

从考试的角度来看的话,这一章难点只有两个。一个是DFA向正则表达式的转换,一个是泵引理的理解与证明。而其他部分都不难。自动机名字看上去结构复杂,实际上就是一个有向图,哪怕不知道什么是图,会走迷宫,就能学会有限自动机的概念。非确定有限自动机的概念比较难理解,但一旦理解,一旦迈过那一道坎后,这个概念就会显得十分清晰。所有的证明都不会考,学习它们对于考试毫无益处。


后记

我写这篇文章的本意和之前复习概率论一样,是站在讲述者的角度来叙述这些知识,更好地把知识梳理清楚。从结果来看,复习效果是有,但是我花费了大量的时间,而且很多时间都花在了吹牛和一些我已经熟悉的知识的讲解上。而且,考虑到时间不是很够的原因,文章本身的质量也不够高,讲得也不够清楚。也就是说,我花了很多时间,就稍微复习了一些不太熟的知识,文章也没有写好来,总体上来看非常亏。我得到的结论是,复习还是不要写文章的好。如果想清楚地介绍一个知识,就在闲暇的时候慢慢地写文章;如果要复习,就用效率更高的方式来看书。这样复习的话,竹篮打水一场空,什么都没得到。

第五章 大数定律和中心极限定律

考试迫在眉睫,情势刻不容缓,必须快马加鞭,迅速复习完概率论。这一章内容不多,我就不侃侃而谈了,直接把考试会考的内容写出来。若几年后有时间,再补完此处的内容。

第二节 中心极限定律

一句话总结:独立同分布的一堆随机变量之和是正态分布,所以正态分布才在我们生活中那么常见。

例题(BIT 2013 级概率与数理统计试题A 卷):

Problem

一食品店有三种面包出售,由于售出哪一种面包是随机的,因而售出一只面包的价格是一个随机变量,它取1 元, 2 元, 3 元的概率分别为0.3, 0.5, 0.2. 若售出300 只面包,求售出价格为1 元的面包多于100 只的概率.

Wrong Solution

这不是二项分布嘛!等一下,n是300,这么多?我记得二项分布多了可以转换成泊松分布。这里$\lambda = np = 90$,
$ans = 1 - \sum_{i = 0}^{100}\frac{90^i e^{-90}}{i!}$。虽然我算不出这个数来,但复杂度是$O(N)$,这个答案应该可以接受。

(错误原因:数学题的答案只能用O(1)的算法)

Solution

要求的量满足独立同分布的条件,整体服从正态分布,均值$\mu = 90$,方差$\sigma = 63$。

把100代入$(X - \mu) / \sqrt{\sigma}$转换一下,变成标准正态分布,查一下表,结果为0.8962。

Review

看到一个值由很多简单随机变量相加而成,就把它们当成正态分布来处理。

第四章 随机变量的数字特征

自第二章介绍了随机变量这个概念后,我们一直都在学随机变量的一些性质,或者是从随机变量上定义出来的一些概念。这一章依旧如此。我们将继续学习随机变量的数字特征。标题看起来依然那么高级,但实际内容却十分贴近生活。

第一节 数学期望

赌博是一项自古以来就有的活动。由于赌博失败会给社会安定带来影响,我们是不允许进行金额过大的赌博的。

但是,人还是喜欢赌博。为什么呢?赌博,意味着你花少量代价,就可以获得大量的回报。人在想着大量的回报的时候,就会沉浸于幻想中,而完全忽略了赌博失败带来的后果。

参与赌博的人中,有一些人比较聪明。他们为了赚更多的钱,就开始研究赌博的原理。最终,他们创造了概率论。概率论不仅给我们的生活带来了很多启示,为我们提供了便利,还让我们大二学生的学习生活充满了紧张与压力。

扯远了。现在你需要支付50元,你40%的概率可以得到100元,你和不和我赌博呢?

数学家为了研究自己是赚了还是亏了,怎么赚得更多,就开始研究起这种类型的赌博问题。仔细一想,对于上述的赌博,40%的概率,意味着100局大概有40盘左右是赢钱的。玩100局,可以赚到4000元,但要投入5000元玩。所以,这样的赌博极有可能是亏钱的。

100局赚4000元,平均一下1局赚40块钱。这样一个描述你获得的结果的大概值的东西,就叫做数学期望。可以简称期望。随机变量$X$的期望记为$E(X)$。

刚刚赌博成功与失败,其实就是一个0-1分布。如果赌博多次,就是一个二项分布。显然,期望是属于随机变量的。有了随机变量,就有期望。

从刚刚的例子可以看出,我们用概率乘上随机变量的值,似乎就可以算出期望了。期望的计算方法正是如此。对于离散型随机变量,期望就是所有随机变量的值乘上对应概率再求个和,即对于$P\{X = x_k\} = p_k, E(X) = \sum_{k = 1}^{\infty}x_kp_k$。与之对应,对于连续型随机变量,就是概率密度乘值再求积分,即对于概率密度函数$f_X(x), E(X) = \int_{-\infty}^{\infty}xf(x)dx$。当然,期望存在的前提是,求和或者积分是收敛的。

上面两个式子计算起来可能会很熟悉。事实上,我们之前一直都再对概率p做积分或求和。现在只是在前面乘了一个x后再做运算而已。

期望还有一个名字,叫均值。期望的现实意义和平均数很类似,它们都反映了把整体求和再平均分给每一种情况的值。但是,平均值是对于一些样本而言的,而我们算期望只是从理论出发,对一个已知的分布进行计算。后面数理统计会再讲到平均值。

$E(X)$可以看成一个记号,但把它看成一个函数就更加准确了。输入一个随机变量$X$,就可以输出一个期望值$E(X)$。既然这是一个函数,一种运算,那么它就有一些运算的性质。由于期望的定义比较简单,以下性质就直接列出来了:

(1)$E(C) = C$ ($C$为常数) //常数都不是会变的量,在任何时候值都不变
(2)$E(CX) = CE(X)$ //做期望的时候是在做加法,每个数都乘了一个常数的话,这个常数可以作为公因子提出
(3)$E(X+Y) = E(X)+E(Y)$ //期望是加法,中间可以拆开来
(4)$E(XY) = E(X)E(Y) \Longleftarrow XY独立$ //易证

第二节 方差

在某项竞技项目中,可能两个人平均水平相当(或者说整体的水平和相当),但是两个人给人的感觉不同。一个人时而独挑大梁,时而一声不响;另一个人稳稳当当,每次表现得都差不多。我们把前者叫做浪,后者叫做稳。真正厉害的人应该稳重带浪,浪中带稳。看似波澜不惊,时则暗流涌动。

扯远了。上述现象表明,事情除了整体表现的好坏之外,表现是否稳定也是一个重要的评判标准。

怎么衡量这种不稳定呢?试想一下,如果做出一个稳健的人和一个不稳健的人的“表现-比赛场次折线图”,稳健的人的曲线肯定在中间某条线附近略有波动,而不稳健的人的曲线一定陡峭曲折,时上时下。这个不稳定的值和平均表现有关,也与表现的差值有关。

显然,用$X - E(X)$可以得到表现与期望的差值,这个差值可以反映出表现的波动情况。为了消除负数的影响,人们把$E((X - E(X))^2)$定义为方差,也就是每次表现与期望之差的平方,再求一次期望。方差记为$D(X)$。

方差定义的式子十分便于理解:看一看每个数和期望值的差距,把这种差距累加起来,再平均一下。但这个式子并不是很好用。注意到$E((X - E(X))^2) = E(X^2 - 2XE(X) + E^2(X)) = E(X^2) - 2E^2(X) + E^2(X) = E(X^2) - E^2(X)$。这个式子清爽多了。

方差和均值一样,可以看成是一个函数,同样有一堆的性质:

(1)$D(C) = 0$ //不会变的东西哪有不稳定性呢?
(2)$D(CX) = C^2D(X)$ //平方导致的结果
$D(X + C) = D(X)$ //移动一下又不会改变波动的幅度
(3)$D(X + Y) = D(X) + D(Y) + 2(E(XY) - E(X)E(Y))$
证明:

由于XY独立的时候,$E(XY) = E(X)E(Y)$,上式最后一项为0,式子可以简写为$D(X + Y) = D(X) + D(Y)$

$(E(XY) - E(X)E(Y))$这个东西和XY的独立性似乎有关。下一节会用到这个东西,我不得不把这个式子证了一下。

有了期望、方差这两大武器,我们可以挖掘出随机变量的更多信息了。期望反映了一个随机变量整体值的大小,方差反映了值的分散程度。

为了好好试一试这两把武器,我们去挑战一下已经被我们战胜过几个小随机变量。

对于0-1分布$X \sim b(1,p)$:
$E(X) = 0\times(1 - p) + p = p$
$E(X^2) = 0\times(1 - p) + p$
$D(X) = E(X^2) - E^2(X) = p - p^2 = p(1 - p)$

对于二项分布$X \sim b(n, p)$,n次实验都是独立的
$E(X) = \sum_{i = 1}^{n}p = np$
$D(X) = \sum_{i = 1}^{n}p(1 - p) = np(1 - p)$

经过严密的计算后可以得知:
$X \sim \pi(\lambda), D(X) = E(X) = \lambda$
$X$为指数分布,则$E(X) = \theta, D(X) = \theta^2$

如果是$X \sim N(\mu, \sigma^2)$的正态分布,就更容易表示了。$E(X) = \mu, D(X) = \sigma$

我们讲了随机变量的这么多性质,最后还是和概率脱不了干系。如果一个随机变量的方差比较小,那么随便取一个数,这个数离平均值比较远的概率就会更小。严谨地说,通过方差的概念,有以下不等式,被称为切比雪夫不等式:

$P\{|X - \mu|>\epsilon\} \leq \frac{\sigma^2}{\epsilon^2}$

反着写也是一样的:

$P\{|X - \mu|\leq\epsilon\} \geq 1 - \frac{\sigma^2}{\epsilon^2}$

第三节 协方差与相关系数

上一节我们就注意到,$(E(XY) - E(X)E(Y))$这个式子不太对劲,它似乎和XY变量的独立性有关。把它做一些数学上的变换,可以得到$(E(XY) - E(X)E(Y)) = E((X - E(X))(Y - E(Y)))$,后面这个式子和方差的式子长得非常像。为了节约取名时间,人们把它叫做协方差,记为$Cov(X,Y)$。

协方差又有一堆性质:
(1)$Cov(aX,bY) = abCov(X,Y)$
(2)$Cov(X_1 + X_2, Y) = Cov(X_1, Y) + Cov(X_2, Y)$
同样,由观察很容易得知,$Cov(X,X) = D(X)$,一个随机变量和自己的协方差就是自己的方差。

协方差和独立性有关,但是不同数的协方差有大有小啊!独立性应该描述的是两个随机变量之间的关系,但我只要稍微乘一下其中一个变量,协方差的值就会改变(见性质1)。有没有一个专门用来表达和独立性有关的量呢?

可以发现,$0\leq \frac{Cov(X, Y)}{\sqrt{D(X)}\sqrt{D(Y)}}\leq 1$恒成立,那我们就用$\rho_{xy} =\frac{Cov(X, Y)}{\sqrt{D(X)}\sqrt{D(Y)}}$这个量好了!$\rho_{xy}$叫作相关系数

两个随机变量独立,则相关系数为0;相关系数为0,但两个随机变量不一定独立。因为相关系数比独立性的范畴要小,它只反映了两个变量线性上的相关性。

第四节 矩、协方差矩阵

定义$E(X^k)$为k阶原点矩
定义$E((X - E(X))^k)$为k阶中心矩
定义$E((X - E(X))^k(Y - E(Y))^l)为$k+l阶混合中心矩

可以看到,期望是1阶原点矩,方差是2阶中心矩,协方差是2阶混合中心矩.

定义…………………………………………………………为协方差矩阵

说实话,这一小节就是一堆定义,而且只是原来某些定义的拓展而已。我暂时不知道这些东西算出来有什么用,老师上课时也是一笔带过。这一小节就过了吧。

本章总结

这一章我们学习了期望与方差——我们生活中评价随机变量的两个标准的严格数学定义。用了它们,我们就可以更好地生活,更好地判断赌博是亏了还是赚了,更好地在别人面前吹牛,可谓是一举多得。

本章的重点,一是方差和期望的计算。这个计算本质上就是一个简单的积分,可以看成是对一元简单积分的复习。二是期望和方差的一些运算性质。这些运算性质会在题目和后面的学习里被广泛用到。

第三章 多维随机变量及其分布

学微积分时,一般是先学一元微积分,再介绍多元函数,再介绍多元微积分。学习的重点还是二元微积分,因为学会从一元推广到二元,就能够再推广到多元。

多维随机变量的学习也是如此,教材也主要介绍了二维随机变量。在学多维随机变量的时候,很多概念和一维随机变量是类似的,我们关注的重点应该一维随机变量推广到多维随机变量的转化思想。

第一节 二维随机变量

这一节全部在讲一维随机变量的概念在二维中是什么样子的。其实只要理解二元函数和一元函数,这些概念就很容易对应过去。

分布律变成了描述$P\{X = x_i, Y = y_i\}$,画出来的表格应该是一个二维的表格:

Y\X 1 2
1 1/4 1/4
2 1/4 1/4

概率密度函数则是一个二元函数$f(x,y)$

分布函数对于离散型变量,是一个双层求和;对于连续型变量,则是一个二重积分。

可以看出,所有概念的迁移都非常自然,我们快点进入下一小节。

第二节 边缘分布

某一天,我们兴冲冲地求出了一个二维连续型随机变量的概率密度函数,就比如上一章提到的打靶打中哪个位置。

突然,有个人把靶子重新画了一下。他把靶子涂上了斑马线一般的红白相间条纹,之后说:“现在,越靠中间的直线,分数越高。‘靶心’是中间那条红线。”

也就是说,现在我们不关心我们在靶子上的y轴打在哪个位置,只关心x轴打在哪个位置。我们现在需要求的是一个一维随机变量,但我们只有二维随机变量的概率密度函数啊!

这时候,可以很自然地想到,忽略y轴,就是y可以取任意值。不妨做积分$f_X(x) = \int_{-\infty}^{\infty}f(x,y)dy$。这样求出来的概率密度函数就只含x了。

边缘分布函数、边缘分布律、边缘概率密度等概念就是按照上述方法,把一个多维连续型随机变量去掉某维后,得到的结果。边缘分布函数就是直接把$\infty$代入式子,边缘分布律就是一行或者一列的数值求和,边缘密度就是求一个R上的广义积分。说实话,我感觉这个概念很容易理解,却又没看到什么实际应用,太无聊了。快进入下一小节吧。

第三节 条件分布

本节我们老师没讲,也不做为考试内容,但我还是稍微谈谈我的理解。

在第一章里,曾提到了条件概率。但那个时候我们只会用语言来描述一个随机事件。而现在的条件分布,是对一个随机变量求条件概率。理论上其中使用的方法是一样的。

本节并没有的新的内容,只是把第一章和第二章概念进行了一些排列组合。只要能看懂$F_{X|Y}\{x|y\}$的意思是$P\{x \leq X | y = Y\}$,就基本能搞懂本节。

第四节 相互独立的随机变量

和第一章一样,介绍了条件分布后,现在又开始介绍随机变量的独立性了。

还是和第一章类似的一个式子,若$F(x,y) = F_X(x)F_Y(y)$,则随机变量$X,Y$独立。

对于分布律和概率密度,也有类似形式的式子。

和之前一样,独立性就是一个十分简单的概念。给二维随机变量概率密度、分布律或分布函数,能判断两个变量是否独立,就算是学完了这一小节了。

第五节 两个随机变量的函数的分布

和第二章最后一小节一样,这一小节也是讲随机变量的函数的分布,只不过我们讨论的对象是两个随机变量。

虽然我们有两个变量,但本章讨论的函数只有一个值(或者说我们只有一个函数)。也就是说,两个变量$X,Y$经过函数变成了$Z$后,原来的二维随机变量就变成了一维的了。

本章的内容说是概率论的内容,但本质上是对一个概率密度函数的操作,内容实际上是二元微积分的内容。

$Z = X + Y$时,$f_{X+Y}(Z) = \int_{-\infty}^{\infty}f(x, z - x)dx$

$Z = XY$时,$f_{XY}(Z) = \int_{-\infty}^{\infty}\frac{1}{|x|}f(x, \frac{z}{x})dx$

$Z = Y/X$时,$f_{Y/X}(Z) = \int_{-\infty}^{\infty}|x|f(x, xz)dx$

其中$Z = X + Y, Z = XY$时,$x,y$是对称的,对应式子的x也可以被替换成y。

以下内容假设XY独立。

$Z = max\{X, Y\}$时,$F_Z(z) = P\{Z \leq z\} = P\{X\leq z\}P\{Y\leq z\} = F_X(x)F_Y(y)$

$Z = min\{X, Y\}$时,$F_Z(z) = P\{Z \geq z\} = P\{X\geq z\}P\{Y\geq z\} = 1-(1-F_X(x))(1-F_Y(y))$

对于这一节的题目,直接把条件代入公式,求积分即可。值得注意的是,上面的式子虽然是负无穷积到正无穷,但实际上很多积分在变量代换后是有一个上下界的。一定要画好图,搞清楚每个变量的取值范围,再写积分。求完结果最好全部把结果加一下,看和是否为1。

本章总结

这一章完全是对已学知识的应用、拓展。本章涉及了第二章一维随机变量的有关概念,并于第一节的条件概率、独立性结合,得到了条件分布、独立随机变量等概念。其中很多地方还需要用到微积分的知识。

仔细看来,这一章没什么新的内容。倒是多元微积分很久没用过了,可以借此机会复习一下。

第二章 随机变量及其分布

1.随机变量

在随机试验里,事件一般都是比较抽象的概念,比如从班上的学生中随机挑出三人,观察男女生的情况;在上课的某一时刻检查全体学生的行为,观察是否玩手机的情况。这些事件只能用文字描述,难以用数学的语言来描述。但我们常常关注的,是事件中的一些数字特征。比如,我们关心从三个人中几个人是男生,全班同学里几个人正在玩手机。这样的数字特征,就是随机变量

用严格的话说,对于随机变量的每个基本事件(样本空间中的元素),你都可以用一个唯一的数字来代表它。这样一个从事件映射到数字的函数就是随机变量。函数的自变量是用文字或其它方式描述的情况,函数值是一个数。比如,设X(e)是随机挑三人,男生数的随机变量,那么X(男女男)=2。

随机变量的概念其实非常好理解,就是我们从每一个随机的结果中取一个数来。本小节仅仅介绍了随机变量的基本概念。后面的几小节、几章都是在介绍随机变量相关的性质、应用。

2.离散型随机变量 分布律

这一小节的标题很高大上,我们不妨先谈一些概率论以外的事情。

离散一词来源于集合论。当事物的数量上升到无穷多个时,它们之间的多少已经不能用普通的方法来评价了。自然数和整数谁多?整数还是实数多?从数量的角度来说,它们都是无穷多个。

因此数学家用函数映射的角度来表明无穷集合的多与少。如果一个集合可以映射到另一个集合,那说明这个集合肯定是不比另一个集合“小”的。如果两个无穷集合互相建立映射(双射),那么它们的大小就差不多,就是等势。

整数和自然数都有无穷多个,但它们都是可以一个一个可以数过去的。如果一些数的数量是有限个,或者有无限个但能和整数或自然数建立上述的双射关系,那么这些数就是离散的。

本节的标题就是在说,我们讨论的随机变量的值都是0,1,2,3,4这样可以一个一个写出来的。

由于我们的生活中接触的大部分量都是离散的,离散随机变量的例子十分多。上节提到的男生人数就属于离散型随机变量。像抽签、抽球、被车撞这种和个数有关的随机试验,都可以用离散随机变量来描述:抽没抽中、抽到几个一样颜色的球、一定时间地点里被车撞的人数。

为了表示这种随机变量的概率,人们用使用分布律来表达。分布律其实又是一个函数,把一个随机变量的值映射到了一个0~1的概率值上。这样的话,一个基本事件先被转换成随机变量的值,再被转换成了概率。随机变量成了一个求事件概率的中间媒介。

分布律一般写成表格:

X 0 1 2
p 1/3 1/3 1/3

人们发现,离散随机变量的原理很类似,也就是说,这些随机变量代表的函数的形式和类似。你只要改变函数的参数,就可以得到一个符合当前情况的函数。所以人们研究了一些常见的离散型随机变量。

0-1分布

抽签、中奖、表白,要么成功,要么失败。那么我们用0表示失败,1表示成功,用p表示该事情成功率。那么分布律是:

X 0 1
P (1 - p) p

0-1分布的意义太容易理解了。

二项分布

这次没中奖怎么办?表白失败了怎么办?再试一次啊!

我们做很多次可能成功可能失败的事情,每次成功率固定,那么成功的次数这个随机变量就是二项分布。

如果设做一件事做了$n$次,那么所有长度为$n$,共$2^n$个01串就唯一代表了一种成功失败的情况。这种情况是基本事件。通过第一章古典概型的概念可知,一个事件的概率,等于其包含的所有基本事件除以总基本事件数。再运用一下排列组合知识,你就可以得到二项分布发分布律了:

X 0 1 2 n
P $(1 - p)^n$ $\tbinom{n}{1}(1 - p)^{n - 1} p^1$ $\tbinom{n}{2}(1 - p)^{n - 2} p^2$ $p^n$

也就是说,$P(X = k) = \tbinom{n}{k}(1 - p)^{n - k} p^k$

这个公式和二项式展开的系数完全一样,因此得名。从公式可以看出,二项分布有两个参数——事件次数n,成功概率p。二项分布记为$X \sim b(n,p)$

泊松分布

彩票还是不中怎么办?我决定每时每刻地都去买彩票,这样很快就能中奖了。

但是,这样是不可行的。第一,你没有那么多去买彩票,理论上你通过大量买彩票来中奖,你的投入都是比收获少的;第二不可能每时每刻都有彩票在卖。

不过,现实中还是有很多事是几乎在每时每刻发生的。比如,马路上车来车往,随时都有可能发生交通事故,尽管这个概率很小。

人们在数学上求出了这种无时不刻都在发生,也就是说事情次数无穷多情况下,某件事情成功次数的概率。这样的离散随机变量就是泊松分布。

设次数为$n$,成功率为$p$,令$\lambda = np$。在二项分布的公式,中代替掉p后,

$P(X = k) = \tbinom{n}{k}(1 - p)^{n - k} p^k = \tbinom{n}{k}(1 - \frac{\lambda}{n})^{n - k} (\frac{\lambda}{n})^k$,

再令$lim_{n->\infty}$,最终得出了一个奇特的式子:

$\begin{aligned}P(X = k) = \frac{\lambda^ke^{-\lambda}}{k!}\end{aligned}$

泊松分布只有一个参数$\lambda$,记为$X \sim \pi(\lambda)$。

在现实生活中,尽管事情不可能发生无穷多次,但只要这个发生次数n很大时,我们就可以用泊松分布的公式来近似代替二项分布的公式,以减少计算量。

3.随机变量分布函数

有了随机变量,我们已经可以求出很多有用的信息了。比如,掷硬币10次,正面朝上的次数为0~10次中某次的概率。但是,有些人还是不满足:幸运女神告诉我,今天我去掷10次硬币,如果正面朝上的次数是4~6次,我就会很幸运。我今天幸运的概率有多大呢?

你当然可以把随机变量为4、5、6的概率加起来,但这样计算总感觉不太对劲。试想一下,如果不是掷10枚硬币,而是掷10000枚硬币,求正面朝上4444~6666的次数的概率,那计算起来会非常慢。或者我们处理的是非离散的随机变量,每一个点的概率都是0,我们甚至无法累加它们。

总结一下,生活中,我们常常关心的是随机变量落在一个区间的概率。累加每一个离散型随机变量的概率可以解决的这个问题,但运算效率较低;而非离散随机变量无法累加。为了能求出所有类型的随机变量的区间的概率,我们必须得用一些其它的方法。

我们先在离散型随机变量中找出一种方法。在数学(或者说计算机科学)上,有一种快速求某个区间和的方法:求前缀和。也是说,对于随机变量的每一个值,求第一个值到这个值的和。前缀和$F(x) = \sum_{i = 1}^{x_i}P\{X = x_i\}$,其中$x_i$为第一个小于等于$x$的随机变量的概率。观察一下可发现,$F(x) = P\{X \leq x_i\}$。那么对于任意某个区间$(a, b]$的概率$P\{a < X \leq b\}$,其值就等于$F(b) - F(a)$。

这个反映了随机变量分布情况的函数$F(X)$就叫做分布函数。

4.连续型随机变量 概率密度

离散的反义词是连续,所以肯定还有连续型的随机变量。连续型随机变量每个值的概率都为0,所以我们无法用分布律来描述它们。不过,连续型随机变量区间的概率是有意义的,而上一节我们正好有了一个描述区间概率的工具——分布函数。连续型函数可以通过分布律来定义。

在离散的情况下,我们用的是求和;在连续情况下,我们就应该用积分。若随机变量$F(x) = \int_{-\infty}^{x}f(t)dt$,则$F(X)$是连续性随机变量,$f(t)$是概率密度。离散型随机变量中求和的是分布律,连续型随机变量中积分的是概率密度。也就是说,概率密度就对应着分布律。若要描述一个连续型随机变量,我们只要描述它的概率密度就行了。

和离散型类似,许多连续型随机变量的函数都有同样的形式。例如:

均匀分布

我随意地往靶子上射了一枪,保证不射到靶子外面。

对于靶子这个面,我射中每一个点的概率都是等可能的。如果靶心画得大一点,我射中靶心的概率就大一点。

如果随机变量每个值的概率都相等,也就是对于概率密度$f(x)$:

记为 $X\sim U(a, b)$

指数分布

我没有深刻理解指数分布的实际意义,只给出它的概率密度$f(x)$:

由于指数函数的性质,指数分布有无记忆型。若符合指数分布的随机变量X为灯泡寿命,则X正常运行t小时的概率,等于运行了s小时后,再运行t小时的概率。

正态分布

世界上,极强与极差的人都是少数。我们大多数人只不过是泛泛之辈,和他人并没有什么两样。

当对于一个很大的群体进行调查时,能够发现,无论是身高,还是体重,还是其它一些可以用数字描述的特征,都满足上述的性质:大部分人都处于中间水平,越是偏离中间水平的样本,数量就越少。

这样的随机变量满足一个神奇的分布——正态分布,其概率密度$f(x)$:

$f(x) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x - \mu)^2}{2\sigma^2}}$

这个函数有两个参数$\mu,\sigma$。记为$X \sim N(\mu, \sigma^2)$。(注意后面的平方)

这个式子非常不好记,但从某个角度可以更好地理解这个式子。

我们知道,整个样本空间的概率为1,也就是概率密度在R上的积分为1。那么对于正态分布函数:

做变量代换后:

右边那个$\int_{-\infty}^{\infty}e^{-\frac{1}{2}t^2}dt$积分积出来就是${\sqrt{2\pi}}$,这是一道多元微积分例题。

把$\frac{x - \mu}{\sigma}$看成一个整体的话,整个式子就好记多了。事实上,$\phi(x) =\frac{1}{\sqrt{2\pi}}e^{-\frac{1}{2}x^2}$就是标准正态分布的概率密度。其分布函数$\Phi(x)$的值人们已经算好了。求某个正态分布的有关量时,可以先做$\frac{x - \mu}{\sigma} = x$变量代换,在标准正态分布的情况下讨论。

求所有连续型随机变量的概率和离散型的方法是一样的。先通过概率分布(之前是分布律)积分得到分布函数,再在分布函数上做差,就可以得到某一区间的概率了。

5.随机变量的函数的分布

这一章里面我们已经提出了很多奇奇怪怪的要求了。我们先是要求把一个随机事件用一个数表示,然后又要求出随机变量为某个值时的概率,再要求求出随机变量在一段区间里的概率。

在这一节里,我们提出了最后一个需求:求出一个随机变量的函数的分布。比如设$X$为班上随机挑3个人中男生个数的随机变量,我突发奇想,要求出$Y = X^2$这个随机变量的分布。

这个需求很难找到一些比较有实际意义的例子,我暂且把他当成一种数学运算技巧。

计算随机变量函数的分布也很简单,直接无脑地按照定义往式子里套就行了。

例题:
$设X的概率密度为f_X(x),求Y = X^2的概率密度$
解:

在这里在特别提醒一下,所有求概率密度、概率分布函数的题目,要考虑到定义域,要把所有定义域下的函数值都写出来。有的式子推式子推得很爽,但忘记了没有定义域的地方,比如上题中的$y < 0$

多做几个题就能发现,对于单调函数,可以直接得到新的分布。设$h(y) = x$是原随机变量函数的反函数,则$f_Y(y) = f_X[h(y)]|h’(y)|$。但对于非单调函数,比如上面的$Y = X^2$,只能老老实实地计算了。

本章总结

本章一开始,我们从用自然语言或其它方式描述的随机事件中,提取出一个数来,把这种从基本事件到数的映射称为随机变量。围绕着随机变量,我们探讨了离散和连续的情况下,常见的随机变量有哪些,随机变量的概率应该怎么求,随机变量的函数的概率该怎么求。

应该可以说,这一章是整个概率论的基础。后续的很多内容都建立在本章内容之上讨论。

为了尽快复习,我会尽可能把内容精简一些,不会像第一章那样放那么多例题了。很快我就得考试了,除了复习理论外,我还得多做一些题目。

第一章 概率论基本概念

1.随机试验

世界上,没有两片相同的叶子。在没有时间倒流的情况下,严格上来讲,我们无法在完全一样的条件下做同一件事情。

然而,由于生活中许多事情的性质相同,我们在不同时间重复做这一件事,可以看成是在一个时间多次做这件事产生了多个结果。

而随机试验则是可以在相同条件下重复进行、结果不定、不可预知的试验。

这一小节很水,我们赶快把它跳过。

2.样本空间、随机事件

这一小节的讨论全部是基于集合的。

我们把一个试验的结果用集合表示,这个集合被赋予了高贵的名字:样本空间,记为$S$。$S$中的子集也有了别名,叫事件。空集叫不可能事件,全集叫必然事件,单个元素的集合叫做基本事件。事件就是集合,你可以做 $\bigcup \bigcap \subset - =$等基本运算。由于有全集,你还可以做补运算,结果等价于用全集减该集合。

集合有一堆运算律,比如德摩根律。这些东西应该是集合论讲的,这里就不复习了,考试也不会考。事实上,集合定律不用特别去记,集合定律和逻辑运算定律基本一样,而后者广泛存在于我们在生活中的一些思维方式里。

特别的,两个交为空的事件互为互不相容事件,并集是全集的互不相容事件叫做对立事件

这一小节我们取了很多名字。但是这些名字记不住也没关系,因为这些名字非常容易从字面上理解它们的定义。快进入下一节吧。

3.频率与概率

为什么要学概率呢?明明结果不可预知啊!

恰恰相反,正是因为结果不可预知,我们才需要学习概率,掌握事情发生背后的规律,从而更好地掌控随机事件。

概率有用的证据就是,无数次重复同一随机试验后,试验结果会十分接近其概率。

那概率是什么呢?概率就是个0~1的数。你硬要把它规定成0~10000里的数也可以,但没什么意义,因为概率是一个相对的概念——相对于样本空间这个全集而言。我们强行做了一个集合到数的映射,这个数越靠近1,表示它越接近必然事件,越可能发生。

要定义概率,就要对「集合到数」这个函数做一些规定。对于集合函数$P$,任意事件$A$,$P(A)\geq0$;$p(S)=1$,其中$S$为样本空间;任意个彼此互不相容事件之并的函数值是每个事件函数值之和。满足了这三个条件,概率的一切东西都可以推出来了。

考试与生活的应用中肯定不会取管定义。我们这里只注意概率的一个有用的性质:$P(A\bigcup B)=P(A) + P(B) - P(AB)$。这个性质由容斥原理而来,不仅概率函数P满足这个式子。第一章出的题目应该都会围绕这个式子出。两个事件各自的概率、两个事件并与交的概率,知道其中3个就可以推出剩下的。

例题:设$A,B,C$是三个事件,$P(A) = P(B) = P(C) = 1/4, P(AB) = P(BC) = 0, P(AC) = 1/8$, 求$A,B,C$至少有一个发生的概率。

解:
最后一句中文太不和谐了,把它转换成数学语言:求$P(A+B+C)$

由容斥原理,$P(A+B+C) = P(A) + P(B) + P(C) - P(AB) - P(AC) + P(ABC)$

$\because ABC\subset AB$

$\therefore P(ABC) \leq P(AB)$

$\because P(AB) = 0$

$\therefore P(ABC) = 0$

$\therefore P(A+B+C) = 1/4 + 1/4 + 1/4 - 1/8 = 5/8$

这题太水了,下一节。

4.古典概型

生活中最常见的概率模型是:事件由有限个基本事件组成,基本事件概率相同。比如一百个人抽签,每个人抽中的概率就是1%。如果其中有二十个人是我派过去的抽签小队,那么这个签被二十个人中某个人抽中的概率就是20%。这个概率模型非常容易理解。

换个角度来看,求概率问题就变成了计数问题。计算出所有基本事件的个数,这个数就是所有概率的分母。再计算出你要求的事件包含的基本事件数,把这个数作为分子。最终就可以计算出概率。

这一小节理论上属于组合数学的范畴了,不太像概率论。但考试还是会考,我们还得复习。只要有高中的排列组合基础,这一小节就基本不用学了。看几道水题:

例4.1:
从1~10中随机挑3个数,求:
(1)最小数为5的概率
(2)最大数为5的概率

解:

$(1) C(5, 2) / C(10, 3) = 10 / 120 = 1 / 12$
$(2) C(4, 2) / C(10, 3) = 6 / 120 = 1 / 20$

例4.2:
五双鞋子,随机取4只,求至少配成一双的概率

解:

不妨求出配不成一双的概率,再求其对立事件。

$P(至少配成一双) = 1-P(配不出一双) = 1 - C(5, 4)\times2^4 / C(10, 4) = 1 - 80 / 210 = 13/21$

5.条件概率

条件概率又是一个生活中常出现的概念。当一个事件极其复杂时,我们只能下一个大致的判断;但当你掌握的信息越来越多时,你之前下的判断的概率会越来越大。比如你掷两次骰子,你说你可以丢2次6出来,这个概率仅仅是1/36。当你第一次丢完,已经丢出了一个6后,你成功的概率就变成了1/6。

从整体的角度来看,条件概率就是知道了某些条件后,原来的样本空间缩小了。满足这个条件的事件,它自己包含的基本事件不变,而整个样本空间又缩小,它发生的概率也会随之变大。

设A,B为两个事件,$P(A) > 0,P(B|A) = \frac{P(AB)}{P(B)}$称为A发生的条件下B发生的条件概率

这个定义不是特别直观,因为我们在生活中用的一般是条件概率的性质——乘法原理,即$P(AB) = P(A | B) \times P(B)$。

比如,对面有3个怪和一个英雄,其中一个怪的效果是,你的英雄获得免疫。现在你可以造成两次无穷大的伤害,但是目标随机选定。求对面英雄死亡概率。我们通过直觉去考虑,我们要杀死对面英雄,必须要先杀死对面的特殊怪。杀死特殊怪的概率是1/4,在杀死特殊怪的条件下,杀死英雄的概率是1/3。所以杀死对面英雄的概率是$1/4\times1/3=1/12$.

条件概率还有一些重要应用,比如全概率公式。设$B_1,B_2…B_n$互不相容,且并集为全集,则$P(A) = \sum_{i = 1}^nP(A|B_i)P(B_i)$。

换句话说,某件事的概率不好求,我们只能在知道一些条件后才能确定该事件的概率。这个时候,我们要算无遗策,把所有下一步的情况考虑了,再算出每一个下一情况下,我们要求的事件的概率。最后乘一下,求个和。不过比较常见的是,我们下一步情况只有两种,因此我们只要算出下一个事件和其对立事件下,我们最后要求的事件的概率。我描述得比较抽象,不妨看一道例题:

例5.1:

甲袋中n白球m红球,乙袋中N白球M红球。从甲袋中取一个放到乙袋中,再从乙袋中取一个球。问取到的这个球是白球的概率。

解:

我们必须讨论一下从甲袋中取出的是什么,才好确定从乙袋中取白球的概率。

从这里也可以看出,条件概率和全概率公式是十分符合我们生活中的思维方式的。

全概率公式加上条件概率定义可以组合出一个很厉害的公式——贝叶斯公式:

这个公式乍一眼看很复杂,但仔细观察后发现,等式右边分子就是$P(AB_i)$,分母就是$P(A)$。这个式子给我们的直观感受是:我不知道B在A情况下发生的概率,但我知道A在B情况下发生的概率,那我再知道一些关于事件A发生的信息就可以求出B在A情况下发生的概率了。

这个公式在生活也是非常实用的,通过它或许可以得到一些反直觉的结论。这也是数学的奇妙之处:源于生活中的直觉,又超过了直觉。(暂时没有找到说明这个的例子)

看一个例题:

例5.2
假设男性色盲率5%,女性色盲率0.25%,从男女相等的人群中随机挑一人,其为色盲。问该人是男性的概率。

解:
设事件A:人是色盲,B:这人是男人,C:这人是女人。
则题目表述变为:$P(A|B) = 5\%, P(A|C)=0.25\%,P(B)=P(\overline B)=P(C)= 1/2,求P(B|A)$
由贝叶斯公式:$P(B|A) = \frac{P(A|B)P(B)}{P(A|B)P(B)+P(A|C)P(C))} =0.05\times 0.5 \div(0.05\times0.5+0.0025\times0.5) = 500/525 = 20/21$

6.独立性

在生活中,我们喜欢把没什么关系的时候瞎关联起来。比如,有人说,喝水会让人死亡,因为所有人活着的时候都喝了水。

为了驳斥这个观点,我们提出了独立性的概念,用以了解两件事事件是否会有关联。具体来说,也就是一件事发生或不发生,另一件事发生的概率是否发生改变。

若$P(AB) = P(A)P(B)$,则称A,B独立

由$P(AB) = P(A | B) \times P(B)$可知,A,B独立,意味着$P(A) = P(A|B)$,也就是B发生对A发生的概率毫无影响,符合我们直观上的感觉。

回到之前提出的例子,我们可以用独立性的概念来不严格地解释这个问题。$P(喝水的人死亡) = P(喝水)P(人死亡)$,因为所有人喝水,这个式子显然成立。因此我们可以说明,喝水和死亡没有半毛钱关系,它们是独立的。

独立性的运用也很广。我们生活中经常把两件事都发生的概率直接用两件事单独发生的概率乘起来,就是因为我们不自觉地假设两事情是独立的。

定义独立性也没有什么的意义,就是为了方便说明。比如题目提到,这两件事是独立的,就是在说明你在算这两件事的概率时分开来算就行,不用考虑它们的影响。

例6.1:

一个盒子有3个A,2个B,2个C,另一个盒子有2个A,3个B,4个C,独立地分别地在两只盒子中各取一个东西,求
(1)至少一个A的概率
(2)1A1C的概率
(3)已知至少有一个A,求1A1C的概率

解:
$(1) P = 1 - P(无A) = 1 - 4/7\times7/9 = 1 - 28/63 = 35/63 = 5/9$
$(2) P = 3/7\times4/9+2/7\times2/9 =16/63$
$(3) P = P(2) / P(1) = 16/35$

可以看出,独立性什么新的概念也没有提出,就是方便以后的说明而已。

学习总结

概率论第一章主要介绍了概率的基本定义,并且介绍了古典概型这一贴近生活的概率模型。

这一章前半部分涉及集合运算、排列组合计数,这个东西比较看基本功,不需要特别地复习。后半部分一些条件概率的公式比较重要,需要理解记忆。最简单的条件概率公式倒也好理解,但贝叶斯公式和全概率公式如果忘记了推导的原理,还是挺麻烦的。题型应该也就按内容分成这两种。古典概型求概率,用排列组合靠大脑做;碰到需要用到概率公式的题目,用符号表示题目给的量,最后放进公式一算就行了。

参考资料

浙江大学 盛骤 谢式千 潘承毅,《概率论与数理统计》 第四版,高等教育出版社
例题来自于我们老师给我们布置的书后习题

《群体性孤独》这本书讲述了在科技的不断发展下,计算机相关技术对人们情感上的影响,给人们生活带来的改变。书的前半部分讲述了“人造生物”从电子宠物蛋发展到外表酷似人类的机器人这个过程中,人们对于这些“人造生物”的看法及背后的问题;后半部分描述了在网络化生活下,人们沉浸于虚拟世界、只以短信交流、只对陌生人告白、在熟悉与陌生的人面前表现自己的行为,以及部分人对网络化生活的焦虑、反思。本书大部分时候都是在中立、客观的角度记录人们的谈话、感受,但这些看似不带感情的文字却背后透露出一丝忧虑、一种自省与反思,引发了我对于技术和人类本身的思考。后半部分描述的情况在我们生活中已经十分常见了,而前半部分在我们周围不太常见的一些人与机器人交流的现象令我更加震撼。我主要就机器人与人的问题谈谈我的感想。

为何把更多的情感给机器人?

稍微有一点编程基础的人都能理解,在现在科技条件下,所谓的机器人的内在原理:现在的机器人能听、能看,只不过是简单地对图象、语音做一些处理,对某些东西多加一些权重;能说、能做动作,只不过是按照事先写入的一些规则,对输入产生某些反应。机器人外表上看似逼真,但那只能说是艺术制作的功劳。机器人的“大脑”,只是一些没有广泛学习功能的简单程序,和我们在电脑上使用的程序一模一样。

我自己没有接触书中提到的人造生物的经历。看到书中很多人对于机器人、机器狗甚至是屏幕上的电子宠物蛋产都能产生那么深厚的感情时,我还是有些震惊与难以理解的。但随着阅读进度的不断推进,我也大概理解了人们对于机器人产生情感的原因:人们的情感都有所缺失,所以得把情感寄托在事物上。

人们把情感寄托在事物上,其实是一件很常见的事情。在有机器人之前,人们就有养猫养狗的习惯。除了那些因为好玩而养宠物的小孩外,很多养宠物的人都是没有配偶、子女不在身边的独居的人。他们没有亲人的陪伴,只能把宠物当成那些亲人的替代品。他们对宠物好,对宠物付出感情,是因为他们也想从中得到同样的感情。不仅是活的生物,一些具有意义的物品,也能成为情感的寄托对象。比如书中就提到过,有人在独处时,经常对着一张全家福来吐诉情感。对保留了珍贵记忆的日记、他人送自己的纪念品、陪伴自己多年的工具产生一些简单的感情,确实是很正常的事。

而人的情感有所缺失,则是一件普遍却不怎么容易察觉的事。情感缺失,小到日常生活的小小挫折,大到童年留下的终身阴影,其实是普遍存在的。有了情感上的缺失,我们会下意识地寻找他人的援助,希望在情感上得到弥补。比如书中提到过,有一个渴望超过自己姐姐的女孩见到了机器人后,就会不自觉地认为机器人喜欢她甚于她姐姐;一个身体有疾病的男孩见到了机器人的一些故障,就开始担心机器人的健康。机器人只是一面无暇的镜子,映照出了人渴求的内心。

人会把情感寄托在机器人上,这看上去很容易理解。可令所有人诧异的是,这种情感似乎和其他的情感不一样,与我们对没有生命的物体的感情不同,与我们对小猫小狗的感情也不同。书中也提到,接触机器人的人中,从小孩到老人,甚至是制造机器人的科学家本身,都体会到了与接触其他任何事物所不同的感觉。这种感觉,是这本书前半部分所要反映、讨论的重点。

其实准确来说,这种对机器人的情感并不是有什么本质上的不同,而是一个量的区别。人在对物体,对动物会有情感,但我们有一个对于情感回报的期望。我们知道物体不会给我们任何回报,而动物则会以它们的方式感激一下我们。但无论如何,人们都不会把过多的情感给他们——与把情感给予自己重要的人相比。而机器人不一样,人们知道机器人的原理就是那么回事,知道了不会得到很多回报,但还是不知不觉投入了过多的感情——甚至就像对待一个不存在的亲人一样。人们下意识地投入了过多的情感,也下意识感到了异样,却没有及时理解异样意味着什么。所以,他们产生了想要掩饰这一切的行动。书中就有这样的案例:一个老太太得到了一个婴儿机器人,她短时间里竟然选择了陪机器人玩而不是和她的孙女待在一起。实验结束后她十分镇定地把机器人换了回去,继续和孙女谈笑风声,仿佛什么都没有发生过。一个老人得到了减肥机器人后,最开始是把它当成物品摆在客厅。当研究人员要拿回机器人时,他故意指责了一些把机器人当成人类的称呼。但是,此时他却把机器人从客厅带到卧室,还给机器人取了一个名字。人们见到机器人的时候,投入了与期望不匹配的,溢出的情感,所有人也暗暗察觉了这些异样。

为什么人会把更多的情感放在机器人身上呢?上过多年理科的我,用排除法得出的猜测是:机器人的交互性,让人们对机器人的情感期望有所改变。

所有这些“人造生物”被称为“人工智能“,就是因为它们有一些与人类似的交互功能。拓麻歌子只是一个屏幕中的宠物,但是你定时去照顾它,它就会给你回报,成长得更好;当你有所疏忽,宠物就可能会生病,甚至死亡。后来的猫头鹰”爱宝“,它会像人一样说话。好像你教它越多,和它说话越多,它就能真的学会说话。它在”感到难受“时,会用一些信号来表示自己的情绪。再先进一点的机器人,会自己用眼睛盯着人,会用手抓东西,会说出一些简单的话。你和它交流时,它在眼神上或者语言上会做出一些回应。

人类感性的一面,会把这些回应作为自己情感投射的奖励。仿佛你给予机器人更多情感,机器人就会肯定它们,并用这些交互式的反应来回报你。同时,机器人回应人们的方式大多是说话、表示伤心等一些人类特有的情感,在与机器人交流的过程中,你会下意识地把它们与人类关联起来,认为机器人拥有和人类一样多的情感。这些原因使人们在与机器人交互的过程中,拥有了更多的情感期望。

人们也知道,机器人并没有真正的情感与思维,这却恰恰又给了一个人们蒙蔽自我的理由。人理解他人的回应时,常常是一厢情愿地从自己的方式来理解。比如青春期的少男少女在和异性交流时,异性的某个不经意的动作,都会被认为是在表达对自己的喜欢。但随着人们生活经验越来越丰富,大家知道别人的想法是很难琢磨的。而机器人不一样,它们没有真的思维,你可以随意地、按照你喜欢的方式去解读机器人的回应。书中提到过,一个充满爱心,喜欢机器人的孩子和机器人交流后,她认为机器人也喜欢它;一个自卑而充满控制欲的孩子,认为机器人忽视了它,而对它大发雷霆。

人们在与机器人交互时表现的担忧、异样,并不是技术上的问题,而是一个涉及人们心理的问题。人们普遍在情感上缺乏安慰,会极力在事物上寻找安慰。机器人,是一个极为特殊的情感投射对象。机器人的交互性,让人们觉得机器人会在情感上给予我们回报;机器人的拟人性,让人们觉得机器人和人一样可以提供较多的情感;机器人的物体性,又让人们可以随意地解读机器人与自己的关系。人们对机器人有了更多的情感期望,把更多的情感放在了机器人上。

机器人能代替人类的工作吗?

许许多多的人都会关心,机器人,或者说人工智能,能否完全取代人类的工作。生产力的提升,能给社会带来极大的变革,工业革命就是一个很好的例子。机器在很多体力劳动的地方胜过了人类;而人工智能,则在很多需要脑力劳动的地方胜过了人类。倘若机器人完全代替了人类,那么社会必将发生翻天覆地的变化。

恐怕包括我在内的大部分人都会同意,让机器人代替一些繁琐、无聊的工作是十分可行的,比如银行柜员;但是在涉及沟通、情感方面的工作上,机器人是无法代替人类的。那些制造“真宝”,“帕罗”的人们,本意或许也是希望这些机器人能起到陪孩子玩、照顾老人的日常生活等一些繁琐的工作。他们看到孩子和老人和这些机器人相处得很好,便认为机器人确实起到了某些帮助。

然而,这些看似重复无聊的陪伴,才是最需要情感的地方。正如开始分析的那样,人类把过多的情感放在了机器人上,是因为他们本身情感有了缺失。孩子喜欢和机器人玩,不完全因为机器人和其它玩具一样有趣味性;老人喜欢机器人,也不是因为它们真正方便了自己的生活。这些人群都缺乏了应有的陪伴、感情。机器人只是作为一种代替品出现的。

我认为,我们常说的情感,其实特指人的情感。有人存在,情感才有了意义。只有从其他人身上,人才能获得最多的情感。机器人被制作的目标就是拟人,无论它们再怎么高级,人们从它们身上得到的情感,也比不过从人身上得到的情感。把情感寄托于机器人,只能缓解内心空虚的表象,却改变不了人与人之间关系愈发淡薄的现实。书中也提到过,老人们被问到是希望是人还是机器人来照顾他们时,有人毫不犹豫地选择了人;有人虽然提到了人的种种缺点,最终也选择人来照顾。

书中提到,五年级的孩子被问到是否该让机器人做祖父母的伴侣时,孩子问道:“难道没有人来做这项工作了吗?”这段话在整本书中出现了多次,也确实能够引起人们的反思:陪伴亲人,进行亲密的交流,这本来就是人该做的事情啊!在涉及情感的工作上,机器人永远无法代替人。哪怕一个机器人在照顾老人时,能够面面俱到,为他们及时测量身体状况,及时拿药,我们也不能就此把一切事情都交给机器人——我们不能忽略他们在情感上的需求。

科技时代的问题

从书中,能够看到很多社会中的心理问题。和机器人交流中的情感问题,网络化时代中的人渴望被关注的问题。仿佛在科技时代,这些问题就如雨后春笋一样冒了出来。

但我认为,这些问题一直都存在,只不过科技把它们放大、固定了而已。即使在现在,你和两三个好友久别重逢,谈笑风生,也不会拿出手机来;做在十几个熟悉的陌生人前,没有手机只会让场面更加尴尬。人与人的联系本来就比想象得要淡,与科技无关。

科技,只是把这些本来隐藏的问题暴露出来,让人们习以为常,给了自己一个忽视问题的借口。书中提到,一天和家人联系15次,过去会认为心理上不够健康,现在却是一种正常情况;原来在会议上写信会被认为是不礼貌,而现在在会议上用手机发消息也成为了常态。科技也确实有一些负面作用:它让人们不再去试图纠正这些问题。但我还是认为,科技不是问题的根源。

科技在发展,人们可以做到的事情越来越多。但是,一些错误的文化、思维方式没有得到改善,一些人与人之间的问题一直普遍存在。这些问题具体是什么?该如何去改变?这两个问题太大,以至于书的作者也无法给出明确的答案。但无论如何,人们需要进行一些反思,寻求一些解决方法。这些问题靠单纯发展科技是无法解决的。

Description

给一个由左右括号组成的正确括号序列(保证一个左括号一定对应右边的一个右括号)。

通过这个括号序列,我们可以构建一棵树:左括号表示进入子树,右括号表示从当前子树返回。括号相当于描述了一棵树先序遍历的出入栈过程。

现在,我们有q次操作。每次操作会交换括号序列中的两个的括号位置,该操作保证括号序列的正确性。每次操作后,都能得到一颗新的树。要求输出最开始和每次操作后树的直径(树上某两点距离的最大值)。

序列代表的树有$n$个节点,操作共$q$次。$3 \leq n \leq 100 000, q \leq100 000$
输出$n+1$棵树的直径

Sample Input & Output

5 5
(((())))
4 5
3 4
5 6
3 6
2 5


4
3
3
2
4
4

Sample

Solution

首先考虑到树的子树具有子结构性质。每一步操作都没有完全改变整棵树,有很多子结构的信息是相同的。

那么可以这样思考,在括号序列的任意一个位置开始往后走,我都可以得到一颗与这个位置前面的节点独立的一颗树。这棵树不一定是子树,因为从任意一个位置开始的括号序列可能会多出几个右括号,这种情况下这棵树会往回生长。

再从题目的问题入手,题目要我们求出每颗树的直径来。路径长可以看成两个树的深度减去两倍他们lca的深度。即:设点$u$的深度为$d(u)$,那么$u$到$v$的路径长$l(u, v)=d(u)+d(v)-2\times d(lca(u,v))$。而直径就是所有路径长的最大值。也就是说,如果能得知每个点的深度,并设法维护最大的路径长,就能得到答案。通过括号序列得到每个点每个时刻的深度是很容易的,现在我们就要设法维护路径长,得知路径长又必须知道点对的lca是谁。

恰好,题目给的是树的一个dfs序。任意两点的lca,都是在左边节点之后,右边节点之前访问。那我们也不用管lca是谁了,随便拿$u,v$点中间的一个点$w$,使得$d(u)+d(v)-2\times d(w)$最大的$w$就是它们的lca。即:$l(u, v)=max \{ d(u)+d(v)-2\times d(w) | t_u \leq t_w \leq t_v \}$ ,其中 $t$ 为括号序列中访问节点的时间(也可以说是序列中的下标)。

那问题就变得更简单了。只要是满足 $t_a \leq t_b \leq t_c$ 的三元组 $a,b,c$ ,$d(a) + d(c) - 2 * d(b)$ 就可能是一条路径长。维护最大的这个值,就可以得到直径。

如果只是算一次的话,一边维护当前深度,一边记录下最大的$d(a)$,最小的$d(b)$等值很容易就可以地$O(n)$维护当前直径。但问题是,题目有q次操作。这就得回到开始的分析了——每次操作过后,还有很多子结构的信息保留了下来。

我们需要的是子结构的哪些信息呢?注意到我们计算答案只用到了深度,在每一个子结构代表的树中,我们也必须得维护一些用于计算最大的 $d(a)+d(c)-2\times d(b)$ 的一些深度信息。我们可以把某个子结构开始位置当作相对深度,并记录在这个相对深度下,深度的最大最小值,路径左半边(左边的点到lca距离)的最大值和路径右半边的最大值。同时,还要记录这个子结构的总深度,以得到它和后面一个子结构的相对深度。通过以上信息,就可以维护子结构中最大的 $d(a)+d(c)-2\times d(b)$了。

这种用子结构来解决问题的思想和分治是类似的。分治的每一个结果都可以存在线段树中。虽然第一次求解的复杂度是$O(nlogn)$,但对于每次修改,都能在$O(logn)$的时间里得到新的答案。

总的时间复杂度$O((n + q)logn)$

Review

这道题实际上算法并没有很难,写起来也很容易,但比较考验思维,需要把问题进行巧妙地转换。我一直没有想出解法,是看完官方题解才写出这道题的。虽然我没有自己想出来,但在回味题目巧妙的解法时,还是学到了很多东西的。

在每次操作中,一定是有一些子结构没有改变的。这一点我一直都很清楚,一直都想找出这个子结构。但我一直都拘泥于树的结构,希望先把括号序列转变成树,再找出交换括号是对应树上的把哪一个子树移到哪个地方的操作。这样想下去的话,是怎么也找不出正解的。

想出这道题的关键,应该是想出lca可以用深度表示,而括号序列保证了lca在两点之间。这样的话,求直径就变成了维护几个最大最小值再做计算的问题。这里可以反映出我对树上的一些计算的表达形式还不够熟悉,没有第一时间把求直径的方法转换。而且,我对dfs序的性质不够敏感,没有利用好这个性质。

这样想出了用最大最小值维护答案,怎么建线段树,要维护哪些变量稍微想一想就能想出来。而其中能用线段树维护答案是这道题可以在时限内被解出来的关键。能够用线段树维护子结构,是因为每个路径包含的$a,b,c$三个值的时间是在一个连续区间里的,即$t_a \leq t_b \leq t_c$。这一个序列上的连续性使得问题能够通过线段树来维护。

这也给了我一些启示:线段树不是只能做那些给一个$[l,r]$区间,做一些修改操作的题目的。线段树维护的是连续区间上的性质。如果一个题目中看到了子结构性质,且这些结构构成了连续区间,就可以考虑用线段树来维护。或者换一种想法,如果一个问题可以用连续区间的分治来解决,那么分治的每一步结果就可以用线段树来保存。

自信地点击提交按钮后,得到依旧是一行刺眼的Wrong Answer。

数个小时的付出,丝毫没有得到回报。提交记录上,代码行数越变越多,判题结果却永远见不到绿色的那8个字母。

绝望笼罩了心头,焦躁充斥了大脑,整个世界变得黑暗了起来。

万般无奈下,颤颤巍巍地用鼠标复制一段文字,放到搜索引擎里面,点开第一个链接。

片刻之后,你恍然大悟。一切都好起来了,世界再次变得光明。

题解,正是照亮世界的那束光。


只要你参加过算法竞赛的训练,就一定接触过题解,上面的提到的经历,也都能感同身受。

我看过很多题解,也一直有考虑过自己写题解。但我一直因为一些问题而犹豫不前:我为什么要写题解呢?怎么样的解题记录才算好呢?

思考了很久后,我今天写出我的第一篇解题记录。我也顺便写一下我的思考结果,稍微谈一谈我对解题记录的认识。

别人的“题解”

大多数的题解都是这样的:标题是题目来源及题目名称,后面用括号写下题目算法。正文内容先把题目完完全全复制过来,之后贴上自己代码,谈一下解题的思路。大家写题解都默认使用了这套“模板”。

这样写题解是为了什么呢?是用来给那些想不出题的人来看吗?仔细一想这是不太合理的。没写过这道题的人,认真阅读这篇题解的概率极低;看过而不会写这道题的人,肯定已经理解了题意,试过了输入输出。再把多余的信息写上来是没有意义的。此外,「别人的代码」是比医生的病例还要难看懂的东西。如果要把方法讲清楚来,很多时候用文字或者伪代码来表达算法,比直接贴代码效果好很多。最后还有一小点,很多题目偏向思维题,知道了做法就可以立刻写出题来。如果把题目的算法直接写在标题里,会让那些还摇摆不定不知道要不要认真看完题解的人立刻知道题目的做法。综上,只要稍微想想就能发现,“题解”并不是写给别人看的。虽然网上的题解被大家当成了写不出题的救命稻草。

比较合理的想法是,“题解”的称呼有失偏颇,正确说法应该是解题记录。解题记录就是给以后的自己复习看的。标题里的算法方便自己找到对应类型的题目;复制的题面能避免翻原网站的麻烦;自己的代码让自己能快速理解思路;解题思路里的三言两语能快速唤起写这道题时的记忆。这样一看,解题记录纯粹是为了方便自己而写,这种说法有道理多了。

但我依旧对这种写解题记录的方式抱有一丝的厌恶。

以我狭隘的心理来揣测,许多人写题解,只是为了写题解而已。他们看到了别人的博客,看到了几百篇、上千篇解题的记录,他们感到了敬畏与心虚。于是,他们开通了自己的博客,用同样的格式来写解题记录。自己的博客越写越多,那颗空虚的内心也会越来越踏实。

也不能说这样完全不好。起码每写完一道题,贴完一道题目的题解,你能够收获一份成就感,能够让自己坚持下去。

但除此之外,这样写解题记录就是浪费自己时间。

写完一道题目,这题水不水,你学到了多少东西,你有没有学到东西,大家心里自己都有数。单纯地让解题记录数目++,只是让自己心里好受一点:不管参加比赛打得怎么样,不管我菜不菜,起码我还写了这么多题目。

那些写了几百题上千题的人,不是因为他们写了解题记录而厉害,是因为他们真的认认真真想要去提升自己,认认真真地写了那么多题目才厉害啊!

这是我一直没去写解题记录的原因。

我对自己解题记录的要求

做事首先要目标明确。思考与尝试了一段时间后,我总结出了我自己写解题记录想要达到的目的。

  1. 对于解题时思路不清楚,甚至看了题解的题目,要借写解题记录的机会,彻底地把题目再思考一遍,把题目吃透来。
  2. 记录反思写题时碰到的一些轻微的思考错误、代码错误,争取以后不犯错。
  3. 对于略带套路的题目,写解题记录能让自己加深印象,记住这种比较特殊的题型。
  4. 如果有人在写这题时碰到了困难,碰巧看到我的解题记录,我能保证他能通过我的解题记录彻底理解这道题。
  5. 给未来的自己当回忆录看。

上述目的是按重要性降序排序的。与学新东西同理,写解题记录时,你会为了把事情说清楚,而不得不自己先把事情全部理解透。通过写解题记录这种手段来达到完全理解题目,这大概是写解题记录最大的目的。可以说第一条是最最重要的,相比之下后面几条都没那么重要。

可以看出,最应该写解题记录的题目,应该是在补题或学新专题时,那些略微超出自己当前能力,要稍微看看题解才能想出的题目。这些题是真正能提升自己的题。而在比赛中,你能过的题目,你一定都已经完全掌握了,这些题目就没有写记录的必要了。

顺带提一下我当前的记录格式。我会先把题意用较为清晰的话表达出来,再附上题目的样例。之后我会按照思维顺序把题目的解法娓娓道来。最后以反思收尾,回顾整道题的收获。整篇记录,起承转合,抑扬顿挫,虽无音韵、色彩之美,却有逻辑、通顺之妙。能想出这种格式的人,不可谓不是一个奇才。

今天是我第一次在博客里写解题记录。老实说,花的时间很多,我也能理解为什么很多人只是贴个代码稍微提两句题目——有认真写一篇解题记录的时间,下一题都写完了。但是我还是不愿意潦草地只把解题记录当成普通的记录。要做就把事情做好。哪怕以后我因为怕苦怕累,再也不写解题记录了。哪怕整个互联网中,只流传了我一篇质量奇高的解题记录,这篇解题记录成了我的绝唱,那也没有什么遗憾的。毕竟我的优秀作品还会有很多,这篇解题记录只是钻石里的一块金子。