1. 离散数学第二章到底在讲什么
1.1 从“集合”到“关系”:这一章的核心脉络
离散数学第二章,绝大多数教材安排的都是关系。但很多人翻开书第一眼看到的却是“二元关系”“笛卡尔积”“自反闭包”这些词,直接就被劝退了。我当初学这一章的时候也是这个感觉——明明第一章命题逻辑还能靠真值表硬推,到了第二章突然全是符号和定义,完全不知道在干什么。
后来刷了几套题、又回头把章节从头捋了一遍,才发现这一章的脉络其实非常清晰:集合是基础,笛卡尔积是工具,关系是主角,闭包和等价关系是应用。整章就是围绕“两个集合里的元素之间怎么建立联系”这件事展开的。你把这条线抓住,后面那些定义就不是孤立的了。
具体来说,这一章要解决的核心问题是:给定两个集合A和B,它们之间的元素可以按照某种规则配对,这些配对构成的整体就是“关系”。然后我们关心这个关系有什么性质(自反、对称、传递),能不能通过运算得到新的关系(复合、逆),以及怎么把一个不满足性质的关系“修补”成满足性质的关系(闭包)。最后落到两类特殊关系上:等价关系和偏序关系,它们分别对应“分类”和“排序”这两种最基本的数学操作。
提示:如果你用的是国内常见的那几本教材,第二章的标题可能叫“二元关系”也可能叫“关系”,但内容范围基本一致。先翻目录确认一下章节边界,别把第三章的函数内容混进来。
1.2 为什么这一章让这么多人卡住
我观察下来,卡住的原因主要有三个。
第一个是符号密度突然变大。第一章命题逻辑虽然也有符号,但好歹还能翻译成大白话。到了关系这一章,一个定义里能出现五六个新符号,比如“R⊆A×B”“∀a∈A, (a,a)∈R”这种,读起来像天书。其实这些符号拆开看都不难,难的是它们堆在一起的时候大脑处理不过来。
第二个是定义之间的依赖关系没理清。比如“自反”和“反自反”是互斥的但不是互补的(一个关系可以既不自反也不反自反),“对称”和“反对称”也是类似的情况。很多人学到后面把前面的定义忘了,做题的时候张冠李戴。
第三个是觉得这东西没用。我当初也这么想——关系关系,跟我写代码有什么关系?后来做数据库的范式分析、做编译原理的语法分析,才发现关系代数那套东西全是这一章的地基。甚至你平时用的Excel筛选、SQL的JOIN操作,底层都是二元关系在撑着。这么一想,学它的动力就足多了。
1.3 学完这一章你应该具备什么能力
给自己定个验收标准,学完这一章你应该能做到以下几件事:
- 给定一个具体的关系(比如“整除关系”“模3同余关系”),能判断它是否满足自反、对称、传递等性质
- 能计算两个关系的复合和逆关系
- 能求一个关系的自反闭包、对称闭包、传递闭包
- 能判断一个关系是不是等价关系,如果是,能写出它的等价类
- 能画出一个偏序关系的哈斯图,并找出极大元、极小元、最大元、最小元
- 能把关系用集合、矩阵、有向图三种方式表示,并在它们之间自由转换
这六条你要是都能做到,这一章就算过关了。下面我按这个目标来拆解每个知识点的核心细节。
2. 核心概念逐个拆解
2.1 有序对与笛卡尔积:关系的原材料
有序对就是两个元素按固定顺序放在一起,记作(a,b)。关键在“有序”两个字——(a,b)和(b,a)是不同的,除非a=b。这个看起来简单,但后面很多性质的判断都依赖这一点。
笛卡尔积A×B就是把A中每个元素和B中每个元素配对,所有可能的配对构成一个集合。比如A={1,2},B={x,y},那A×B={(1,x),(1,y),(2,x),(2,y)}。如果A有m个元素,B有n个元素,A×B就有m×n个元素。
这里有个容易踩的坑:A×B和B×A一般不一样。上面那个例子,B×A={(x,1),(x,2),(y,1),(y,2)},跟A×B完全不同。只有当A=B或者其中一个为空集的时候,两者才可能相等。我当初做课后题的时候就在这上面栽过,题目问A×B=B×A的条件,我直接写了A=B,其实还要考虑空集的情况。
注意:空集参与笛卡尔积的规则是A×∅=∅,∅×B=∅。这个在证明题里经常用到,别记反了。
2.2 关系的定义与三种表示法
关系R就是从A×B中取一个子集。如果(a,b)∈R,就说a和b有关系R,记作aRb。如果A=B,就说R是A上的关系。
关系的三种表示法必须都会,因为不同题目用不同表示法做起来效率差很多:
集合表示法最直接,就是把所有有序对列出来。适合元素少的情况,元素一多就写不下了。
矩阵表示法(关系矩阵)适合判断性质和做复合运算。行对应A的元素,列对应B的元素,如果(aᵢ,bⱼ)∈R,矩阵第i行第j列就是1,否则是0。判断自反就看主对角线是不是全1,判断对称就看矩阵是不是对称矩阵。复合运算直接做布尔矩阵乘法,比一个个配对快得多。
有向图表示法适合直观理解。每个元素画一个节点,如果(a,b)∈R就画一条从a到b的有向边。自反就是每个节点都有自环,对称就是每条边都有反向边,传递就是如果有a→b和b→c就一定有a→c。
我个人的习惯是:判断性质用矩阵,理解含义用图,写证明用集合。三种切换着来,效率最高。
2.3 五大性质:自反、反自反、对称、反对称、传递
这五个性质是这一章的核心考点,必须烂熟于心。我逐个说清楚,顺便把容易混淆的地方标出来。
自反性:对A中每个元素a,都有(a,a)∈R。关键词是“每个”。只要有一个元素没有自环,就不满足自反。
反自反性:对A中每个元素a,都有(a,a)∉R。关键词还是“每个”。注意自反和反自反不是互补的——一个关系可以既不自反也不反自反。比如A={1,2,3},R={(1,1),(2,2)},它既不是自反的(3没有自环),也不是反自反的(1和2有自环)。
对称性:如果(a,b)∈R,那么(b,a)∈R。注意这里不要求a≠b,所以自环不影响对称性。
反对称性:如果(a,b)∈R且(b,a)∈R,那么a=b。换句话说,除了自环之外,不能有双向边。这里最容易搞混的是“反对称”不是“不对称”——反对称允许自环存在,只是不允许两个不同元素之间有双向边。
传递性:如果(a,b)∈R且(b,c)∈R,那么(a,c)∈R。这个性质判断起来最麻烦,因为要检查所有可能的三元组。用矩阵表示的话,就是M²的每个非零位置在M中也是非零的。
我整理了一个速查表,做题的时候对照着看:
| 性质 | 集合语言 | 矩阵特征 | 图特征 |
|---|---|---|---|
| 自反 | ∀a∈A, (a,a)∈R | 主对角线全1 | 每个节点有自环 |
| 反自反 | ∀a∈A, (a,a)∉R | 主对角线全0 | 每个节点无自环 |
| 对称 | (a,b)∈R→(b,a)∈R | 矩阵对称 | 边成对出现 |
| 反对称 | (a,b)∈R∧(b,a)∈R→a=b | 非对角元不能同时为1 | 不同节点间无双向边 |
| 传递 | (a,b)∈R∧(b,c)∈R→(a,c)∈R | M²≤M(布尔) | 有路径必有直达边 |
实操心得:判断传递性的时候,先看有没有长度为2的路径。如果没有,直接判定满足传递性。如果有,再检查每条长度为2的路径是否都有对应的直达边。这样比盲目检查所有三元组快很多。
2.4 复合运算与逆关系
关系的复合本质上就是“接力”:R是从A到B的关系,S是从B到C的关系,那R∘S就是从A到C的关系,定义为{(a,c) | ∃b∈B, (a,b)∈R且(b,c)∈S}。
这里有个符号方向的坑。不同教材对复合的记法可能不同,有的写R∘S表示先R后S,有的反过来。做题之前先确认你用的教材是哪种约定,不然结果会反。我当初换了一本参考书就对不上了,折腾了好久。
用矩阵做复合最方便:R的矩阵乘以S的矩阵,乘法用布尔运算(加法是逻辑或,乘法是逻辑与),得到的就是复合关系的矩阵。元素少的时候手算也不容易出错。
逆关系就是把所有有序对反过来,R⁻¹={(b,a) | (a,b)∈R}。矩阵表示就是转置,图表示就是把所有边反向。逆关系有个好用的性质:(R∘S)⁻¹=S⁻¹∘R⁻¹,注意顺序要反过来。
2.5 闭包:把关系“修补”成想要的样子
闭包这个概念第一次看会觉得抽象,其实用一句话就能说清楚:给一个关系加上最少的元素,让它满足某个性质。
自反闭包r(R)=R∪I_A,其中I_A是恒等关系{(a,a) | a∈A}。就是把所有缺失的自环补上。
对称闭包s(R)=R∪R⁻¹。就是把所有单向边变成双向边。
传递闭包t(R)最复杂,需要反复加边直到没有新的长度为2的路径为止。手工计算的时候用Warshall算法最靠谱,虽然名字听起来吓人,但步骤很机械,照着做就行。
Warshall算法的核心思想是:对于每个中间节点k,检查所有节点对(i,j),如果i能到k且k能到j,就让i能到j。用矩阵表示就是三重循环,代码写出来不到十行:
def warshall(M, n): # M是n×n的布尔矩阵 for k in range(n): for i in range(n): for j in range(n): M[i][j] = M[i][j] or (M[i][k] and M[k][j]) return M这个算法的时间复杂度是O(n³),对于手工计算来说,n一般不超过5,完全够用。
注意:传递闭包的计算容易漏边。我的经验是每轮迭代后把矩阵画出来,标出新增的1,下一轮基于新矩阵继续。别跳步,跳步必错。
3. 两类特殊关系:等价与偏序
3.1 等价关系与集合的划分
等价关系就是同时满足自反、对称、传递三个性质的关系。它之所以重要,是因为它和“划分”是一一对应的。
给定一个等价关系R,我们可以把集合A分成若干个等价类。每个等价类里的元素互相等价,不同等价类之间的元素不等价。所有等价类构成的集合就是A的一个划分。
举个最经典的例子:模3同余关系。在整数集上定义aRb当且仅当a-b能被3整除。这是一个等价关系,它把整数分成了三个等价类:余0的、余1的、余2的。这三个类互不相交,并起来正好是全体整数。
判断等价关系的关键是三个性质缺一不可。我见过有人只验证了自反和对称就下结论,结果传递性不满足,整个判断就错了。传递性的验证不能偷懒。
3.2 偏序关系与哈斯图
偏序关系是同时满足自反、反对称、传递三个性质的关系。注意这里是对称换成了反对称。
偏序关系描述的是“排序”的概念,但不是所有元素都能比较。比如集合的包含关系⊆就是一个偏序关系:A⊆A(自反),A⊆B且B⊆A则A=B(反对称),A⊆B且B⊆C则A⊆C(传递)。但两个集合之间可能互不包含,所以不是任意两个元素都能比较。
哈斯图是偏序关系的专用图示法,画法有讲究:
- 去掉所有自环(因为自反是默认的)
- 去掉所有由传递性产生的边(只保留“直接覆盖”关系)
- 把方向隐含在位置中——如果a<b,就把a画在b下面
画哈斯图的时候,层级关系要搞清楚。如果a<b且中间没有其他元素c使得a<c<b,就说b覆盖a,哈斯图里画一条从a到b的线。这个“覆盖”的概念是画图的关键。
在哈斯图上找特殊元素:
- 极大元:没有比它更大的元素(可能在最上层,但最上层可能有多个)
- 极小元:没有比它更小的元素
- 最大元:比所有元素都大(如果存在,一定唯一,且一定是极大元)
- 最小元:比所有元素都小(如果存在,一定唯一,且一定是极小元)
最大元和极大元的区别是高频考点。最大元要求跟所有元素都可比较且最大,极大元只要求没有比它更大的。一个偏序集可能有多个极大元但没有最大元。
4. 常见问题与排查技巧
4.1 性质判断的典型错误
我整理了几个最容易出错的地方,做题的时候重点检查:
错误一:把“反自反”当成“不自反”。反自反要求每个元素都没有自环,不自反只需要有一个元素没有自环就行。这两个条件强弱完全不同。
错误二:反对称和对称搞混。对称是“有a→b就有b→a”,反对称是“有a→b和b→a就说明a=b”。一个关系可以既对称又反对称,比如恒等关系。
错误三:传递性验证不完整。只检查了部分三元组就下结论。必须检查所有满足前件的情况。
错误四:闭包计算时顺序搞错。求传递闭包的时候,每加一条边都可能产生新的长度为2的路径,必须迭代到不动点为止。
4.2 复合运算的排查方法
复合运算R∘S出错,通常是因为:
- 中间集合B的元素没对齐
- 复合顺序搞反了
- 布尔矩阵乘法当成了普通乘法
排查方法:先用集合表示法手动配几对,再用矩阵验证。如果两种方法结果一致,基本就不会错了。
4.3 哈斯图绘制的注意事项
哈斯图画错通常是因为:
- 忘了去掉传递边
- 层级位置画错,导致方向混乱
- 覆盖关系判断错误
我的建议是先用集合表示法列出所有有序对,然后逐个判断覆盖关系,最后再画图。画完之后从下往上检查一遍,看有没有遗漏的覆盖关系。
5. 我踩过的坑和总结的技巧
5.1 符号系统的统一
不同教材的符号约定可能不同,比如复合的记法、闭包的记法、甚至自反闭包的符号都有差异。我的建议是:以你上课用的教材为准,其他参考书只用来对照理解,不要混用符号。我当初就是看了两本书,符号混着用,做题的时候自己都搞不清在写什么。
5.2 从具体例子入手
遇到抽象的定义,先找一个具体的例子套进去。比如学等价关系的时候,先用模3同余这个例子把定义走一遍,再回头看抽象定义就清楚多了。学偏序关系的时候,先用集合包含关系走一遍。具体例子是理解抽象概念的最短路径。
5.3 三种表示法的转换练习
我强烈建议做这样一个练习:随便写一个关系,分别用集合、矩阵、图表示出来,然后从每种表示法出发判断五个性质。这个练习做上五六组,这一章的核心内容就通了。我当时是找了课后习题里所有的关系题,每组都画了矩阵和图,虽然费时间,但做完之后做题速度明显上来了。
5.4 等价类与划分的对应关系
等价关系和划分是一一对应的,这个结论在做题的时候非常有用。如果题目让你求一个等价关系对应的划分,你只需要把等价类找出来就行。反过来,如果给你一个划分,让你构造对应的等价关系,你就把每个划分块里的元素两两配对,再加上自环,就得到了等价关系。
这个对应关系在数据库的范式分解里也有应用,不过那是后话了。
5.5 传递闭包的快速计算
手工计算传递闭包的时候,Warshall算法虽然机械但容易算错。我的技巧是:先把关系矩阵写出来,然后逐列处理。处理第k列的时候,看这一列哪些行是1,这些行对应的行向量全部按位或到其他行上。这样比三重循环手算快,而且不容易漏。
举个例子,如果第2列的第1行和第3行是1,那就把第1行和第3行分别或到所有行上。这个操作可以批量做,比一个个元素检查快得多。
5.6 偏序关系中的特殊元素
找极大元、极小元、最大元、最小元的时候,直接在哈斯图上操作最直观:
- 极大元:没有向上的边连出去的节点
- 极小元:没有向下的边连进来的节点
- 最大元:如果存在一个节点能到达所有其他节点(沿向上的路径),它就是最大元
- 最小元:如果存在一个节点能被所有其他节点到达,它就是最小元
注意最大元/最小元可能不存在,但极大元/极小元一定存在(有限偏序集)。
这一章的内容看起来多,但核心就是“关系”这一个概念在不同角度下的展开。把定义吃透,把三种表示法练熟,把等价和偏序这两类特殊关系搞清楚,后面第三章的函数就是水到渠成的事。我当初在这一章花了大概两周时间,前一周完全在云里雾里,后一周把课后题刷了一遍才突然通透。所以如果你现在也觉得懵,别急,多做题,做着做着就明白了。