在数学中(特别是集合论和序理论),偏序关系(partial order relation)是一种二元关系,它满足自反性、反对称性和传递性三个基本性质。以下是其精确定义:
设 S S S 是一个非空集合(集合中的元素可以是任意对象)。一个二元关系 R R R 定义在 S S S 上(即 R ⊆ S × S R \subseteq S \times S R ⊆ S × S ),称为偏序关系,当且仅当它满足自反性(Reflexivity),反对称性(Antisymmetry)和传递性(Transitivity) 。一个集合 S S S 与定义在集合上的偏序关系 R R R 被称作偏序集(partially ordered set, 或 poset) ,表示为 ( S , R ) (S, R) ( S , R ) ,S S S 的成员被成为偏序集的元素。
习惯上,在任意偏序集( S , R ) (S, R) ( S , R ) ,符号 a ⪯ b a \preceq b a ⪯ b 被用来表示( a , b ) ∈ R (a, b) \in R ( a , b ) ∈ R 。偏序关系也通常用符号≤ \leq ≤ 表示,当( a , b ) ∈ ≤ (a, b) \in \leq ( a , b ) ∈≤ 时,记作a ≤ b a \leq b a ≤ b 。
如果一个偏序集合( S , ⪯ ) (S, \preceq) ( S , ⪯ ) 上的元素 a a a 和 b b b 满足a ⪯ b a \preceq b a ⪯ b 或b ⪯ a b \preceq a b ⪯ a ,我们称它们是可比较的(comparable) 。如果既不满足a ⪯ b a \preceq b a ⪯ b 也不满足 b ⪯ a b \preceq a b ⪯ a ,则a a a 和 b b b 是不可比较(incomparable) 。
如果存在偏序集( S , ⪯ ) (S, \preceq ) ( S , ⪯ ) ,并且S S S 中的每个元素都是可比较的,则 S S S 是全序集(totally ordered set)或线型序集(linearly ordered set) ,⪯ \preceq ⪯ 是全序(total order)或 线性序(linear order) 。一个全序集有时也被称作 链(chain) 。
如果偏序集( S , ⪯ ) (S, \preceq) ( S , ⪯ ) 的 ⪯ \preceq ⪯ 是全序并且S S S 的每个非空子集都至少含有一个元素,则 ( S , ⪯ ) (S, \preceq) ( S , ⪯ ) 是良序集(well-ordered set) 。
Lexicographic Order(字典序)是一种基于已有顺序 为序列 (如字符串、元组、列表或笛卡尔积)定义全序关系 的方法。其名称来源于字典中单词的排列规则:先比较首字母,若相同则比较第二个字母,依此类推。
设两个序列 A = ( a 1 , a 2 , … , a m ) A = (a_1, a_2, \dots, a_m) A = ( a 1 , a 2 , … , a m ) 和 B = ( b 1 , b 2 , … , b n ) B = (b_1, b_2, \dots, b_n) B = ( b 1 , b 2 , … , b n ) ,且序列元素所属的集合 S S S 上已定义全序关系 ≤ \leq ≤ (如字母顺序、数值大小)。字典序 ≤ lex \leq_{\text{lex}} ≤ lex 定义为:
A ≤ lex B ⟺ { ∃ k ≤ min ( m , n ) : ∀ i < k , a i = b i ∧ a k ≤ b k , (前 k − 1 个元素相等,第 k 个元素决定顺序) 或 m ≤ n ∧ ∀ i ≤ m , a i = b i . ( A 是 B 的前缀) A \leq_{\text{lex}} B \iff \begin{cases} \exists \, k \leq \min(m, n) : \\ \quad \forall i < k, \, a_i = b_i \, \land \, a_k \leq b_k, \quad \text{(前 \(k-1\) 个元素相等,第 \(k\) 个元素决定顺序)} \\ \text{或} \\ m \leq n \, \land \, \forall i \leq m, \, a_i = b_i. \quad \text{(\(A\) 是 \(B\) 的前缀)} \end{cases} A ≤ lex B ⟺ ⎩ ⎨ ⎧ ∃ k ≤ min ( m , n ) : ∀ i < k , a i = b i ∧ a k ≤ b k , (前 k − 1 个元素相等,第 k 个元素决定顺序) 或 m ≤ n ∧ ∀ i ≤ m , a i = b i . ( A 是 B 的前缀)
全序性 (Total Order):
若底层元素集 S S S 是全序集,则字典序也是全序(任意两个序列可比)。 例如:字母集 S = { a , b , c , … , z } S = \{a, b, c, \dots, z\} S = { a , b , c , … , z } 按字母表顺序是全序,因此单词序列按字典序全序排列。 递归比较 :
从第一个元素开始逐位比较,直到找到差异或一个序列结束。 示例:比较 (2, 3, 5) 和 (2, 3, 4, 9): 前两位相同 ( 2 = 2 , 3 = 3 ) (2=2, 3=3) ( 2 = 2 , 3 = 3 ) → 比较第三位:5 > 4 5 > 4 5 > 4 → 故 (2, 3, 5) > (2, 3, 4, 9)。 前缀规则 :
若一序列是另一序列的前缀,则前缀更小。 示例:"cat" < "catalog"(因 "cat" 是 "catalog" 的前缀)。 严格字典序(Strict Lexicographic Order) 定义严格版本 < lex <_{\text{lex}} < lex :
A < lex B ⟺ A ≤ lex B ∧ A ≠ B . A <_{\text{lex}} B \iff A \leq_{\text{lex}} B \land A \neq B. A < lex B ⟺ A ≤ lex B ∧ A = B .
示例:"apple" < "apply"(前四位相同 appl,第五位 e < y)。 底层为偏序的情况 若元素集 S S S 仅有偏序 (非全序),则字典序仅为偏序 :
示例:设 S = { x , y } S = \{x, y\} S = { x , y } 且 x x x 与 y y y 不可比(即既非 x ≤ y x \leq y x ≤ y 也非 y ≤ x y \leq x y ≤ x ),则: 序列( x , y ) (x, y) ( x , y ) 和( y , x ) (y, x) ( y , x ) 在字典序下不可比 (因首元素不可比)。 Hasse 图是用于可视化有限偏序集 (Partially Ordered Set, Poset)的简约图示方法,它通过省略冗余边(可由传递性和自反性推导出的关系),仅保留覆盖关系 (covering relations),从而清晰展现偏序结构。
核心思想与定义
覆盖关系(Covering Relation) : 在偏序集 ( P , ≤ ) (P, \leq) ( P , ≤ ) 中,元素 b b b 覆盖 元素 a a a (记作 a ⋖ b a \lessdot b a ⋖ b ),当且仅当:
a < b a < b a < b (即 a ≤ b a \leq b a ≤ b 且 a ≠ b a \neq b a = b ),不存在 中间元素 z z z 满足 a < z < b a < z < b a < z < b 。 例如:在整除序中,2 2 2 覆盖 1 1 1 (因无整数 z z z 满足 1 < z < 2 1 < z < 2 1 < z < 2 ),但 4 4 4 不直接覆盖 1 1 1 (因存在 2 2 2 满足 1 < 2 < 4 1 < 2 < 4 1 < 2 < 4 )。 Hasse 图的构建原则 :
顶点 :每个元素表示为平面上的点。边 :仅当 b b b 覆盖 a a a 时,从 a a a 到 b b b 画一条无向线段 (约定俗成:若 a < b a < b a < b ,则 b b b 画在 a a a 上方)。省略 : 自反性:不画 a ≤ a a \leq a a ≤ a 的自环。 传递性:若 a ⋖ b a \lessdot b a ⋖ b 且 b ⋖ c b \lessdot c b ⋖ c ,则不直接画 a a a 到 c c c 的边(由路径隐含)。 绘制步骤
分层排列 :
将极小元 (minimal elements,无更小元素)置于底层。 若 b b b 覆盖 a a a ,则 b b b 放置在 a a a 正上方(或斜上方)。 同一水平层的元素不可比 (incomparable)。 恢复完整偏序 :
a ≤ b a \leq b a ≤ b 当且仅当存在一条从 a a a 到 b b b 的向上路径 (路径可能经过多条边)。关键性质
简约性 :边数 ≤ ∣ P ∣ − 1 \leq |P| - 1 ≤ ∣ P ∣ − 1 (远少于完整偏序图的 O ( ∣ P ∣ 2 ) O(|P|^2) O ( ∣ P ∣ 2 ) 条边)。无环 :不含回路(因偏序是反对称的)。方向隐含 :所有边隐含向上 方向(无需箭头)。经典示例
例1:集合 S = { 1 , 2 , 3 } S = \{1,2,3\} S = { 1 , 2 , 3 } 的幂集(子集包含序 ⊆ \subseteq ⊆ )
元素 :∅ , { 1 } , { 2 } , { 3 } , { 1 , 2 } , { 1 , 3 } , { 2 , 3 } , { 1 , 2 , 3 } \emptyset, \{1\}, \{2\}, \{3\}, \{1,2\}, \{1,3\}, \{2,3\}, \{1,2,3\} ∅ , { 1 } , { 2 } , { 3 } , { 1 , 2 } , { 1 , 3 } , { 2 , 3 } , { 1 , 2 , 3 } 覆盖关系 : ∅ ⋖ { 1 } , ∅ ⋖ { 2 } , ∅ ⋖ { 3 } \emptyset \lessdot \{1\}, \emptyset \lessdot \{2\}, \emptyset \lessdot \{3\} ∅ ⋖ { 1 } , ∅ ⋖ { 2 } , ∅ ⋖ { 3 } { 1 } ⋖ { 1 , 2 } , { 1 } ⋖ { 1 , 3 } \{1\} \lessdot \{1,2\}, \{1\} \lessdot \{1,3\} { 1 } ⋖ { 1 , 2 } , { 1 } ⋖ { 1 , 3 } { 2 } ⋖ { 1 , 2 } , { 2 } ⋖ { 2 , 3 } \{2\} \lessdot \{1,2\}, \{2\} \lessdot \{2,3\} { 2 } ⋖ { 1 , 2 } , { 2 } ⋖ { 2 , 3 } { 3 } ⋖ { 1 , 3 } , { 3 } ⋖ { 2 , 3 } \{3\} \lessdot \{1,3\}, \{3\} \lessdot \{2,3\} { 3 } ⋖ { 1 , 3 } , { 3 } ⋖ { 2 , 3 } { 1 , 2 } ⋖ { 1 , 2 , 3 } , { 1 , 3 } ⋖ { 1 , 2 , 3 } , { 2 , 3 } ⋖ { 1 , 2 , 3 } \{1,2\} \lessdot \{1,2,3\}, \{1,3\} \lessdot \{1,2,3\}, \{2,3\} \lessdot \{1,2,3\} { 1 , 2 } ⋖ { 1 , 2 , 3 } , { 1 , 3 } ⋖ { 1 , 2 , 3 } , { 2 , 3 } ⋖ { 1 , 2 , 3 } Hasse 图 :
例2:整除序(D 12 = { 1 , 2 , 3 , 4 , 6 , 12 } D_{12} = \{1,2,3,4,6,12\} D 12 = { 1 , 2 , 3 , 4 , 6 , 12 } ,关系为整除)
覆盖关系 : 1 ⋖ 2 , 1 ⋖ 3 1 \lessdot 2, 1 \lessdot 3 1 ⋖ 2 , 1 ⋖ 3 2 ⋖ 4 , 2 ⋖ 6 2 \lessdot 4, 2 \lessdot 6 2 ⋖ 4 , 2 ⋖ 6 3 ⋖ 6 3 \lessdot 6 3 ⋖ 6 4 ⋖ 12 , 6 ⋖ 12 4 \lessdot 12, 6 \lessdot 12 4 ⋖ 12 , 6 ⋖ 12 Hasse 图 :
在偏序集( S , ⪯ ) (S, \preceq) ( S , ⪯ ) 中,如果不存在一个元素 b b b 满足 a ≺ b a \prec b a ≺ b ,则 a a a 是最大的(Maximal) 。同样的,如果不存在元素 b b b 满足 b ≺ a b \prec a b ≺ a ,则 a a a 是最小的(Minimal) 。
对于偏序集( S , ⪯ ) (S, \preceq) ( S , ⪯ ) ,对于所有b ∈ S b \in S b ∈ S ,总满足 b ⪯ a b \preceq a b ⪯ a ,则 a a a 是偏序集中的最大元素(Greatest element) 。如果最大元素存在,那么它是唯一的。同样,对于所有b ∈ S b \in S b ∈ S ,总满足 a ⪯ b a \preceq b a ⪯ b ,则 a a a 是偏序集中的最小元素(Least element) 。
在偏序集( P , ⪯ ) (P, \preceq) ( P , ⪯ ) 中,设S ⊆ P S \sube P S ⊆ P 是任意子集:
1. 上界 (Upper Bound)
定义 :元素 u ∈ P u \in P u ∈ P 称为 S S S 的上界 ,当且仅当:
∀ s ∈ S , s ⪯ u \forall s \in S, \, s \preceq u ∀ s ∈ S , s ⪯ u
性质 : 上界可能不存在(如 (S) 无界) 上界不一定唯一(可能有多个) 上界不一定属于 (S)(通常 u ∉ S u \notin S u ∈ / S ) 2. 下界 (Lower Bound)
定义 :元素 l ∈ P l \in P l ∈ P 称为 S S S 的下界 ,当且仅当:
∀ s ∈ S , l ⪯ s \forall s \in S, \, l \preceq s ∀ s ∈ S , l ⪯ s
性质 : 下界可能不存在 下界不一定唯一 下界不一定属于 S S S 示例 :
子集{ a , b , c } \{a,b,c\} { a , b , c } 的上界是 e , f , j e,f,j e , f , j 和 h h h 。它的下界只有 a a a 。子集 { j , h } \{j,h\} { j , h } 没有上界,它的下界是 a , b , c , d , e a, b, c, d, e a , b , c , d , e 和 f f f 。a , c , d , f a, c, d, f a , c , d , f 的上界是 f , h f, h f , h 和 j j j ,它的下界是 a a a 。
3. 最小上界 (Least Upper Bound, LUB) / 上确界 (Supremum)
定义 :元素 sup S ∈ P \sup S \in P sup S ∈ P 称为 S S S 的最小上界 ,当且仅当:
( 1 ) sup S 是 S 的上界 ( 2 ) ∀ u ∈ P , 若 u 是 S 的上界,则 sup S ⪯ u \begin{aligned} &(1) \ \sup S \text{ 是 } S \text{ 的上界} \\ &(2) \ \forall u \in P, \, \text{若 } u \text{ 是 } S \text{ 的上界,则 } \sup S \preceq u \end{aligned} ( 1 ) sup S 是 S 的上界 ( 2 ) ∀ u ∈ P , 若 u 是 S 的上界,则 sup S ⪯ u
性质 : 若存在则唯一(由反对称性保证) 记作 sup S \sup S sup S 或 ⋁ S \bigvee S ⋁ S 不一定属于 S S S 示例 :
S = ( 0 , 1 ) ⊆ R S = (0, 1) \subseteq \mathbb{R} S = ( 0 , 1 ) ⊆ R : sup S = 1 \sup S = 1 sup S = 1 ( 1 ∉ S ) (1 \notin S) ( 1 ∈ / S ) S = { x ∈ Q ∣ x 2 < 2 } ⊆ R : S = \{ x \in \mathbb{Q} \mid x^2 < 2 \} \subseteq \mathbb{R}: S = { x ∈ Q ∣ x 2 < 2 } ⊆ R : sup S = 2 ( \sup S = \sqrt{2}( sup S = 2 ( 无理数)不存在例 :在 Q \mathbb{Q} Q 中,S = { x ∈ Q ∣ x 2 < 2 } S = \{ x \in \mathbb{Q} \mid x^2 < 2 \} S = { x ∈ Q ∣ x 2 < 2 } 无最小上界(因 2 ∉ Q ) \sqrt{2} \notin \mathbb{Q}) 2 ∈ / Q ) 4. 最大下界 (Greatest Lower Bound, GLB) / 下确界 (Infimum)
定义 :元素 inf S ∈ P \inf S \in P inf S ∈ P 称为 S S S 的最大下界 ,当且仅当:
( 1 ) inf S 是 S 的下界 ( 2 ) ∀ l ∈ P , 若 l 是 S 的下界,则 l ⪯ inf S \begin{aligned} &(1) \ \inf S \text{ 是 } S \text{ 的下界} \\ &(2) \ \forall l \in P, \, \text{若 } l \text{ 是 } S \text{ 的下界,则 } l \preceq \inf S \end{aligned} ( 1 ) inf S 是 S 的下界 ( 2 ) ∀ l ∈ P , 若 l 是 S 的下界,则 l ⪯ inf S
性质 : 若存在则唯一 记作 inf S \inf S inf S 或 ⋀ S \bigwedge S ⋀ S 不一定属于 S S S 示例 :
S = ( 0 , 1 ) ⊆ R S = (0, 1) \subseteq \mathbb{R} S = ( 0 , 1 ) ⊆ R : inf S = 0 \inf S = 0 inf S = 0 ( 0 ∉ S ) (0 \notin S) ( 0 ∈ / S ) S = { 1 n ∣ n ∈ N } ⊆ R S = \{ \frac{1}{n} \mid n \in \mathbb{N} \} \subseteq \mathbb{R} S = { n 1 ∣ n ∈ N } ⊆ R : inf S = 0 ( \inf S = 0( inf S = 0 ( 0 ∉ S ) 0 \notin S) 0 ∈ / S ) 存在性定理
实数完备性公理 : 在 ( R , ≤ ) (\mathbb{R}, \leq) ( R , ≤ ) 中,任意有上界的非空子集 必有最小上界(sup S \sup S sup S 存在)。
格 (Lattice) : 若偏序集 ( P , ≤ ) (P, \leq) ( P , ≤ ) 中,任意两个元素 { a , b } \{a, b\} { a , b } 都有最小上界 sup { a , b } \sup\{a,b\} sup { a , b } 和最大下界 inf { a , b } \inf \{a,b\} inf { a , b } ,则称为格 。
示例 : 幂集 ( P ( X ) , ⊆ ) (\mathcal{P}(X), \subseteq) ( P ( X ) , ⊆ ) :sup { A , B } = A ∪ B \sup\{A,B\} = A \cup B sup { A , B } = A ∪ B ,inf { A , B } = A ∩ B \inf\{A,B\} = A \cap B inf { A , B } = A ∩ B 正整数集 ( Z + , ∣ ) (\mathbb{Z}^+, \mid) ( Z + , ∣ ) (整除序):sup { a , b } = lcm ( a , b ) \sup\{a,b\} = \text{lcm}(a,b) sup { a , b } = lcm ( a , b ) ,inf { a , b } = gcd ( a , b ) \inf\{a,b\} = \gcd(a,b) inf { a , b } = g cd( a , b ) 拓扑排序是对有向无环图(DAG) 的顶点进行线性排序的算法,使得对于图中的每条有向边 u → v u \to v u → v ,在排序中 u u u 都出现在 v v v 之前。它反映了顶点间的依赖关系 ,常用于任务调度、编译顺序等场景。
核心概念
有向无环图(DAG) :
有向边:表示顶点间的偏序关系(如任务依赖) 无环:图中不存在循环依赖(否则拓扑排序不可能) 偏序与全序 :
拓扑排序将偏序关系 扩展为全序关系 同一层级的顶点(无直接依赖)可任意排序 算法原理
拓扑排序的核心是逐步移除入度为0的顶点 (无前置依赖的顶点),直到所有顶点被处理。
数学定义
设 DAG G = ( V , E ) G = (V, E) G = ( V , E ) :
V V V :顶点集,∣ V ∣ = n |V| = n ∣ V ∣ = n E E E :有向边集,∣ E ∣ = m |E| = m ∣ E ∣ = m deg − ( v ) \text{deg}^-(v) deg − ( v ) :顶点 v v v 的入度 (指向 v v v 的边数)拓扑排序输出序列 σ = [ v 1 , v 2 , … , v n ] \sigma = [v_1, v_2, \dots, v_n] σ = [ v 1 , v 2 , … , v n ] 满足:
∀ ( u , v ) ∈ E , σ − 1 ( u ) < σ − 1 ( v ) \forall (u, v) \in E, \quad \sigma^{-1}(u) < \sigma^{-1}(v) ∀ ( u , v ) ∈ E , σ − 1 ( u ) < σ − 1 ( v )
其中 σ − 1 ( v ) \sigma^{-1}(v) σ − 1 ( v ) 表示 v v v 在序列中的索引。
算法实现(Kahn 算法)
伪代码
function TopologicalSort(Graph G):
1. 初始化:
- 入度数组 indegree[1..n] ← 0
- 队列 Q ← 空队列
- 结果列表 L ← 空列表
2. 计算入度:
for each 边 (u, v) ∈ E:
indegree[v] ← indegree[v] + 1
3. 初始化队列:
for each 顶点 v ∈ V:
if indegree[v] == 0:
Q.enqueue(v)
4. 处理队列:
while Q 非空:
u ← Q.dequeue()
L.append(u) // 将 u 加入结果
for each 邻接顶点 v of u: // 遍历 u → v 的边
indegree[v] ← indegree[v] - 1
if indegree[v] == 0:
Q.enqueue(v)
5. 检查环:
if |L| < n:
return "图中有环,拓扑排序不存在"
else:
return L 数学符号描述
输入: G = ( V , E ) 输出: σ = [ v 1 , v 2 , … , v n ] 或错误 初始化: ∀ v ∈ V , deg − ( v ) ← ∑ ( u , v ) ∈ E 1 Q ← { v ∈ V ∣ deg − ( v ) = 0 } L ← [ ] 过程: while Q ≠ ∅ : u ← dequeue ( Q ) L . append ( u ) for each v such that ( u , v ) ∈ E : deg − ( v ) ← deg − ( v ) − 1 if deg − ( v ) = 0 : enqueue ( Q , v ) if ∣ L ∣ < ∣ V ∣ : return "Cycle Detected" else: return L \begin{aligned} &\text{输入: } G = (V, E) \\ &\text{输出: } \sigma = [v_1, v_2, \dots, v_n] \text{ 或错误} \\ \\ &\text{初始化:} \\ &\quad \forall v \in V, \text{deg}^-(v) \leftarrow \sum_{(u,v) \in E} 1 \\ &\quad Q \leftarrow \{ v \in V \mid \text{deg}^-(v) = 0 \} \\ &\quad L \leftarrow [] \\ \\ &\text{过程:} \\ &\quad \textbf{while } Q \neq \emptyset: \\ &\quad \quad u \leftarrow \text{dequeue}(Q) \\ &\quad \quad L.\text{append}(u) \\ &\quad \quad \textbf{for each } v \text{ such that } (u, v) \in E: \\ &\quad \quad \quad \text{deg}^-(v) \leftarrow \text{deg}^-(v) - 1 \\ &\quad \quad \quad \textbf{if } \text{deg}^-(v) = 0: \\ &\quad \quad \quad \quad \text{enqueue}(Q, v) \\ \\ &\quad \textbf{if } |L| < |V|: \\ &\quad \quad \textbf{return } \text{"Cycle Detected"} \\ &\quad \textbf{else:} \\ &\quad \quad \textbf{return } L \end{aligned} 输入 : G = ( V , E ) 输出 : σ = [ v 1 , v 2 , … , v n ] 或错误 初始化 : ∀ v ∈ V , deg − ( v ) ← ( u , v ) ∈ E ∑ 1 Q ← { v ∈ V ∣ deg − ( v ) = 0 } L ← [ ] 过程 : while Q = ∅ : u ← dequeue ( Q ) L . append ( u ) for each v such that ( u , v ) ∈ E : deg − ( v ) ← deg − ( v ) − 1 if deg − ( v ) = 0 : enqueue ( Q , v ) if ∣ L ∣ < ∣ V ∣ : return "Cycle Detected" else: return L
算法特性
时间复杂度 :O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O ( ∣ V ∣ + ∣ E ∣ )
计算入度:O ( ∣ E ∣ ) O(|E|) O ( ∣ E ∣ ) 每个顶点入队/出队一次:O ( ∣ V ∣ ) O(|V|) O ( ∣ V ∣ ) 每条边处理一次:O ( ∣ E ∣ ) O(|E|) O ( ∣ E ∣ ) 空间复杂度 :O ( ∣ V ∣ ) O(|V|) O ( ∣ V ∣ )
正确性保证 :
无环图:总能找到拓扑排序 有环图:队列提前空,检测到环 示例演示
顶点入度:
deg − ( A ) = 0 \text{deg}^-(A) = 0 deg − ( A ) = 0 deg − ( B ) = 1 \text{deg}^-(B) = 1 deg − ( B ) = 1 deg − ( C ) = 1 \text{deg}^-(C) = 1 deg − ( C ) = 1 deg − ( D ) = 2 \text{deg}^-(D) = 2 deg − ( D ) = 2 执行过程:
初始列队 Q = { A } Q = \{ A \} Q = { A } 处理 A A A : L = [ A ] L= [ A ] L = [ A ] 更新 B B B 入度 →0,C C C 入度→0 Q = { B , C } Q = \{B, C\} Q = { B , C } (顺序任意) 处理 B B B : L = [ A , B ] L = [A, B] L = [ A , B ] 更新 D D D 入度→1 处理 C C C : L = [ A , B , C ] L = [A, B, C] L = [ A , B , C ] 更新 D D D 入度→0 Q = { D } Q = \{D\} Q = { D } 处理 D D D : L = [ A , B , C , D ] L = [A, B, C, D] L = [ A , B , C , D ] 合法拓扑序:[ A , B , C , D ] [A, B, C, D] [ A , B , C , D ] 或 [ A , C , B , D ] [A, C, B, D] [ A , C , B , D ] 。
格是一种具有特殊代数结构 的偏序集,其中任意两个元素都有唯一的最小上界(join)和最大下界(meet)。
设 ( L , ≤ ) (L, \leq) ( L , ≤ ) 是一个偏序集。若对任意两个元素 a , b ∈ L a, b \in L a , b ∈ L :
最小上界(Join,Supremum ,Least Upper Bound) 存在:sup { a , b } \sup\{a, b\} sup { a , b } 存在,记作 a ∨ b a \vee b a ∨ b 最大下界(Meet,Infimum ,Greatest Lower Bound) 存在:inf { a , b } \inf\{a, b\} inf { a , b } 存在,记作 a ∧ b a \wedge b a ∧ b 则称 ( L , ≤ ) (L, \leq) ( L , ≤ ) 为一个格 (Lattice)。当格满足以下条件时,称为 有界格 :
存在 最小元 ⊥ \bot ⊥ (bottom):∀ a ∈ L , ⊥ ≤ a \forall a \in L, \bot \leq a ∀ a ∈ L , ⊥ ≤ a 存在 最大元 ⊤ \top ⊤ (top):∀ a ∈ L , a ≤ ⊤ \forall a \in L, a \leq \top ∀ a ∈ L , a ≤ ⊤ 在 有界分配格 中,若对元素 a a a 存在元素 b b b 满足:
a ∨ b = ⊤ a \vee b = \top a ∨ b = ⊤ a ∧ b = ⊥ a \wedge b = \bot a ∧ b = ⊥ 则称 b b b 是 a a a 的 逆元 (或 补元 ),记为 b = a ′ b = a' b = a ′ 或 b = ¬ a b = \neg a b = ¬ a
格也可定义为配备两个二元运算 ∨ \vee ∨ (并)和 ∧ \wedge ∧ (交)的集合 L L L ,满足:
交换律 : a ∨ b = b ∨ a a \vee b = b \vee a \quad a ∨ b = b ∨ a a ∧ b = b ∧ a a \wedge b = b \wedge a a ∧ b = b ∧ a 结合律 : ( a ∨ b ) ∨ c = a ∨ ( b ∨ c ) (a \vee b) \vee c = a \vee (b \vee c) \quad ( a ∨ b ) ∨ c = a ∨ ( b ∨ c ) ( a ∧ b ) ∧ c = a ∧ ( b ∧ c (a \wedge b) \wedge c = a \wedge (b \wedge c ( a ∧ b ) ∧ c = a ∧ ( b ∧ c )吸收律 : a ∨ ( a ∧ b ) = a a \vee (a \wedge b) = a \quad a ∨ ( a ∧ b ) = a a ∧ ( a ∨ b ) = a a \wedge (a \vee b) = a a ∧ ( a ∨ b ) = a 偏序关系可通过运算恢复:
a ≤ b ⟺ a ∨ b = b ⟺ a ∧ b = a a \leq b \iff a \vee b = b \iff a \wedge b = a a ≤ b ⟺ a ∨ b = b ⟺ a ∧ b = a
关键特性
有限子集的边界存在性 : 在格中,任意有限非空子集 都有最小上界和最大下界。sup { a 1 , … , a n } = a 1 ∨ ⋯ ∨ a n , inf { a 1 , … , a n } = a 1 ∧ ⋯ ∧ a n \sup\{a_1, \dots, a_n\} = a_1 \vee \cdots \vee a_n, \quad \inf\{a_1, \dots, a_n\} = a_1 \wedge \cdots \wedge a_n sup { a 1 , … , a n } = a 1 ∨ ⋯ ∨ a n , inf { a 1 , … , a n } = a 1 ∧ ⋯ ∧ a n
格同态(Lattice Homomorphism) :
映射 f : L 1 → L 2 f: L_1 \to L_2 f : L 1 → L 2 满足:
f ( a ∨ b ) = f ( a ) ∨ f ( b ) , f ( a ∧ b ) = f ( a ) ∧ f ( b ) f(a \vee b) = f(a) \vee f(b), \quad f(a \wedge b) = f(a) \wedge f(b) f ( a ∨ b ) = f ( a ) ∨ f ( b ) , f ( a ∧ b ) = f ( a ) ∧ f ( b )
子格(Sublattice) :
子集 S ⊆ L S \subseteq L S ⊆ L 对 ∨ \vee ∨ 和 ∧ \wedge ∧ 运算封闭。
有界格(Bounded Lattice)
若存在元素 ⊤ \top ⊤ (最大元)和 ⊥ \bot ⊥ (最小元)满足:
∀ a ∈ L , a ≤ ⊤ , ⊥ ≤ a \forall a \in L, \quad a \leq \top, \quad \bot \leq a ∀ a ∈ L , a ≤ ⊤ , ⊥ ≤ a
此时 ⊥ ∨ a = a \bot \vee a = a ⊥ ∨ a = a ,⊤ ∧ a = a \top \wedge a = a ⊤ ∧ a = a 示例 :幂集格 ( P ( X ) , ⊆ ) (\mathcal{P}(X), \subseteq) ( P ( X ) , ⊆ ) 中,⊤ = X \top = X ⊤ = X ,⊥ = ∅ \bot = \emptyset ⊥ = ∅ 分配格(Distributive Lattice)
满足分配律:
a ∨ ( b ∧ c ) = ( a ∨ b ) ∧ ( a ∨ c ) , a ∧ ( b ∨ c ) = ( a ∧ b ) ∨ ( a ∧ c ) a \vee (b \wedge c) = (a \vee b) \wedge (a \vee c), \quad a \wedge (b \vee c) = (a \wedge b) \vee (a \wedge c) a ∨ ( b ∧ c ) = ( a ∨ b ) ∧ ( a ∨ c ) , a ∧ ( b ∨ c ) = ( a ∧ b ) ∨ ( a ∧ c )
模格(Modular Lattice)
满足模律:
若 a ≤ b , 则 a ∨ ( c ∧ b ) = ( a ∨ c ) ∧ b \text{若 } a \leq b, \text{ 则 } a \vee (c \wedge b) = (a \vee c) \wedge b 若 a ≤ b , 则 a ∨ ( c ∧ b ) = ( a ∨ c ) ∧ b
完备格(Complete Lattice)
任意子集(包括无限子集)都有最小上界和最大下界。
Knaster-Tarski 定理 :完备格上的单调函数有最小不动点1. 子空间格
对于向量空间V V V 的所有子空间构成的偏序集 ( Sub ( V ) , ⊆ ) (\text{Sub}(V), \sube) ( Sub ( V ) , ⊆ ) ,任意两个子空间 W 1 W_1 W 1 和W 2 W_2 W 2 :
交(Meet) :
W 1 ∧ W 2 = W 1 ∩ W 2 W_1 \wedge W_2 = W_1 \cap W_2 W 1 ∧ W 2 = W 1 ∩ W 2
验证:
子空间封闭性:
对任意 u , v ∈ W 1 ∩ W 2 u, v \in W_1 \cap W_2 u , v ∈ W 1 ∩ W 2 和标量 α , β \alpha, \beta α , β :
α u + β v ∈ W 1 且 α u + β v ∈ W 2 ⟹ α u + β v ∈ W 1 ∩ W 2 \alpha u + \beta v \in W_1 \quad \text{且} \quad \alpha u + \beta v \in W_2 \implies \alpha u + \beta v \in W_1 \cap W_2 αu + β v ∈ W 1 且 αu + β v ∈ W 2 ⟹ αu + β v ∈ W 1 ∩ W 2
所以 W 1 ∩ W 2 W_1 \cap W_2 W 1 ∩ W 2 是子空间
最大下界(GLB):
下界性:W 1 ∩ W 2 ⊆ W 1 W_1 \cap W_2 \sube W_1 W 1 ∩ W 2 ⊆ W 1 且 W 1 ∩ W 2 ⊆ W 2 W_1 \cap W_2 \sube W_2 W 1 ∩ W 2 ⊆ W 2 最大性:对任意子空间 U U U 满足 U ⊆ W 1 U \sube W_1 U ⊆ W 1 和 U ⊆ W 2 U \sube W_2 U ⊆ W 2 ,有 U ⊆ W 1 ∩ W 2 U \sube W_1 \cap W_2 U ⊆ W 1 ∩ W 2 和 (Join):
W 1 ∨ W 2 = W 1 + W 2 = { w 1 + w 2 ∣ w 1 ∈ W 1 , w 2 ∈ W 2 } W_1 \vee W_2 = W_1 + W_2 = \{ w_1 + w_2 | w_1 \in W_1, w_2 \in W_2 \} W 1 ∨ W 2 = W 1 + W 2 = { w 1 + w 2 ∣ w 1 ∈ W 1 , w 2 ∈ W 2 }
验证:
子空间封闭性:
对任意 u = u 1 + u 2 u = u_1 + u_2 u = u 1 + u 2 ,v = v 1 + v 2 ∈ W 1 + W 2 v = v_1 + v_2 \in W_1 + W_2 v = v 1 + v 2 ∈ W 1 + W 2 和标量 α , β \alpha, \beta α , β :
α u + β v = ( α u 1 + β v 1 ) ⏟ ∈ W 1 + ( α u 2 + β v 2 ) ⏟ ∈ W 2 ∈ W 1 + W 2 \alpha u + \beta v = \underbrace{(\alpha u_1 + \beta v_1)}_{\in W_1} + \underbrace{(\alpha u_2 + \beta v_2)}_{\in W_2} \in W_1 + W_2 αu + β v = ∈ W 1 ( α u 1 + β v 1 ) + ∈ W 2 ( α u 2 + β v 2 ) ∈ W 1 + W 2
所以 W 1 + W 2 W_1 + W_2 W 1 + W 2 是子空间
最小上界(LUB):
上界性:W 1 ⊆ W 1 + W 2 W_1 \sube W_1 + W_2 W 1 ⊆ W 1 + W 2 (因 w 1 = w 1 + 0 w_1 = w_1 + 0 w 1 = w 1 + 0 ),同理 W 2 ⊆ W 1 + W 2 W_2 \sube W_1 + W_2 W 2 ⊆ W 1 + W 2 最小性:对任意子空间 U U U 满足 W 1 ⊆ U W_1 \sube U W 1 ⊆ U 和 W 2 ⊆ U W_2 \sube U W 2 ⊆ U ,有 w 1 + W 2 ∈ U w_1 + W_2 \in U w 1 + W 2 ∈ U ,故 W 1 + W 2 ⊆ U W_1 + W_2 \sube U W 1 + W 2 ⊆ U 。 格的性质分析:
有界格:
最小元 ⊥ = { 0 } \bot = \{ 0 \} ⊥ = { 0 } (零子空间) 最大元 ⊤ = V \top = V ⊤ = V (全空间) 模格性(Modular Lattice):
子空间格满足模律 :
若 A ⊆ C , 则 A ∨ ( B ∧ C ) = ( A ∨ B ) ∧ C \text{若 } A \sube C \text{, 则 } A \vee (B \wedge C) = (A \vee B) \wedge C 若 A ⊆ C , 则 A ∨ ( B ∧ C ) = ( A ∨ B ) ∧ C
乘积格的核心思想是将两个或多个给定的格组合起来,形成一个新的,更大的格结构。这个新格继承了原始格的性质,并且其元素是原始格元素的元组。
定义
给定两个格 ( L 1 , ⪯ 1 , ∧ 1 , ∨ 1 ) (L_1, \preceq_1, \wedge_1, \vee_1) ( L 1 , ⪯ 1 , ∧ 1 , ∨ 1 ) 和 ( L 2 , ⪯ 2 , ∧ 2 , ∨ 2 ) (L_2, \preceq_2, \wedge_2, \vee_2) ( L 2 , ⪯ 2 , ∧ 2 , ∨ 2 ) ,它们的(直)乘积格 (Direct Product Lattice) 定义为
底层集合(Underlying Set):L 1 × L 2 = { ( x 1 , x 2 ) ∣ x 1 ∈ L 1 , x 2 ∈ L 2 } L_1 \times L_2 = \{ (x_1, x_2) \ | \ x_1 \in L_1, x_2 \in L_2 \} L 1 × L 2 = {( x 1 , x 2 ) ∣ x 1 ∈ L 1 , x 2 ∈ L 2 } (笛卡儿积)。
偏序关系(Partial Order):在 L 1 × L 2 L_1 \times L_2 L 1 × L 2 上定义偏序 ⪯ \preceq ⪯ 如下:
( x 1 , x 2 ) ⪯ ( y 1 , y 2 ) 当且仅当 x 1 ⪯ 1 y 1 且 x 2 ⪯ 2 y 2 (x_1, x_2) \preceq (y_1, y_2) \text{ 当且仅当 } x_1 \preceq_1 y_1 且 x_2 \preceq_2 y_2 ( x 1 , x 2 ) ⪯ ( y 1 , y 2 ) 当且仅当 x 1 ⪯ 1 y 1 且 x 2 ⪯ 2 y 2
这个偏序称为 分量式偏序 (Componentwise Order) 或 乘积偏序 (Product Order)。
交运算(Meet):在 L 1 × L 2 L_1 \times L_2 L 1 × L 2 上定义交运算 ∧ \wedge ∧ 如下
( x 1 , x 2 ) ∧ ( y 1 , y 2 ) = ( x 1 ∧ 1 y 1 , x 2 ∧ 2 y 2 ) (x_1, x_2) \wedge (y_1, y_2) = (x_1 \wedge_1 y_1, x_2 \wedge_2 y_2) ( x 1 , x 2 ) ∧ ( y 1 , y 2 ) = ( x 1 ∧ 1 y 1 , x 2 ∧ 2 y 2 )
即,在每个分量上分别进行原始格的交运算。
并运算(Join):在 L 1 × L 2 L_1 \times L_2 L 1 × L 2 上定义交运算 ∧ \wedge ∧ 如下
( x 1 , x 2 ) ∨ ( y 1 , y 2 ) = ( x 1 ∨ 1 y 1 , x 2 ∨ 2 y 2 ) (x_1, x_2) \vee (y_1, y_2) = (x_1 \vee_1 y_1, x_2 \vee_2 y_2) ( x 1 , x 2 ) ∨ ( y 1 , y 2 ) = ( x 1 ∨ 1 y 1 , x 2 ∨ 2 y 2 )
即,在每个分量上分别进行原始格的并运算。
定理: 这样定义的结构 (L₁ × L₂, ≤, ∧, ∨) 本身也是一个格。
[[compiler/basics/lattice/constant-lattice|常量传播的格]] [[compiler/data-flow-analysis/monotone/monotone_data_flow_analysis_frameworks|单调数据流分析框架]] [[compiler/data-flow-analysis/reaching-definitions/reaching-definitions|到达定值]]