【离散数学】九章:关系 - 拓扑排序

拓扑排序是一种针对偏序集的算法,用于找到相容的全序。它涉及到选择偏序集的极小元并逐步构建顺序。在项目管理中,这种排序可用于确定任务的执行顺序,特别是当某些任务依赖于其他任务完成时。算法通过不断选择并移除极小元,直至偏序集为空,从而生成一个有效的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设一个项目由20个不同的任务构成。某些任务只能在其他任务结束之后完成。如何找到关于这些任务的顺序?

为了对这个问题建模,我们在任务的集合上构造一个偏序,使得:
a ≺ b iff a 和 b 是任务且直到a结束后b才能开始
( iff:if and only if,当且仅当)

为安排好这个项目,需要得出与这个偏序相容的所有20个任务的顺序,下面我们说明如何做到这一点

背景知识

相容

如果只要 aRb 就有 a ≼ b,则称一个全序 ≼偏序R是相容的
(回顾一下aRb:表示(a, b)∈R。当(a, b)属于R时,称a与b有关系R)

一个引理

引理:每个有穷非空偏序集 ( S,≼ ) 至少有一个极小元

证明:选择S的一个元素a0 。如果 a0 不是极小元,那么存在元素a1满足a1 ≺ a0。如果 a1 不是极小元,那么存在元素a2 ,满足a2 ≺ a1 ······

(继续这一过程,使得如果 an 不是极小元,那么存在元素 an+1 满足 an+1≺ an 。因为在这个偏序集元素个数有穷,所以这个过程一定会结束并且具有极小元an

什么是拓扑排序

一个偏序构造一个相容的全序称为拓扑排序。

❗注意我们这里将要描述的拓扑排序算法对任何有穷非空偏序集都有效

为了在偏序集 (A, ≼ ) 上定义一个全序,首先选择一个极小元素a1 ,由上面的引理可知,这样的元素存在。接着,(A - { a1 }, ≼ )也是一个偏序集。如果它是非空的,选择这个偏序集的一个极小元 a2 然后再移出 a2 ,如果还有其他的元素留下来,在 A - { a1 , a2 } 中选择一个极小元 a3 继续这个过程,只要还有元素留下来,就在 A - { a1 , a2 ,······,ak } 中选择极小元ak+1

因为A是有穷集,所以这个过程一定会终止。
最终产生一个元素序列a1 , a2 ,······,an。所需要的全序 ≼t 定义为:a1t a2t ······ ≺t an

这个全序与初始偏序相容
(因为如果在初始偏序中 b ≺ c ,c在算法的某个阶段 b 已经被移出时,被选择为极小元,否则 c 就不是极小元。

*①集合 S 与定义在其上的偏序关系R 一起称为偏序集,记作 (S, R)

②全序:偏序集,且 S 中的每对元素都是可比的;
可比:a,b是集合S中的元素,存在a ≼ b 或 b ≼ a

③极小元素:假设a为极小元(素),则任取与a具有关系R的元素x,都有aRx(a ≼ x,在Hasse图中的表现:汇聚到下部的结点)

拓扑排序算法(伪代码)

procedure topological sort(( S, ≼ ):有穷非空偏序集)
	k:=1
	while S ≠ ∅
		ak := S的极小元
		S := S - {ak}
		k := k+1

return a1, a2, a3, ···, an

(上面的 " ak ": k是下标)

几个实例

例1

📗找出与偏序集( { 1,2,4,5,12,20 },| )相容的一个全序。

🔴解:

先画出Hasse图:

在这里插入图片描述
第一步选择一个极小元,这个元素只能是1(因为1是唯一的极小元)
然后除去我们所选的那个极小元:

下面四种都可以:
在这里插入图片描述

例2

📗一个计算机公司的开发项目需要完成7个任务。其中某些任务只能在其他任务结束后才能开始。考虑如下建立任务上的偏序,如果任务 Y 在 X 结束后才能开始,则任务 X < 任务 Y 。这7个任务对应于这个偏序的哈塞图如图所示。求一个任务的执行顺序,使得能够完成这个项目

在这里插入图片描述

🔴解:

可以通过执行一个拓扑排序得到7个任务的排序。排序的步骤显示在下面的图中。这个排序的结果,A ≺ C ≺ B ≺ E ≺ F ≺ D ≺ G,给出了一种可行的任务次序。

在这里插入图片描述

评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐徐同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值