拓扑排序类 待优化

拓扑排序是针对于有向无环图的一种排序。所以如果一个有向图可以拓扑排序那么他一定是有向无环图。拓扑排序满足一下两个条件:

  • 每个顶点出现且只出现一次。
  • 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

注意:拓扑排序不唯一;有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。

拓扑排序的思想

  • 找到入度为0的点,加入序列,删除改点和改点对应的边,更新各点入度。
  • 重复上诉步骤直到不存在节点。如果存在节点,却不存在入度为0的点,那么不存在拓扑排序。

拓扑排序结果为:{ 1, 2, 4, 3, 5 }。

代码

基于python的实现,默认输入G是边的集和。
如:`
n = 4,
g = [[1,0],[2,0],[3,1],[3,2]]
代表0到1 有边,0到2有边,1到3有边,2到3右边


    from collections import deque
    class TopologiocalSort:
        def __init__(self,n_node,G):
            """
            :type n_node: int
            :type G: List[List[int]]
            """
            self.node_num = n_node
            self.graph = G


        def sort(self):
            self.indegrees = [0 for _ in range(self.node_num)]
            self.adjacency = [[] for _ in range(self.node_num)]
            queue = deque()
            top_sort_ans = []

            # init
            for cur,pre in self.graph:
                self.indegrees[cur]+=1
                self.adjacency[pre].append(cur)

            # Get all the node with indegree of 0
            for i in range(len(self.indegrees)):
                if not self.indegrees[i]:queue.append(i)

            # BFS Top sort
            while queue:
                pre = queue.popleft()
                top_sort_ans.append(pre)
                self.node_num-=1
                for cur in self.adjacency[pre]:
                    self.indegrees[cur]-=1
                    if not self.indegrees[cur]:queue.append(cur)

            return top_sort_ans if not self.node_num else []

时间复杂度 O(N + M)O(N+M): 遍历一个图需要访问所有节点和所有临 边,NN 和 MM 分别为节点数量和临边数量;
空间复杂度 O(N + M)O(N+M): 为建立邻接表所需额外空间,adjacency 长度为 NN ,并存储 MM 条临边的数据





北语张益达
6 声望4 粉丝