文章目录
一. 什么是拓扑排序? 二. 拓扑排序的应用 三. 拓扑排序的算法过程 四、leetcode 1. 课程表 II(LeetCode 题号:210) 2. 课程表 III(LeetCode 题号:1136) 3. 课程表 III(LeetCode 题号:630) 五. 注意事项一. 什么是拓扑排序?
拓扑排序(Topological Sorting)是针对有向无环图(Directed Acyclic Graph,简称DAG)的一种排序算法。不同于我们常见的排序算法,它的作用是对DAG中的节点进行排序,以使得每一个有向边 ( u , v ) (u,v) (u,v) 从 u u u 到 v v v,均有 u u u 在 v v v 之前。换句话说,若存在一条从节点 u u u 到节点 v v v 的路径,那么排序后 u u u 必定在 v v v 之前。
二. 拓扑排序的应用
拓扑排序在工程实践中有着有着广泛的应用,如任务调度、课程表的安排等问题。例如在课程规划中,我们需要先修的课程必须在后修的课程之前被安排,这就是一个典型的拓扑排序问题。
三. 拓扑排序的算法过程
具体的拓扑排序的步骤如下:
1. 首先在图中找到一个没有前驱,即入度为0的顶点,将其输出。 2. 将此顶点及其所有出边从图中删除。 3. 重复上述两步,直至全部顶点均已输出;或者新的图中不存在无前驱的顶点为止。
在步骤3中,如果新的图中不存在无前驱的顶点,而图中又非空,则图中存在环,即原图不是有向无环图,不能进行拓扑排序。
拓扑排序的实现一般使用深度优先搜索或者广度优先搜索。具体的算法实现和详解可以参考一些常见的算法教科书和教程。
当然,我很乐意为你提供一些和拓扑排序相关的 LeetCode 题目以及代码实现。以下是我为你挑选的几个题目:
四、leetcode
1. 课程表 II(LeetCode 题号:210)
这道题目是上一题的进阶版,题目的要求基本相同,但现在你还需要输出一个拓扑排序。
Python代码实现:
def findOrder(numCourses: int, prerequisites: list[list[int]]) -> list[int]: from collections import deque # 入度表 indegrees = [0 for _ in range(numCourses)] # 邻接表 adjacency = [[] for _ in range(numCourses)] # 队列 queue = deque() # 通过 prerequisites 得到入度表和邻接表 for cur, pre in prerequisites: indegrees[cur] += 1 adjacency[pre].append(cur) # 将所有入度为 0 的节点入队 for i in range(len(indegrees)): if not indegrees[i]: queue.append(i) # 拓扑排序 topo_order = [] while queue: pre = queue.popleft() topo_order.append(pre) numCourses -= 1 for cur in adjacency[pre]: # 将后继课程的入度 -1 indegrees[cur] -= 1 # 如果后继课程入度为 0,那么将其加入到队列中 if not indegrees[cur]: queue.append(cur) # 如果所有的课程都已经学完,那么返回拓扑排序,否则返回空列表 return topo_order if not numCourses else []
2. 课程表 III(LeetCode 题号:1136)
不好意思,上一条回复被意外地切断了。我们继续讲述上一题的内容。
3. 课程表 III(LeetCode 题号:630)
这个题目和课程表 I, II有些不同,课程表 III现在每门课程有了一定的持续时间,并且你必须在规定的最后一天完成。这道题的目标是你要找出可以完成的最大课程数。
Python代码实现:
def scheduleCourse(courses: list[list[int]]) -> int: import heapq # 首先按照结束时间对课程进行排序 courses.sort(key=lambda x: x[1]) q = [] # 当前的时间 now = 0 for time, end in courses: now += time heapq.heappush(q, -time) # 如果当前的时间大于课程的结束时间,那么就从已选的课程中剔除持续时间最长的课程 if now > end: now += heapq.heappop(q) return len(q)
以上便是几道利用拓扑排序解决的题目,它们代表了拓扑排序在解决图的问题中的强大能力。希望对你有所帮助。如果需要更多的帮助或者有其他的问题,欢迎随时告诉我。
五. 注意事项
需要注意的是,拓扑排序也许不止一种。一个图的拓扑排序可能有多个,只要满足上述的条件,即可称为该图的一种拓扑排序。
以上就是关于拓扑排序的全部内容,希望能帮助大家深入理解和掌握这个重要的算法。
codeleetcodeapppythonpython代码cli任务调度教科书rap