1. 复习前先搞清楚:离散数学到底考什么
说实话,离散数学这门课很容易让人复习到崩溃。原因很简单——它不是一门“线性”的课,不像高数那样微积分、级数、微分方程一路推下来,它更像一个工具箱:集合、逻辑、关系、图论、代数系统,每个模块都有自己的语言和套路,互相之间还有千丝万缕的联系。期末复习最忌讳的就是打开课本从头翻到尾,翻了三天还停在谓词逻辑那一章,越看越慌。
我自己复习的时候,第一个动作不是看书,而是先把整门课的“地图”画出来。不同学校用的教材不一样,但知识点框架大同小异。国内用得最多的屈婉玲版《离散数学》第三版,结构非常清晰,一共四块:数理逻辑、集合论、图论、代数系统。英文经典教材Rosen的那本《离散数学及其应用》第8版,内容更庞杂,把数论、组合、概率、布尔代数都塞进来了,国外教材更偏应用,但国内期末考试基本还是在屈婉玲这套框架里打转。
我做笔记的时候,把考点按出现频率分成了三档:
- 第一档(年年考,必须拿分):命题逻辑等值演算、关系性质判断、等价关系与划分、图的度数定理、欧拉图判定、群的定义验证。
- 第二档(经常考,概率高):谓词逻辑翻译与否定、幂集与基数、闭包计算(尤其是传递闭包)、最小生成树、哈斯图、循环群与子群。
- 第三档(看学校风格,选考或出小题):组合计数、鸽巢原理、树的性质补充、布尔代数化简、图着色。
复习时间怎么分配?如果只有一周,我建议按4:2:2:2的比例分给逻辑、集合与关系、图论、代数。逻辑关系的分值占比最高,而且关系那部分一旦开窍,很多题是送分的。图论内容多,但大题套路固定,练几道真题就能稳住。
还有一个容易忽略的点:离散数学的证明题在期末考试里占比奇高,动辄三四十分。很多同学复习时只看概念、只做计算题,到考场上碰到“证明群”或者“证明图连通”这种题就懵了。所以核心思路必须是:概念用来判断,定理用来做题,证明方法用来写大题。这三件事缺一不可。
2. 数理逻辑:先把“符号语言”练成肌肉记忆
2.1 命题逻辑的考点:真值表、等值演算与范式
命题逻辑这章,说难不难,但丢分点极其细碎。期末最常见的题型就是给你一串复合命题,让你用真值表判断是否等值,或者用等值演算化简,还有写主析取范式、主合取范式的题。
真值表大家基本都会列,但有一点要注意:命题变元多的时候,真值表会变得又长又容易抄错。三个变元是8行,四个变元是16行,这时候优先用等值演算而不是硬列真值表。比如(P→Q)∧(Q→P)这种东西,直接用等价式化成P↔Q,一步就出来了。
等值演算的核心就那十几条公式,我复习时把它们分成几组记:
- 幂等律、交换律、结合律、分配律——这些和普通代数很像,不需要花力气。
- 德摩根律:¬(P∧Q)等价于¬P∨¬Q,¬(P∨Q)等价于¬P∧¬Q,注意否定符要“穿进去”并且变号。
- 蕴含等值式:P→Q等价于¬P∨Q。这个是考试第一大杀器,几乎所有化简题第一步都要用。
- 逆否命题:P→Q等价于¬Q→¬P。注意,P→Q的逆命题Q→P和它不等值,反命题¬P→¬Q也不等值,这是个高频陷阱。
范式题则是很多人的噩梦。求主析取范式,本质上就是找出使命题为真的所有赋值组合。有个快捷思路:先把命题化成析取式,再补齐缺失的变元。补齐的方式是用x∧(y∨¬y)的方式展开,比如一项是P∧Q,只有两个变元,而题里有P、Q、R三个变元,就把它写成(P∧Q∧R)∨(P∧Q∧¬R)。这样又清晰又不容易漏项。
2.2 谓词逻辑:翻译是基础,否定是重灾区
谓词逻辑这部分的期末考题,最常见的是两类:一是把自然语言翻译成谓词公式,二是对带量词的公式做否定。
先说翻译。翻译题最容易翻车的地方是“全称量词和蕴含式的搭配”以及“存在量词和合取式的搭配”。比如“所有鸟都会飞”,应该翻译成∀x(Bird(x)→Fly(x)),而不是∀x(Bird(x)∧Fly(x))。为什么?因为第二个翻译的意思是“所有东西都是鸟并且会飞”,显然不对。反过来,“有的鸟会飞”要翻译成∃x(Bird(x)∧Fly(x)),而不是∃x(Bird(x)→Fly(x))。这个错误相当经典:蕴含式在前件为假时整体为真,所以∃x(Bird(x)→Fly(x))在“存在一个不是鸟的东西”时就成立了,根本表达不了“有的鸟会飞”。
再说否定。带量词的命题否定,规则就是两条:∀变成∃,∃变成∀,否定词穿透到最里层。比如¬∀x∃y(P(x,y)∧Q(y)),先变∀为∃,再变∃为∀,得到∃x∀y(¬P(x,y)∨¬Q(y))。考场上很多人折在一连串量词上,就是一步一步漏了符号。
2.3 推理规则与证明方法:后面所有证明题的地基
推理规则听起来抽象,其实就是自然语言里“因为……所以……”的形式化。常用的有假言推理(P→Q和P推出Q)、拒取式(P→Q和¬Q推出¬P)、假言三段论、析取三段论等。这些规则本身不难,难的是在一道综合证明题里看出该用哪条。
关于证明方法,我在复习时总结了一张思维路线图:
- 要证明A→B,先试试直接证明:假设A成立,想办法推出B。
- 直接推不出来,就反过来用逆否命题,证明¬B→¬A。
- 再不行,用反证法:假设结论不成立,推出和已知条件矛盾。
- 涉及自然数的命题,优先考虑数学归纳法。
证明题在离散数学里无处不在,关系传递性的证明、图的连通性证明、群的性质证明,本质上都是逻辑推理的延伸。所以这一节虽然分值占比不算最高,但它在后续章节里被反复调用,值得多花点时间练熟练透。
3. 集合论:幂集、基数与那些刁钻的小陷阱
3.1 集合运算与幂集:题目不难,但陷阱比比皆是
集合这章的知识点本身不难,就是并、交、差、补、对称差,再加上幂集和笛卡尔积。可偏偏每年都有大量学生在这里意外失分,因为坑实在太多了。
最有名的坑就是空集和子集的关系。∅是任何集合的子集,也是任何非空集合的真子集,但∅不一定属于某个集合。比如A={1,2},∅不是A的元素,但∅是A的子集;而{∅}这个集合含有一个元素“空集”,所以∅∈{∅},但∅∉{∅}?等等——这里要小心,∅不可能是{∅}的元素吗?确实可以,因为{∅}只有一个元素就是∅,所以∅∈{∅}成立。那∅⊆{∅}吗?当然成立,因为空集是任何集合的子集。这种绕来绕去的问题,核心就是分清属于∈和包含于⊆。
幂集是另一个高频考点。集合A的幂集P(A)就是A所有子集的集合。若A有n个元素,则P(A)有2^n个元素。这个结论的直观理解是:每个元素要么在子集里要么不在,相当于n位二进制数,每位两种选择。
举个例子,A={1,2},那么P(A)={∅,{1},{2},{1,2}},共4个元素。注意幂集的元素本身都是集合,所以{P(A)}的元素个数永远是2的幂。考试常考的形式是:给一个带空集的集合,比如B={∅,{∅}},求P(B)。B有2个元素,所以P(B)有4个元素:∅、{∅}、{{∅}}、{∅,{∅}}。写这类题时要特别小心大括号数量,少一层多一层都会判错。
3.2 基数:有限无穷一起说
基数指的是集合“大小”的度量。有限集合的基数就是元素个数,比如|{1,2,3}|=3。无限集合的基数则有点反直觉:自然数集N、整数集Z、有理数集Q的基数都一样,都是可数无穷ℵ₀;而实数集R、区间(0,1)、无理数集的基数都是不可数无穷𝔠(阿列夫一或连续统势)。
期末考这部分时,最常见的题目有三类:
- 求有限集的基数或判断两个有限集基数大小。这类就是数元素个数,别把幂集的基数搞混就行。
- 证明某个无限集是可数集。思路通常是:构造一个从N到该集合的双射,或者说明该集合的元素可以排成一个序列。
- 判断可数集与不可数集。记住一个核心定理:任何无限集的幂集的基数一定严格大于该集合的基数。也就是说|A| < |P(A)|。这个定理来自对角线论证:假设A和P(A)之间存在双射f,构造集合B={a∈A | a∉f(a)},那么B是A的子集,所以B∈P(A),于是存在b∈A使得f(b)=B。如果b∈B,则b∉f(b)=B,矛盾;如果b∉B,则b∈f(b)=B,又矛盾。这个证明思路很棒,考试偶尔会让复述,值得背下来。
3.3 集合恒等式与文氏图
集合运算满足的恒等式和逻辑等值式非常相似,几乎是一一对应的:德摩根律、分配律、吸收律、排中律、矛盾律,这些在证明集合相等时都是利器。证明两个集合相等的基本套路是双向包含:先证左边⊆右边,再证右边⊆左边。能熟练用集合代数推,就不要靠文氏图去“看”,因为文氏图在三个集合以内很好用,四个集合以上就基本没法看了。
我复习集合论时最大的体会是:这章本身不难,但它是关系和函数的基石。如果把集合搞不透,后面关系复合、函数单射满射的部分会学得很别扭。所以哪怕时间紧,集合这章我也建议至少把课后题里的“判断下列命题真假”和“求幂集”这两类题做一遍。
4. 关系与函数:闭包算法和等价关系是重头戏
4.1 关系的性质判断:自反、反自反、对称、反对称与传递
关系这一章,期末考试的分值通常很高,题型也非常稳定。给定一个集合A和A上的关系R,让你判断R是不是自反的、对称的、传递的……这种题几乎是每张试卷的必考题。
判断性质的方法我用一套口诀:
- 自反:每个元素都必须和自己有关系,即对任意x,都有(x,x)∈R。
- 反自反:所有元素都不能和自己有关系,即对任意x,都有(x,x)∉R。
- 对称:若(x,y)∈R,则(y,x)∈R。
- 反对称:若(x,y)∈R且(y,x)∈R,则x=y。
- 传递:若(x,y)∈R且(y,z)∈R,则(x,z)∈R。
最容易出错的组合是“既对称又反对称”。这看起来矛盾,其实不矛盾:一个关系如果只包含形如(x,x)的对角线元素,它就既是对称的又是反对称的。比如A={1,2},R={(1,1),(2,2)},这个关系满足对称也满足反对称,就是不够“自反”的反例。
还有一个常被忽视的点:空关系(即R=∅)在非空集合上不是自反的,却满足对称、反对称和传递。为什么?因为判断对称和传递用的是“如果有就怎样”,前提条件不为真,命题自动成立。这个逻辑在离散数学里反复出现,一定要建立条件命题的直觉:前提为假时整个命题为真。
4.2 闭包:自反闭包、对称闭包与传递闭包
关系的闭包,简单说就是“往R里添加最少的有序对,让它拥有某种性质”。
- 自反闭包:把对角线上缺的元素补上,r(R)=R∪{(x,x)|x∈A}。
- 对称闭包:把所有有序对的方向反过来补上,s(R)=R∪{(y,x)|(x,y)∈R}。
- 传递闭包:这个最麻烦,因为要把所有能“两步走到”的关系全补上。比如(x,y)和(y,z)都在R里,就必须把(x,z)加进去;加了(x,z)之后如果又产生了新的两步链,还得继续加,直到彻底传递为止。
计算传递闭包最可靠的方法是Warshall算法。这个算法本质上是用动态规划,不断尝试用中间节点扩展关系。伪代码如下:
输入:n×n的关系矩阵M 输出:传递闭包矩阵M for k = 1 to n: for i = 1 to n: for j = 1 to n: M[i][j] = M[i][j] OR (M[i][k] AND M[k][j])我学这个算法时最大的困惑是:为什么中间节点k要放在最外层循环?后来想通了,这个循环顺序保证了我们不会重复利用“刚刚生成的”传递关系来产生短路径,而是按中间节点编号递增地拼路径。考场上如果题目规模不大(比如4个或5个元素的集合),也可以手动一行一行地算布尔矩阵乘法,但Warshall算法的代码实现和手算过程都是一样的套路。
4.3 等价关系与偏序关系:两个方向,各考各的题
等价关系 = 自反 + 对称 + 传递。它的核心副产品是等价类和商集。一个等价关系会把集合划分成若干互不相交的等价类,每个等价类里的元素“彼此等价”。期末常考的题是:给定集合和关系,判断它是不是等价关系;如果是,写出所有等价类。
偏序关系 = 自反 + 反对称 + 传递。典型例子是整数上的“小于等于”关系和集合上的“包含于”关系。偏序关系可以用哈斯图表示,画哈斯图时把方向省略(默认从下往上),然后去掉自反环和传递边。比如集合{1,2,3,4,6,12}上的整除关系,哈斯图就是6个点,1在最下面,2和3在上一层,6在再上一层,12在顶层——4和6之间并没有直接连线,因为4不能整除6。
哈斯图的考题经常让你找极大元、极小元、最大元、最小元。注意:最大元是大于等于所有元素的元素,必须唯一;而极大元只是“没有比它更大的元素”,可以有好几个。很多同学在这四个概念上栽过跟头,一定要用具体例子把这个区别刻在脑子里。
4.4 函数:单射、满射、双射与复合
函数是特殊的关系:每个输入只能对应一个输出,而且定义域里的每个元素都必须有输出。期末考函数的题,核心就是判断单射、满射、双射。
- 单射:不同的x有不同的函数值。用反证法思路判断:假设f(x1)=f(x2),能推出x1=x2,则是单射。
- 满射:值域等于陪域。也就是对于陪域里的任意元素y,都能找到x使得f(x)=y。
- 双射:既是单射又是满射,也就是一一对应。
双射在离散数学里地位很高,因为两个集合之间存在双射意味着它们“大小一样”,这也就是前面基数比较的底层逻辑。复合函数f∘g的规则是(f∘g)(x)=f(g(x)),注意顺序是从右往左算。如果f和g都是双射,那么f∘g也是双射,且(f∘g)⁻¹ = g⁻¹∘f⁻¹,注意逆运算顺序会反转,这个结论在代数系统里用得到。
5. 图论:握手定理、欧拉图与最小生成树
5.1 图的基本概念与握手定理
图论这章内容最多,但期末考试的大题套路其实非常固定。
先是最基本的:无向图、有向图、简单图、多重图、完全图、二分图。这些概念不会单独考名词解释,但会在判断题和小题里出现。比如问“完全图K₅有多少条边”,答案就是C(5,2)=10条,因为每对顶点之间恰有一条边。
握手定理(也常称为度数定理)是图论第一大定理:无向图中所有顶点的度数之和等于边数的两倍,即Σdeg(v)=2m。推论是:奇数度顶点的个数一定是偶数。这个定理的用途超乎想象,几乎所有图论的简单证明题都离不开它。
举个例子,证明“任何图中度数为奇数的顶点一定有偶数个”:直接由Σdeg(v)=2m是偶数,而所有顶点度数之和由偶数度贡献偶数部分,加上奇数度顶点的个数个奇数,总和要成为偶数,奇数度的顶点数就必须是偶数。就这么简单。
还有一个高频小题:判断一个度数序列是否是某个简单图的度序列。除了要满足非负整数、和是偶数之外,简单图还要满足度不超过n-1,而且可能需要用Havel-Hakimi算法验证。期末一般不会考那么深,但“度不超过n-1”这个限制条件一定要检查。
5.2 欧拉图与哈密顿图:判定条件要分清
欧拉图和哈密顿图是最容易混淆的两个概念,因为中文名字太像了。
欧拉图关心的是“能否一笔画”。无向图存在欧拉回路(回到起点)的充要条件是:图连通,且所有顶点度数都是偶数。存在欧拉通路(不要求回到起点)的充要条件是:图连通,且恰有两个奇度顶点,这两个顶点分别是起点和终点。这是每年必考的判断题,没有商量的余地。
哈密顿图关心的是“能否经过每个顶点恰好一次”。哈密顿回路的存在性判定没有简单的充要条件,一般用必要条件和充分条件去判断。常见充分条件:如果图有n≥3个顶点,且任意两个不相邻顶点的度数之和≥n,则该图是哈密顿图(Ore定理)。必要条件:删去k个顶点后,图的连通分量数不超过k。
期末考里通常是给一张图,让你分别判断它是不是欧拉图、有没有欧拉通路、是不是哈密顿图。欧拉判定直接看度数就行;哈密顿一般靠观察,实在难判断就写“不满足已知充分条件,不能确定”——但考试很少会出这种模糊的题,通常图上能明显看出一个哈密顿回路。
5.3 树与最小生成树:算法会手算
树是连通且无回路的图,n个顶点的树一定有n-1条边。这个简单结论应用很广,比如“给一个连通图的生成树有多少条边”这类题。
最小生成树有两个经典算法:Prim算法和Kruskal算法。期末考一般要求手算,不会真让你写代码,但算法逻辑必须清楚。
Kruskal算法思路更直观:把所有边按权值从小到大排序,依次选边,只要不形成回路就选进来,直到选了n-1条边。判断成不成回路是手算的难点,我的做法是每选一条边就在草稿纸上画出当前的森林,看新边两端是否已经在同一个连通块里。
Prim算法从某个顶点出发,每次在所有连接“已选顶点集合”和“未选顶点集合”的边中挑一条权值最小的,把对应顶点纳入。如果手算,我建议先把图重画成以出发点为中心的形式,然后一步一步标出“已选中”的边。两种算法得到的最小生成树可能不同(因为相同权值的边选择顺序会导致不同树),但总权值一定相同。
再补充一个树的小考点:哈夫曼树。给定一组权值,构造哈夫曼树的方法是每次把两棵根权最小的树合并,新树根权为两者之和。哈夫曼编码则是左0右1,从根到每个叶子节点的路径就是编码。期末如果考哈夫曼,一般就是构造哈夫曼树并算WPL(带权路径长度)。这道题属于纯操作题,刷三道就熟了。
5.4 图的存储与着色(部分院校选考)
如果你们的课程或考试涉及算法,图的邻接矩阵和邻接表存储也要复习。邻接矩阵适合稠密图,判断两点是否相邻是O(1);邻接表适合稀疏图,遍历邻接点效率高。考算法时可能会考深度优先搜索DFS和广度优先搜索BFS的遍历序列,注意DFS是沿着一条路走到底再回头,BFS是逐层展开。用队列实现BFS、用栈或递归实现DFS,这是标准套路。
图的着色问题在很多课程里只作选讲。基本结论是:任何平面图都可以用4种颜色着色(四色定理);二分图的色数是2;完全图Kₙ的色数是n。期末如果考,多半也就是判断题的分数,不用深入。
6. 代数系统:群的判定与同构思想
6.1 二元运算与代数系统的基本概念
代数系统这章,期末复习的核心就是“群”。先要搞懂基础的二元运算:给集合G上的一个运算,比如加法、乘法、模运算,它要满足封闭性(运算结果还在G里)才能构成代数系统。考试经常给出一个“奇怪”的运算,比如a*b=a+b-ab,让你判断它是否满足交换律、结合律,甚至有没有单位元、逆元。
这里建议做一件事:把常见的判断口诀背下来。交换律看ab和ba是否相等;结合律看(ab)c和a(bc)是否相等;单位元e要满足对任意x都有ex=xe=x;逆元是给定x找y使得xy=yx=e。注意单位元如果存在一定唯一;逆元在运算满足结合律时也唯一。
6.2 群、子群与循环群
群的定义是:非空集合G配上运算,满足封闭性、结合律、有单位元、每个元素有逆元。期末考试的大题经常是“设G={1,-1},运算为乘法,验证G构成群”,或者更常见的是“证明G上的模n加法构成群”。
验证一个代数系统是群,按部就班走四步就好:
- 封闭性:任取a,b∈G,证明a∘b∈G。
- 结合律:这里的结合律通常依赖于运算本身的结合性,比如整数加法结合律是已知的,模n加法的结合律可以由整数加法结合律继承。
- 单位元:找到e,验证e∘x=x∘e=x对任意x成立。
- 逆元:对任意x,找到y,验证x∘y=y∘x=e。
模n加法群这个例子值得反复练:G={0,1,...,n-1},运算⊕定义为a⊕b=(a+b) mod n。单位元是0,a的逆元是n-a(注意0的逆元是0自己)。很多教材会把Zn和循环群、同构联系在一起,理解了这个例子的结构,后面那些抽象概念都能具象化。
子群的判定用的是子群判定定理:非空子集H是群G的子群,当且仅当对任意a,b∈H,有a∘b⁻¹∈H。期末常考“判断一个子集是不是子群”,先用这个定理,比重新验证群的四条定义快得多。
循环群的定义是:群G中存在一个元素g,使得G中每个元素都是g的某次幂。比如整数加法群Z是无限循环群,由1生成。模n加法群Zn是n阶循环群,由1生成。循环群的重要性质:循环群的子群仍是循环群;同阶循环群在结构上没有区别。这个“结构相同”的思想就是同构,而两个有限循环群同构当且仅当阶相同。
6.3 格与布尔代数(部分院校选考)
格是偏序集里每对元素都有最小上界和最大下界的结构。布尔代数则是满足补元存在的有界分配格。如果你们的课程讲过这块,期末一般只考典型例子:任何集合的幂集配上包含关系构成布尔代数,运算分别是并、交、补。判断一个代数系统是不是布尔代数,就看它是否满足幂等律、交换律、结合律、吸收律、分配律和补元律。这部分的证明题通常不难,按定义逐条验证就行。
我复习代数系统时最深的体会是:这一章是整门离散数学里最抽象的,但只要抓住“群=集合+运算+四条性质”这个核心,再配一两个具体例子(整数加法、模n加法、正实数乘法),其他概念都能挂上去理解。
7. 易错点速查与考前最后一晚的复习方法
7.1 十大高频失分点整理
为了考试前不慌乱,我把这些年做题踩过的坑和批改同学作业看到的高频错误统一整理成了一张速查表,分享给大家:
| 疑难点 | 错误理解 | 正确理解 |
|---|---|---|
| 空集 vs 空集元素 | ∅不属于任何集合 | ∅是任何集合的子集,但空集可以属于某个集合,如∅∈{∅} |
| P→Q的逆命题 | 逆命题和原命题等价 | 只有逆否命题¬Q→¬P与原命题等价 |
| 全称量词与蕴含 | “所有鸟会飞”用∧连接 | 翻译为∀x(Bird(x)→Fly(x)) |
| 存在量词与合取 | “有的鸟会飞”用→连接 | 翻译为∃x(Bird(x)∧Fly(x)) |
| 反对称关系 | 反对称就是不对称 | 允许(x,x)存在;只要不存在x≠y且xy,yx都在即可 |
| 传递闭包 | 只补一次两步链 | 反复补到彻底传递为止,用Warshall算法更保险 |
| 极大元/最大元 | 最大元和极大元一样 | 最大元唯一且大于等于所有元素,极大元可以有多个 |
| 欧拉与哈密顿 | 两个都能一笔画 | 欧拉图看度数,哈密顿图看是否经过每个顶点恰好一次 |
| 最小生成树算法 | 随便选n-1条边 | 必须保证无回路,Kruskal要检查连通性 |
| 群验证 | 只验证封闭性 | 封闭、结合、单位元、逆元四步缺一不可 |
这张表我建议考前一晚上从头到尾过一遍,比重新看一遍书效率高得多。
7.2 考前一天怎么做:公式卡 + 真题限时
复习的最后一天,我不建议再去看新题难题。正确做法是:把整本书的公式和定理手写在一张A4纸上。不要直接复印别人的,必须自己写。手写的过程就是在头脑里做一次索引重建,写到一半忘记的那个公式,就是你的薄弱点,赶紧翻书确认。
写完公式卡之后,做一套限时真题。限时的意思是严格按考试时间来做,到点停笔。真题不用多,一套就够,关键是做完之后对答案时,重点分析“是概念没懂还是步骤不完整”导致的丢分。如果是证明题步骤不完整,那就把标准答案的书写格式抄一遍:每一步写上用了什么定理或定义,养成习惯。
我个人的经验是:离散数学期末复习,真正的决胜点不在智商,而在要不要去消化那些“看起来懂了但一做就错”的细节。把试卷上的常见陷阱在脑子里过一遍,再把计算流程(闭包、生成树、范式、群验证)练到形成肌肉记忆,这门课拿一个漂亮的分数完全做得到。考场上碰到不会的题也别慌,先从定义出发,把已知条件一条条列出来,走两步往往就柳暗花明了。