Lecture 14:有向图与 DAG
1. 有向图基础
定义: 有向图(Digraph)
与无向图的区别:
- 允许自环
。 - 允许反向平行边:
与 是不同的两条边。 - 仍然不允许重边(不能有两条
)。
应用举例: 状态机(状态 = 顶点,转移 = 有向边)、Twitter 关注图、道路网络(双向路用两条有向边表示)、网页超链接图(PageRank 的基础)。
度数
- 入度
:指向 的边数。 - 出度
:从 出发的边数。
有向握手引理:
游走与路径
有向游走:顶点序列
定理: 若存在从
在有向图中,圈可以有长度 1(自环)或长度 2(反向平行边对),而无向图中圈的长度至少为 3。
2. 有向连通性
有向图中,连通性不对称。
定义: 若存在从
定义: 若
定义: 若每对顶点都强连通,则称图
有向欧拉回路
定理: 有向图存在欧拉回路,当且仅当图是强连通的,且每个顶点的入度等于出度。
3. 强连通分量(SCC)
定义: 顶点
SCC 对顶点构成划分。但与无向连通分量不同,SCC 之间可以存在有向边。
凝聚图(Condensation Graph)
定义: 图
(每个 SCC 压缩为一个节点) (SCC 之间若有有向边则建立对应边,删去自环)
关键性质: 每个凝聚图都是 DAG。
4. DAG(有向无环图)
定义: 有向无环图(DAG) 是没有有向圈的有向图。
类比关系:无环无向图 → 森林;无环有向图 → DAG。
应用: 任务依赖调度、并发控制、数据处理流水线、构建系统等。
Hasse 图
- 若
是两点之间唯一的有向路径,则称为覆盖边。 - 否则称为冗余边(存在绕过该边的其他路径)。
- 只保留覆盖边得到的 DAG 称为 Hasse 图,它用更少的边编码了相同的偏序关系。
5. 拓扑排序
定义: 入度为 0 的顶点称为源点(Source);出度为 0 的顶点称为汇点(Sink)。在 DAG 中,源点即极小元,汇点即极大元。
定义: DAG 的拓扑序(拓扑排序) 是所有顶点的一个线性排列,使得每个顶点都出现在所有从它可达的顶点之前。
定理: 每个有限 DAG 都有拓扑序。
引理: 每个有限 DAG 至少有一个源点。
证明: 取最长有向路径,其起点必须是源点;否则可延长路径,或存在圈——均矛盾。
对
- 基础情形
:空序列即为拓扑序。✓ - 归纳步骤: 设
是 个顶点的 DAG,取其源点 。令 , 是 个顶点的 DAG,由归纳假设有拓扑序。在该序列最前面加上 ,即得 的拓扑序。✓
6. 并行任务调度
目标: 给定带依赖关系的任务 DAG,使用尽可能多的并行工作者,最小化完成所有任务所需的阶段数。
定义:
- 两个顶点
可比,若其中一个能到达另一个。 - 链(Chain) 是一个两两可比的顶点集合——链中的任务必须串行执行。
- 反链(Antichain) 是一个两两不可比的顶点集合——反链中的任务可以同时执行。
- 关键路径(Critical Path) 是最大的链。
基本事实:
最短并行调度的阶段数
最长链的长度。
最短并行调度的阶段数
最长链的长度。
证明思路: 定义
- 若
能到达 ,则 (可将到达 的路径接上 的路径)。 - 故每个
是反链(其中所有顶点互不可达)。 - 每个
的所有前驱深度严格更小,故在第 阶段执行所有 中的任务,所有依赖已满足。 - 总共恰好需要
个阶段( 为关键路径长度)。
穿衣例子(Getting Dressed):
V1 = {左袜, 右袜, 裤子, 衬衫}
V2 = {左鞋, 右鞋, 腰带, 外套}
V3 = {围巾, 帽子}
V4 = {大衣}关键路径为 {衬衫 → 外套 → 围巾 → 大衣},共 4 个阶段。
注:最大反链的大小给出所需工作者数量的上界,但实际可能需要更少。
7. Dilworth 定理(了解,不考)
定理: 对任意
推论(取
证明: 若最大链大小