2.2. 集合与关系¶
2.2.1. 集合记号¶
数学意义上的集合概念在计算机科学中有广泛的应用。集合论的记号与技巧常用于描述和实现算法,因为与集合相关的抽象往往有助于澄清和简化算法设计。
一个 集合 是可区分的 成员 或 元素 的汇集。成员通常取自某个更大的总体,称为 基类型 。集合的每个成员要么是基类型的 原始元素 ,要么本身就是一个集合。集合中没有重复的概念。基类型中的每个值要么在集合中,要么不在集合中。例如,一个名为 \(\mathbf{P}\) 的集合可能由 7、11 和 42 这三个整数组成。此时, \(\mathbf{P}\) 的成员是 7、11 和 42,基类型是整数。
下表列出常用于表示集合及其关系的符号。
下面是这些记号的一些使用示例。首先定义两个集合 \(\mathbf{P}\) 和 \(\mathbf{Q}\) 。
\(|\mathbf{P}| = 3\) (因为 \(\mathbf{P}\) 有三个成员),而 \(|\mathbf{Q}| = 2\) (因为 \(\mathbf{Q}\) 有两个成员)。这两个集合的长度都是有限的。其他集合可以是无限的,例如整数集合。
\(\mathbf{P}\) 与 \(\mathbf{Q}\) 的并集,写作 \(\mathbf{P} \cup \mathbf{Q}\) ,是出现在 \(\mathbf{P}\) 或 \(\mathbf{Q}\) 中的元素构成的集合,即 {2, 3, 5, 10}。 \(\mathbf{P}\) 与 \(\mathbf{Q}\) 的交集,写作 \(\mathbf{P} \cap \mathbf{Q}\) ,是同时出现在 \(\mathbf{P}\) 和 \(\mathbf{Q}\) 中的元素构成的集合,即 {5}。 \(\mathbf{P}\) 与 \(\mathbf{Q}\) 的差集,写作 \(\mathbf{P} - \mathbf{Q}\) ,是出现在 \(\mathbf{P}\) 中但不在 \(\mathbf{Q}\) 中的元素构成的集合,即 {2, 3}。注意 \(\mathbf{P} \cup \mathbf{Q} = \mathbf{Q} \cup \mathbf{P}\) ,以及 \(\mathbf{P} \cap \mathbf{Q} = \mathbf{Q} \cap \mathbf{P}\) ,但一般而言 \(\mathbf{P} - \mathbf{Q} \neq \mathbf{Q} - \mathbf{P}\) 。在本例中, \(\mathbf{Q} - \mathbf{P} = \{10\}\) 。最后,集合 {5, 3, 2} 与集合 \(\mathbf{P}\) 无法区分,因为集合没有顺序的概念。同样,集合 {2, 3, 2, 5} 也与 \(\mathbf{P}\) 无法区分,因为集合没有重复元素的概念。
两个集合的 集合积 或 笛卡尔积 \(\mathbf{Q} \times \mathbf{P}\) 是有序对的集合。对我们的示例集合而言,集合积为
集合 \(\mathbf{S}\) 的 幂集 (记作 \(2^S\) )是 \(\mathbf{S}\) 的所有可能子集构成的集合。考虑集合 \(\mathbf{S} = \{ a, b, c \}\) 。 \(\mathbf{S}\) 的幂集是
一个元素无序(像集合一样)但允许元素值重复的汇集称为 包 [1]。为了把包与集合区分开,我们用方括号 [] 把包的元素括起来。例如,包 [3, 4, 5, 4] 不同于包 [3, 4, 5],而集合 {3, 4, 5, 4} 与集合 {3, 4, 5} 无法区分。然而,包 [3, 4, 5, 4] 与包 [3, 4, 4, 5] 无法区分。
序列 是一种元素有序的汇集,且可以包含值重复的元素。序列有时也称为 元组 或 向量 。在序列中,有第 0 个元素、第 1 个元素、第 2 个元素,依此类推。我们用尖括号 \(\langle\rangle\) 把序列的元素括起来。例如, \(\langle3, 4, 5, 4\rangle\) 是一个序列。注意序列 \(\langle3, 5, 4, 4\rangle\) 不同于序列 \(\langle3, 4, 5, 4\rangle\) ,而且两者都不同于序列 \(\langle3, 4, 5\rangle\) 。
2.2.1.1. 关系¶
集合 \(\mathbf{S}\) 上的一个 关系 \(R\) 是取自 \(\mathbf{S}\) 的有序对的集合。作为关系的一个例子,如果 \(\mathbf{S}\) 是 \(\{a, b, c\}\) ,则
是一个关系,而
是另一个不同的关系。如果元组 \(\langle x, y\rangle\) 在关系 \(R\) 中,我们可以使用中缀记号 \(xRy\) 。我们经常使用诸如自然数上的小于运算符( \(<\) )这样的关系,它包含诸如 \(\langle1, 3\rangle\) 和 \(\langle2, 23\rangle\) 这样的有序对,但不包含 \(\langle3, 2\rangle\) 或 \(\langle2, 2\rangle\) 。我们通常不按有序对来写这种关系,而是对其使用中缀记号,写作 \(1<3\) 。
定义关系的性质如下,其中 \(R\) 是集合 \(\mathbf{S}\) 上的二元关系。
\(R\) 是 自反的 ,如果对所有的 \(a \in \mathbf{S}\) 都有 \(aRa\) 。
\(R\) 是 非自反的 ,如果对所有的 \(a \in \mathbf{S}\) , \(aRa\) 都不成立。
\(R\) 是 对称的 ,如果对所有的 \(a, b \in \mathbf{S}\) ,只要 \(aRb\) 就有 \(bRa\) 。
\(R\) 是 反对称的 ,如果对所有的 \(a, b \in \mathbf{S}\) ,只要 \(aRb\) 且 \(bRa\) ,就有 \(a = b\) 。
\(R\) 是 传递的 ,如果对所有的 \(a, b, c \in \mathbf{S}\) ,只要 \(aRb\) 且 \(bRc\) ,就有 \(aRc\) 。
作为例子,对自然数而言, \(<\) 是非自反的(因为 \(aRa\) 从不为真)、反对称的(因为不存在 \(aRb\) 且 \(bRa\) 的情形)且传递的。关系 \(\leq\) 是自反的、反对称的且传递的。关系 \(=\) 是自反的、对称的(而且反对称!)、且传递的。对于人而言,"是……的兄弟"这一关系是对称的且传递的。如果我们把一个人定义为自身的兄弟,那么它是自反的;如果我们把一个人定义为不是自身的兄弟,那么它不是自反的。
2.2.2. 等价关系¶
如果 \(R\) 是自反的、对称的且传递的,那么它就是 集合 \(\mathbf{S}\) 上的一个 等价关系 。 等价关系可用于把集合划分成 等价类 。 如果两个元素 \(a\) 和 \(b\) 彼此等价, 我们写作 \(a \equiv b\) 。 集合 \(\mathbf{S}\) 的一个 划分 是一组 彼此 不相交 且并集为 \(\mathbf{S}\) 的子集。 集合 \(\mathbf{S}\) 上的一个 等价关系 把 该集合划分成元素彼此等价的互不相交子集。 UNION/FIND 算法能高效地 维护集合上的等价类。 这类 不相交集合 的一个应用是计算 最小生成树 。
Example 2.2.1
对整数而言, \(=\) 是一个等价关系,它把每个元素划分到各自不同的子集中。换句话说,对任意整数 \(a\) ,以下三点成立。
\(a = a\) ,
如果 \(a = b\) ,则 \(b = a\) ;并且
如果 \(a = b\) 且 \(b = c\) ,则 \(a = c\) 。
当然,对于互不相同的整数 \(a\) 、 \(b\) 和 \(c\) ,永远不会出现 \(a = b\) 、 \(b = a\) 或 \(b = c\) 的情形。因此对称性和传递性的要求从未被违反,所以该关系是对称的且传递的。
Example 2.2.2
如果我们把兄弟的定义明确为一个人是自身的兄弟,那么兄弟关系就是一个等价关系,它划分了人的集合。
Example 2.2.3
我们可以用 取模 函数来定义一个等价关系。 对于整数集合,用取模函数定义一个二元关系,使得两个数 \(x\) 和 \(y\) 满足该关系当且仅当 \(x \bmod m = y \bmod m\) 。于是,当 \(m = 4\) 时, \(\langle1, 5\rangle\) 满足该关系,因为 \(1 \bmod 4 = 5 \bmod 4\) 。我们看到,以这种方式使用的取模定义了整数上的一个等价关系,而该关系可用于把整数划分为 \(m\) 个等价类。这个关系是等价关系,因为
对所有的 \(x\) 都有 \(x \bmod m = x \bmod m\) ;
如果 \(x \bmod m = y \bmod m\) ,则 \(y \bmod m = x \bmod m\) ;并且
如果 \(x \bmod m = y \bmod m\) 且 \(y \bmod m = z \bmod m\) ,则 \(x \bmod m = z \bmod m\) 。
2.2.3. 偏序¶
如果二元关系是反对称的且传递的,就称为 偏序 。如果该关系是自反的,就称为 非严格偏序 。如果该关系是 非自反的 ,就称为 严格偏序 。定义偏序的集合称为 偏序集 或 偏序集 。如果集合中的元素 \(x\) 和 \(y\) 满足 \(xRy\) 或 \(yRx\) ,则称它们在给定关系 \(R\) 下是 可比的 。如果偏序中每一对不同元素都是可比的,则该序称为 全序 或 线性序 。
Example 2.2.4
对整数而言,关系 \(<\) 和 \(\leq\) 定义偏序。运算 \(<\) 是全序,因为对于每一对满足 \(x \neq y\) 的整数 \(x\) 和 \(y\) ,要么 \(x < y\) ,要么 \(y < x\) 。同样, \(\leq\) 也是全序,因为对于每一对满足 \(x \neq y\) 的整数 \(x\) 和 \(y\) ,要么 \(x \leq y\) ,要么 \(y \leq x\) 。
Example 2.2.5
对于整数的幂集,子集运算符定义了一个偏序(因为它是反对称的且传递的)。例如, \(\{1, 2\}\subseteq\{1, 2, 3\}\) 。然而,集合 {1, 2} 和 {1, 3} 无法按子集运算符比较,因为两者都不是另一个的子集。因此,子集运算符并未在整数的幂集上定义全序。
