• 计算拓扑排序的两种方法


    个人笔记,仅供复习 ——《数据结构编程实验》P351

    计算拓扑排序的方法有两种:删边法采用DFS计算拓扑排序

    1.删边法:

    由于每一条拓扑子路径的首节点的入度为0,因此可以采取如下办法:

    • 步骤1:从图中选择一个入度为0的点且输出之
    • 步骤2:从图中删除该节点及其所有出边(即与之相邻的所有点入度-1)

    反复执行这两个步骤,直至所有节点都输出,即整个拓扑排序完成;或者直至剩下的图中再没有入度为0的节点,这就说明此图中有回路,不可能进行拓扑排序。

    1.2 算法时间复杂度分析:统计所有节点入度的时间复杂性为(VE);接下来删边花费的时间也是(VE),总花费时间为O(VE)。

    1.3 优化:使用队列保存入度为0的顶点,则可以将这个算法复杂度将为O(V+E)。

    2.采用DFS计算拓扑排序:

    一个有向图是无回路的,当且仅当对图进行DFS遍历时没有反向边B。那么,怎样发现反向边呢?方法很简单:调用DFS(y)算法计算y可达的节点集。若x在该节点集,则<x,y>为反向边,时间复杂度为O(E)。

    2.1 由此可以得到用DFS算法计算拓扑方案的方法:以访问一个节点算作一个时间单位,把遍访了u的后代的时间称作结束时间f[u],(f[u]可以通过DFS算法得到)。显然,对图进行DFS遍历时没有反向边B,即对于图中的任意边(u,v),都有f[v] < f[u]。

    2.2 时间复杂度分析:DFS的运行时间为O(E),每个节点压入topo栈的时间为O(1),因此执行拓扑排序所需的总时间为O(E)。

  • 相关阅读:
    JS代码判断IE不同版本
    极简技术类录--正则表达式
    Java读取系统Properties
    极简技术类录--maven
    极简技术类录--git
    JVM字节码增强
    如何避免死锁?
    有三个线程T1,T2,T3,怎么确保它们按顺序执行?
    编写两个线程,顺序输出自然顺序:1,2,3,4,...,99,100
    对文本单词进行技数,并倒序列出计数统计
  • 原文地址:https://www.cnblogs.com/long98/p/10352206.html
Copyright © 2020-2023  润新知