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^* $ 可以通过递归的方式定义如下:

  1. 基础情况:
    $ R^0 = I = { (a, a) a A } $ 这是包含所有自反对的关系,也就是说,每个元素与自身有关系。

  2. 递归步骤:
    $ R^k = R^{k-1} R k > 0 $ 其中,$ R^k $ 表示通过 $ k $ 次关系应用得到的有序对的集合。

  3. 连接关系:
    连接关系 $ 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 $。
  • 这意味着,最短路径的长度必须小于等于 $ 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^*) $:

  1. 初始化:设 $ A := M(R) $,即将 $ R $ 的零一矩阵赋给 $ A $。
  2. 循环更新:使用一个循环来计算每次幂次的零一矩阵,并将结果加入到集合中:
    • 对于每次 $ i $ 从 2 到 $ n $,执行以下操作:
      1. 计算 $ A := A M(R) $,这里的 $ $ 是矩阵乘法。
      2. 更新 $ B := B A $,即将当前的结果加入到已有的矩阵中(按位“或”)。
  3. 结束:最终,矩阵 $ B $ 就是传递闭包 $ R^* $ 的零一矩阵。

3. 算法流程

以下是计算传递闭包的具体算法:

1
2
3
4
5
6
7
A := M(R)        // 初始化,A为R的零一矩阵
B := A // 将A赋给B
for i := 2 to n // 从2到n进行循环
begin
A := A o M(R) // 计算A与M(R)的矩阵乘积
B := B ∨ A // 将A与B按位“或”合并
end // 循环结束,B就是R*的零一矩阵

4. 解释

  • 矩阵乘法($ o $):矩阵乘法计算两个矩阵的点积,表示关系的合成。
  • 按位“或”运算($ $):对两个矩阵中相同位置的元素进行“或”操作,相当于将所有的路径信息合并起来。
  • 最终,矩阵 $ B $ 包含了所有通过关系 $ R $ 达到的路径(包括直接路径和间接路径),即 $ R^* $ 的零一矩阵。

例子如下:

image-20241121161648324

Warshall 算法:计算传递闭包 $ R^* $

Warshall 算法(也称为 Roy-Warshall 算法)是计算关系 $ R $ 的传递闭包 $ R^* $ 的一种快速算法。该算法基于零一矩阵的构造。通过逐步构造零一矩阵的序列来完成传递闭包的计算。

算法描述

设 $ M(R) $ 为关系 $ R $ 的零一矩阵,Warshall 算法通过一系列矩阵 $ W(0), W(1), , W(n) $ 来计算传递闭包。具体步骤如下:

  1. 初始化
    • $ W(0) = M(R) $,即初始化矩阵 $ W(0) $ 为关系 $ R $ 的零一矩阵。
  2. 递推定义
    • 对于 $ 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)) $ 其中 $ $ 表示按位“或”操作,$ $ 表示按位“与”操作。
  3. 结束
    • 最终,$ W(n) $ 即为关系 $ R^* $ 的零一矩阵 $ M(R^*) $。

算法步骤

  1. 初始化
    • $ W := M(R) $,将关系 $ R $ 的零一矩阵赋给矩阵 $ W $。
  2. 递推计算
    • 对于每个 $ k $ 从 1 到 $ n $:
      • 对于每个 $ i $ 从 1 到 $ n $:
        • 对于每个 $ j $ 从 1 到 $ n \(:\) w_{ij}(k) = w_{ij}(k-1) (w_{ik}(k-1) w_{kj}(k-1)) $
  3. 输出
    • 最终矩阵 $ W $ 即为 $ M(R^) $,即关系 $ R^ $ 的零一矩阵。

算法流程

以下是 Warshall 算法的具体流程:

1
2
3
4
5
6
7
8
9
10
11
12
W := M(R)              // 初始化W为R的零一矩阵
for k := 1 to n // 对每个k从1到n进行循环
begin
for i := 1 to n // 对每个i从1到n进行循环
begin
for j := 1 to n // 对每个j从1到n进行循环
begin
// 更新w_ij(k)为w_ij(k-1)与w_ik(k-1)和w_kj(k-1)按位与后的或操作结果
w_ij(k) = w_ij(k-1) ∨ (w_ik(k-1) ∧ w_kj(k-1))
end
end
end // 循环结束,W即为M(R*)

解释

  • 矩阵乘法:在这个算法中,$ w_{ij}(k) $ 的值依赖于矩阵 $ W(k-1) $ 的元素。具体地,矩阵的每一项更新是基于路径的传递关系,即如果存在从 $ v_i $ 到 $ v_j $ 的路径,并且该路径通过 $ v_k $,则更新 $ w_{ij}(k) $ 为 1。
  • 按位操作:这里的按位“与”和“或”操作确保了所有可能的路径都被考虑到。

例子

image-20241121161952639

算法复杂度

  • Warshall 算法的时间复杂度为 $ O(n^3) $,其中 $ n $ 是集合中的元素个数。每一对元素 $ (i, j) $ 在每次迭代中都可能受到每个中间顶点 $ k $ 的影响,因此算法需要三层嵌套循环。

总结

Warshall 算法是计算传递闭包的经典算法,利用矩阵表示和递推方式,可以高效地计算关系的传递闭包。通过逐步更新零一矩阵,最终得到表示传递闭包的矩阵 $ M(R^*) $。

应用

image-20241121162139176
image-20241121162147047
image-20241121162155301
image-20241121162224808
image-20241121162231838
image-20241121162238866