美文网首页Python与拓扑结构
聊一聊数据结构图的拓扑排序

聊一聊数据结构图的拓扑排序

作者: 风的低语 | 来源:发表于2018-08-03 08:54 被阅读26次

拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。

这样说,可能理解起来比较抽象。下面通过简单的例子进行说明!
例如,一个项目包括A、B、C、D四个子部分来完成,并且A依赖于B和D,C依赖于D。现在要制定一个计划,写出A、B、C、D的执行顺序。这时,就可以利用到拓扑排序,它就是用来确定事物发生的顺序的。

在拓扑排序中,如果存在一条从顶点A到顶点B的路径,那么在排序结果中B出现在A的后面。

/*
 * 拓扑排序
 *
 * 返回值:
 *     -1 -- 失败(由于内存不足等原因导致)
 *      0 -- 成功排序,并输入结果
 *      1 -- 失败(该有向图是有环的)
 */
public int topologicalSort() {
    int index = 0;
    int num = mVexs.size();
    int[] ins;               // 入度数组
    char[] tops;             // 拓扑排序结果数组,记录每个节点的排序后的序号。
    Queue<Integer> queue;    // 辅组队列

    ins   = new int[num];
    tops  = new char[num];
    queue = new LinkedList<Integer>();

    // 统计每个顶点的入度数
    for(int i = 0; i < num; i++) {

        ENode node = mVexs.get(i).firstEdge;
        while (node != null) {
            ins[node.ivex]++;
            node = node.nextEdge;
        }
    }

    // 将所有入度为0的顶点入队列
    for(int i = 0; i < num; i ++)
        if(ins[i] == 0)
            queue.offer(i);                 // 入队列

    while (!queue.isEmpty()) {              // 队列非空
        int j = queue.poll().intValue();    // 出队列。j是顶点的序号
        tops[index++] = mVexs.get(j).data;  // 将该顶点添加到tops中,tops是排序结果
        ENode node = mVexs.get(j).firstEdge;// 获取以该顶点为起点的出边队列

        // 将与"node"关联的节点的入度减1;
        // 若减1之后,该节点的入度为0;则将该节点添加到队列中。
        while(node != null) {
            // 将节点(序号为node.ivex)的入度减1。
            ins[node.ivex]--;
            // 若节点的入度为0,则将其"入队列"
            if( ins[node.ivex] == 0)
                queue.offer(node.ivex);    // 入队列

            node = node.nextEdge;
        }
    }

    if(index != num) {
        System.out.printf("Graph has a cycle\n");
        return 1;
    }

    // 打印拓扑排序结果
    System.out.printf("== TopSort: ");
    for(int i = 0; i < num; i ++)
        System.out.printf("%c ", tops[i]);
    System.out.printf("\n");

    return 0;
}

相关文章

  • 聊一聊数据结构图的拓扑排序

    拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph...

  • 拓扑排序就这么回事

    前言 大家好,这里是《齐姐聊算法》系列之拓扑排序问题。 Topological sort 又称 Topologic...

  • 聊一聊mongodb的自然排序

    最近笔者在工作中遇到一个关于mongo排序的问题:文章列表根据创建时间排序,当有多篇文章创建时间相同(批量导入),...

  • 百度校招二面

    1:自我介绍 2:聊项目 3:网络库里如何管理链接 4:网络库如何实现多线程 5:手写代码:拓扑排序 6:手写代码...

  • 利用DFS实现拓扑排序

    拓扑排序定义利用“DAG必有零入度顶点”的特性,实现拓扑排序基于DFS搜索的拓扑排序 1. 拓扑排序定义 将一个有...

  • 聊一聊插入排序和比较排序

    简介 插入排序和比较排序是排序算法中比较基础和简单的两种,其时间复杂度均为,在分析算法时间复杂度时,我们往往会只会...

  • 聊一聊数据结构图的克鲁斯卡尔算法

    克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。 基本思想:按照权值从小到大的顺序选择n-...

  • 排序算法

    小胡子哥:聊一聊排序算法白话经典算法系列之五 归并排序的实现

  • Java 算法-拓扑排序(深搜或者广搜)

      说实话,在数据结构中,拓扑排序我掌握的不是很好,今天在lintCode上面做了关于拓扑排序的题,才开始还是有点...

  • 7.6图的应用:拓扑排序

    拓扑排序Topological Sort ❖从工作流程图得到工作次序排列的算法,称为“拓扑排序”❖拓扑排序处理一个...

网友评论

    本文标题:聊一聊数据结构图的拓扑排序

    本文链接:https://www.haomeiwen.com/subject/draevftx.html