Lec5 Relations(4)
Lec5 Relations(4)
我认为这一章是最难的,图论和树论那里都很简单,一开始的逻辑那里其实感觉比较多。
就把你放到最后解决好了,关系!😎
关系的闭包
主要任务是了解三种闭包,结合之前的三种性质。
闭包是指对于任何具有某一特定性质的集合,如何得到这个集合的最小超集,使得超集具有该性质。以下是不同类型关系闭包的定义和构造方法:
1. 自反闭包 (Reflexive Closure)
自反闭包是一个关系的最小超集,具有自反性质。自反性质要求每个元素与自身相关联。
构造方法:为了得到一个关系
R
在集合A
上的自反闭包,我们需要将(a, a)
对添加到R
中,针对集合A
中的每个元素a
,即: $ R_{} = R {(a, a) a A} $例子: 假设
Adore = {(a, b), (b, c), (c, c)}
,Adore
的自反闭包是: $ Adore_{} = {(a, b), (b, c), (c, c), (a, a), (b, b)} $
2. 对称闭包 (Symmetric Closure)
对称闭包是一个关系的最小超集,具有对称性质。对称性质要求如果
(a, b)
属于关系 R
,则 (b, a)
也必须属于关系 R
。
构造方法:为了得到一个关系
R
的对称闭包,我们需要将每个(a, b)
添加一个(b, a)
,即: $ R_{} = R R^{-1} $ 其中,R^{-1}
表示关系R
的逆关系,即将所有的有序对(a, b)
变为(b, a)
。例子: 假设
Detest = {(b, d), (c, a), (c, b)}
,Detest
的对称闭包是: $ Detest_{} = {(b, d), (c, a), (c, b), (d, b), (a, c), (b, c)} $
3. 传递闭包 (Transitive Closure)
传递闭包是一个关系的最小超集,具有传递性质。传递性质要求如果
(a, b)
和 (b, c)
都在关系中,则
(a, c)
也必须在关系中。
构造方法:为了得到一个关系
R
的传递闭包,我们需要“重复地”将所有可以通过已有边连接的元素对添加到R
中。具体来说,如果(a, b)
和(b, c)
都在关系中,我们就将(a, c)
添加到关系中。可以通过反复添加这种关系,直到不能再添加任何新的对为止。例子: 假设
Adore = {(a, b), (b, c), (c, c)}
,Adore
的传递闭包是: $ Adore_{} = {(a, b), (b, c), (c, c), (a, c)} $ 因为(a, b)
和(b, c)
存在,所以我们添加(a, c)
。假设
Detest = {(b, d), (c, a), (c, b)}
,Detest
的传递闭包是: $ Detest_{} = {(b, d), (c, a), (c, b), (c, d), (a, b)} $ 因为(c, b)
和(b, d)
存在,所以我们添加(c, d)
;又因为(c, a)
和(a, b)
存在,所以我们添加(c, b)
。
闭包的解决方案
两个例子,帮助大家理解闭包这个概念。9
1. 自反闭包(Reflexive Closure)
自反闭包是一个关系的最小超集,具有自反性质。对于任何给定的关系 $ R $ 和集合 $ A $,其自反闭包是通过将所有自反对 $ (a, a) $ 添加到原关系中得到的。
问题:
给定关系 $ R = { (a, b) | a < b } $ 在整数集 $ $
上,求其自反闭包。
解决方案:
自反闭包的定义是:
$ R_{} = R $ 其中,$= { (a, a) | a } $ 表示所有自反对。
原关系是 $ { (a, b) | a < b } $,我们需要将所有自反对 $ (a, a) $
加入到关系中。
因此,自反闭包是:
$ R_{} = { (a, b) | a b } $ 这个关系包含所有 $ a < b $ 和 $ a = b $
的对。
2. 对称闭包(Symmetric Closure)
对称闭包是一个关系的最小超集,具有对称性质。对于任何给定的关系 $ R $,其对称闭包是通过将每个有序对的逆对添加到原关系中得到的。
问题:
给定关系 $ R = { (a, b) | a > b } $ 在正整数集 $ ^+ $
上,求其对称闭包。
解决方案:
对称闭包的定义是:
$ R_{} = R R^{-1} $ 其中,$ R^{-1} $ 表示关系的逆关系,即将所有的有序对
$ (a, b) $ 替换为 $ (b, a) $。
原关系是 $ R = { (a, b) | a > b } $,其逆关系是 $ R^{-1} = { (b, a) |
b > a } \(。
因此,对称闭包是:\) R_{} = { (a, b) | a > b } { (b, a) | b
> a } $ 这个关系包含了所有 $ a b $ 的对,因为无论是 $ a > b $ 还是
$ b > a \(,都在对称闭包中。
所以,最终的对称闭包是:\) R_{} = { (a, b) | a b } $
连接关系 $ R^* $ 的定义
给定一个集合 $ A $ 上的关系 $ R $,我们可以定义关系 $ R^* $ 为连接关系,它由所有能够通过 $ R $ 的路径连接的有序对 $ (a, b) $ 组成。换句话说,关系 $ R^* $ 包括了所有存在至少一条从 $ a $ 到 $ b $ 的路径的有序对。
形式化定义 $ R^* $
定义:
连接关系 $ R^* $ 是关系 $ R $ 的闭包,包含所有通过有限次应用 $ R $
可以从一个元素到达另一个元素的有序对。
具体来说,$ R^* $ 可以通过递归的方式定义如下:
基础情况:
$ R^0 = I = { (a, a) a A } $ 这是包含所有自反对的关系,也就是说,每个元素与自身有关系。递归步骤:
$ R^k = R^{k-1} R k > 0 $ 其中,$ R^k $ 表示通过 $ k $ 次关系应用得到的有序对的集合。连接关系:
连接关系 $ R^* $ 是 $ R $ 的闭包,可以表示为: $ R^* = _{k=0}^{n} R^k $ 其中 $ n $ 是集合 $ A $ 的大小。即 $ R^* $ 是从 0 次应用到 $ n $ 次应用的所有关系的并集。
解释
- 路径:如果从元素 $ a $ 到元素 $ b $ 存在一条路径(即通过一个或多个关系应用),则 $ (a, b) $ 会出现在连接关系 $ R^* $ 中。
- 自反性:因为每个元素都与自身有关系,所以 $ R^0 = I $ 包含了所有自反对。
- 递归步骤:通过应用关系 $ R $,我们不断扩展连接关系,直到所有通过路径可以到达的元素对都被包括在内。
关系 $ R^n $ 和 $ R^* $
1. 关系 $ R^n $
假设 $ R $ 是全世界所有人集合上的一个关系,包含有序对 $ (a, b) $,如果 $ a $ 曾经见过 $ b $。那么,关系 $ R^n $ 由所有这样的有序对 $ (a, b) $ 组成:存在一系列中间人 $ x_1, x_2, , x_{n-1} $,使得 $ a $ 见过 $ x_1 \(,\) x_1 $ 见过 $ x_2 \(,...,\) x_{n-1} $ 见过 $ b $。
定义:
关系 $ R^n $ 包含所有可以通过 $ n $ 次“见面”连接起来的有序对 $ (a, b)
$。
举个例子:
- 当 $ n = 1 \(,\) R^1 = R $,即 $ a $ 直接见过 $ b $。
- 当 $ n = 2 \(,\) R^2 $ 包含那些 $ a $ 和 $ b $ 之间通过一个中间人相连的有序对。
- 当 $ n = 3 \(,\) R^3 $ 包含那些通过两个中间人相连的有序对。
总之,$ R^n $ 代表了通过 $ n $ 次“见面”连接的所有有序对。
2. 关系 $ R^* $
关系 $ R^* $ 是 $ R $ 的传递闭包(transitive closure),它包含所有通过路径连接的有序对。也就是说,如果有一系列人 $ a x_1 x_2 x_{n-1} b $,则 $ (a, b) $ 属于 $ R^* $。
定义:
关系 $ R^* $ 包含所有能够通过至少一条路径(无论路径长短)从 $ a $ 到 $ b
$ 连接的有序对 $ (a, b) $。
定理:
$ R^* $ 是关系 $ R $ 的传递闭包。具体来说,$ R^* $ 是 $ R $
的最小传递超集。
3. $ R^* $ 的证明
证明 $ R^* $ 是传递的:
假设 $ x R^n y $ 且 $ y R^m z $,即存在路径从 $ x $ 到 $ y $,以及从 $ y $ 到 $ z $。根据传递性,我们知道 $ x $ 可以通过 $ R $ 连接到 $ z $,即 $ x R^{n+m} z \(。因此,\) R^* $ 是传递的。
证明 $ R^* $ 是最小的传递超集:
假设存在一个传递超集 $ S $ 包含 $ R $,且 $ S $ 比 $ R^* $ 小。那么,存在一对 $ (x, y) $ 满足 $ x R^* y $ 但 $ x S $。但因为 $ R S $,则 $ x S^n y $,根据 $ S $ 的传递性,我们可以推断 $ x S y \(,这与假设矛盾。因此,\) R^* $ 是最小的传递超集。
4. 小贴士
- 关系 $ R $ 在集合 $ A $ 上是传递的,当且仅当对于所有的 $ n $,关系 $ R^n R $,即 $ R $ 的 $ n $-次幂包含在 $ R $ 中。
引理:路径长度的上界
1. 引理内容
设 $ A $ 是一个具有 $ n $ 个元素的集合,$ R $ 是 $ A $ 上的一个关系。
如果在关系 $ R $ 中从 $ a $ 到 $ b $ 存在一条长度至少为 1 的路径,则从 $ a $ 到 $ b $ 存在一条长度不超过 $ n $ 的路径。此外,当 $ a b $ 时,如果存在从 $ a $ 到 $ b $ 的路径长度至少为 1,则存在一条路径,其长度不超过 $ n-1 $。
2. 证明
假设从 $ a $ 到 $ b $ 存在一条路径,设这条路径的最短长度为 $ m $。
设路径为 $ x_0, x_1, x_2, , x_m $,其中 $ x_0 = a $ 且 $ x_m = b $,那么路径的长度是 $ m $。
证明步骤:
- 假设 $ a = b $,且 $ m > n $,所以 $ m n+1 $。
- 根据抽屉原理,由于集合 $ A $ 中有 $ n $ 个顶点,路径中的 $ m $ 个顶点($ x_0, x_1, , x_{m-1} $)中,至少有两个顶点是相同的。
- 假设 $ x_i = x_j $,其中 $ 0 i j m-1 $。
- 那么路径中从 $ x_i $ 到 $ x_i $ 之间存在一个回路(cycle)。
- 可以删除这个回路,剩下的路径从 $ a $ 到 $ b $ 的长度将变短,即路径的长度小于 $ m $。
- 那么路径中从 $ x_i $ 到 $ x_i $ 之间存在一个回路(cycle)。
- 这意味着,最短路径的长度必须小于等于 $ n $。
因此,从 $ a $ 到 $ b $ 的最短路径的长度不超过 $ n $。
3. 结论:传递闭包
根据引理 1,关系 $ R^* $ 可以表示为:
$ R^* = R^1 R^2 R^3 R^n $
也就是说,关系 $ R $ 的传递闭包 $ R^* $ 等于关系 $ R $ 的 $ 1 \(-次幂、\) 2 \(-次幂、\) 3 $-次幂,直到 $ n $-次幂的并集。
4. 总结
- 引理表明,从 $ a $ 到 $ b $ 的路径长度有上限,不超过 $ n $(当 $ a b $ 时,不超过 $ n-1 $)。
- 传递闭包 $ R^* $ 可以通过合并从 $ R $ 的不同幂次(即 $ R^1, R^2, , R^n $)得到。
传递闭包的零一矩阵
设 $ M(R) $ 是关系 $ R $ 在具有 $ n $ 个元素的集合上的零一矩阵。则关系 $ R^* $ 的传递闭包的零一矩阵 $ M(R^*) $ 可以表示为:
$ M(R^*) = M(R) M(R)^2 M(R)^3 M(R)^n $
1. 证明思路
这个公式的证明与引理 1 类似,通过不断求关系的幂来构造传递闭包。具体来说,零一矩阵 $ M(R)^i $ 表示关系 $ R $ 的第 $ i $ 次幂,而 $ $ 表示按位“或”运算(即元素的集合并集)。
2. 计算过程:传递闭包的计算过程
我们可以通过以下步骤计算关系 $ R $ 的传递闭包的零一矩阵 $ M(R^*) $:
- 初始化:设 $ A := M(R) $,即将 $ R $ 的零一矩阵赋给 $ A $。
- 循环更新:使用一个循环来计算每次幂次的零一矩阵,并将结果加入到集合中:
- 对于每次 $ i $ 从 2 到 $ n $,执行以下操作:
- 计算 $ A := A M(R) $,这里的 $ $ 是矩阵乘法。
- 更新 $ B := B A $,即将当前的结果加入到已有的矩阵中(按位“或”)。
- 对于每次 $ i $ 从 2 到 $ n $,执行以下操作:
- 结束:最终,矩阵 $ B $ 就是传递闭包 $ R^* $ 的零一矩阵。
3. 算法流程
以下是计算传递闭包的具体算法:
1 | A := M(R) // 初始化,A为R的零一矩阵 |
4. 解释
- 矩阵乘法($ o $):矩阵乘法计算两个矩阵的点积,表示关系的合成。
- 按位“或”运算($ $):对两个矩阵中相同位置的元素进行“或”操作,相当于将所有的路径信息合并起来。
- 最终,矩阵 $ B $ 包含了所有通过关系 $ R $ 达到的路径(包括直接路径和间接路径),即 $ R^* $ 的零一矩阵。
例子如下:
Warshall 算法:计算传递闭包 $ R^* $
Warshall 算法(也称为 Roy-Warshall 算法)是计算关系 $ R $ 的传递闭包 $ R^* $ 的一种快速算法。该算法基于零一矩阵的构造。通过逐步构造零一矩阵的序列来完成传递闭包的计算。
算法描述
设 $ M(R) $ 为关系 $ R $ 的零一矩阵,Warshall 算法通过一系列矩阵 $ W(0), W(1), , W(n) $ 来计算传递闭包。具体步骤如下:
- 初始化:
- $ W(0) = M(R) $,即初始化矩阵 $ W(0) $ 为关系 $ R $ 的零一矩阵。
- 递推定义:
- 对于 $ k = 1, 2, , n $,定义矩阵 $ W(k) $ 的元素 $ w_{ij}(k) $ 为: $ w_{ij}(k) = \[\begin{cases} 1, & \text{如果从 } v_i \text{ 到 } v_j \text{ 存在路径,且路径的内部顶点都属于 } \{ v_1, v_2, \dots, v_k \} \\ 0, & \text{否则} \end{cases}\] $
- 通过递推公式: $ w_{ij}(k) = w_{ij}(k-1) (w_{ik}(k-1) w_{kj}(k-1)) $ 其中 $ $ 表示按位“或”操作,$ $ 表示按位“与”操作。
- 结束:
- 最终,$ W(n) $ 即为关系 $ R^* $ 的零一矩阵 $ M(R^*) $。
算法步骤
- 初始化:
- $ W := M(R) $,将关系 $ R $ 的零一矩阵赋给矩阵 $ W $。
- 递推计算:
- 对于每个 $ k $ 从 1 到 $ n $:
- 对于每个 $ i $ 从 1 到 $ n $:
- 对于每个 $ j $ 从 1 到 $ n \(:\) w_{ij}(k) = w_{ij}(k-1) (w_{ik}(k-1) w_{kj}(k-1)) $
- 对于每个 $ i $ 从 1 到 $ n $:
- 对于每个 $ k $ 从 1 到 $ n $:
- 输出:
- 最终矩阵 $ W $ 即为 $ M(R^) $,即关系 $ R^ $ 的零一矩阵。
算法流程
以下是 Warshall 算法的具体流程:
1 | W := M(R) // 初始化W为R的零一矩阵 |
解释
- 矩阵乘法:在这个算法中,$ w_{ij}(k) $ 的值依赖于矩阵 $ W(k-1) $ 的元素。具体地,矩阵的每一项更新是基于路径的传递关系,即如果存在从 $ v_i $ 到 $ v_j $ 的路径,并且该路径通过 $ v_k $,则更新 $ w_{ij}(k) $ 为 1。
- 按位操作:这里的按位“与”和“或”操作确保了所有可能的路径都被考虑到。
例子
算法复杂度
- Warshall 算法的时间复杂度为 $ O(n^3) $,其中 $ n $ 是集合中的元素个数。每一对元素 $ (i, j) $ 在每次迭代中都可能受到每个中间顶点 $ k $ 的影响,因此算法需要三层嵌套循环。
总结
Warshall 算法是计算传递闭包的经典算法,利用矩阵表示和递推方式,可以高效地计算关系的传递闭包。通过逐步更新零一矩阵,最终得到表示传递闭包的矩阵 $ M(R^*) $。