关系是某个集合与另一个集合的笛卡尔积的子集。关系包含其定义集合中元素的有序对。要了解更多关于关系的内容,请参考“关系及其类型”这篇文章。
什么是传递关系?
集合 A 上的关系 R 被称为传递关系,当且仅当
> ∀ a, b, c ∈ A,如果 (a, b) ∈ R 且 (b, c) ∈ R,那么 (a, c) ∈ R,
> 其中 R 是 (A x A) 的子集,即集合 A 与其自身的笛卡尔积。
这意味着,如果关系 R 中存在从元素 “a” 到 “b” (aRb) 以及从 “b” 到 “c” (bRc) 的有序对,那么从元素 “a” 到 “c” (aRC) 的有序对也应该存在于关系 R 中。如果对于 R 中的任意 aRb 和 bRc,存在任何这样的 aRc 不包含在内,则 R 不是传递关系。
示例:
> 考虑集合 A = {a, b, c}
>
> R = {(a, b), (b, c), (a, c)} 是传递关系,但是
> R = {(a, b), (b, c)} 不是传递关系
传递关系的性质
- 任何集合上的空关系总是传递的。
- 任何集合上的全域关系总是传递的。
如何验证传递关系?
要验证传递关系:
- 首先,在关系中找出形式为 aRb & bRc 的元组。
- 对于每一对这样的组合,检查 aRc 是否也存在于 R 中。
- 如果任何一个元组不存在,则该关系不是传递的;否则,它是传递的。
请查看下方的图解以便更好地理解
图解:
> 考虑集合 R = {(1, 2), (1, 3), (2, 3), (3, 4)}
>
> 对于组合 (1, 2) 和 (2, 3):
> => 关系 (1, 3) 存在
> => 这满足条件。
>
> 对于组合 (1, 3) 和 (3, 4):
> => 关系 (1, 4) 不存在
> => 这不满足条件。
>
> 所以该关系不是传递的。
下面是该思路的代码实现:
C++
CODEBLOCK_812024b1
Java
“
// 实现该方法的 Java 代码
import java.io.*;
import java.util.*;
class pair {
int first, second;
pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
class GFG {
static class Relation {
boolean checkTransitive(Set R)
{
// 性质 1
if (R.size() == 0) {
return true;
}
// 创建一个哈希映射来存储元组作为键值对
HashMap<Integer, Set > tup
= new HashMap();
// 创建关系的哈希映射,其中 是键
// 而 (b) 是