拓扑排序会对有向图的所有顶点进行排序,使有向边从前面的顶点指向后面的顶点。

拓扑排序算法与深度优先搜索类似。不同的是,拓扑排序算法不会立即输出已访问的顶点,而是访问当前顶点邻接表中的所有相邻顶点,直到这个列表穷尽时,才将当前顶点压入栈中。

拓扑排序算法被拆分为两个函数。第一个函数 topSort(),会设置排序进程并调用一个辅助函数 topSortHelper(),然后显示排序好的顶点列表。

主要工作是在递归函数 topSortHelper() 中完成的。这个函数会将当前顶点标记为已访问,然后递归访问当前顶点邻接表中的每个相邻顶点,标记这些顶点为已访问。最后,将当前顶点压入栈。

function topSort() {
    var stack = [];
    var visited = [];
    for (var i = 0; i < this.vertices; i++) {
        visited[i] = false;
    }
    for (var i = 0; i < this.vertices; i++) {
        if (visited[i] == false) {
            this.topSortHelper(i, visited, stack);
        }
    }
    for (var i = 0; i < stack.length; i++) {
        if (stack[i] != undefined && stack[i] != false) {
            print(this.vertexList[stack[i]]);
        }
    }
}function topSortHelper(v, visited, stack) {
    visited[v] = true;
    for each(var w in this.adj[v]) {
        if (!visited[w]) {
            this.topSortHelper(visited[w], visited, stack);
        }
    }
    stack.push(v);
}

Graph 类也将被修改,这样不仅可以用于数字顶点,还可以用于符号顶点。在代码中,每个顶点都只仍标注了数字,但是我们添加了一个 vertexList 数组,将各个顶点关联到一个符号

Graph 类

function Graph(v) {
    this.vertices = v;
    this.vertexList = [];
    this.edges = 0;
    this.adj = [];
    for (var i = 0; i < this.vertices; ++i) {
        图和图算法| 139
        this.adj[i] = [];
        this.ajd[i].push("");
    }
    this.addEdge = addEdge;
    this.showGraph = showGraph;
    this.dfs = dfs;
    this.marked = [];
    for (var i = 0; i < this.vertices; ++i) {
        this.marked[i] = false;
    }
    this.bfs = bfs;
    this.edgeTo = [];
    this.hasPathTo = hasPathTo;
    this.topSortHelper = topSortHelper;
    this.topSort = topSort;
}function topSort() {
    var statck = [];
    var visited = [];
    for (var i = 0; i < this.vertices; i++) {
        visited[i] = false;
    }
    for (var i = 0; i < stack.length; i++) {
        if (visited[i] == false) {
            this.topSortHelper(i, visited, stack);
        }
    }
    for (var i = 0; i < stack.length; i++) {
        if (stack[i] != undefined && stack[i] != false) {
            print(this.vertexList[stack[i]]);
        }
    }
}
function topSortHelper(v, visited, stack) {visited[v] = true;for each(var w in this.adj[v]) {if (!visited[w]) {this.topSortHelper(visited[w], visited, stack);}}stack.push(v);
}function addEdge(v, w) {this.adj[v].push(w);this.adj[w].push(v);this.edges++;
}
function showGraph() {var visited = [];for (var i = 0; i < this.vertices; ++i) {putstr(this.vertexList[i] + " -> ");visited.push(this.vertexList[i]);for (var j = 0; j < this.vertices; ++j) {if (this.adj[i][j] != undefined) {if (visited.indexOf(this.vertexList[j]) < 0) {putstr(this.vertexList[j] + ' ');}}}print();visited.pop();}
}function dfs(v) {this.marked[v] = true;if (this.adj[v] != undefined) {print("Visited vertex: " + v);}for each(var w in this.adj[v]) {if (this.marked[w]) {this.dfs(w);}}
}function bfs(s) {var queue = [];this.marked[s] = true;queue.unshift(s);while (queue.length > 0) {var v = queue.shift();if (typeof(v) != 'string') {print("Visited vertex:" + v);}for each(var w in this.adj[v]) {if (!this.marked[w]) {this.edgeTo[w] = v;this.marked[w] = true;queue.unshift(w);}}}
}function hasPathTo(v) {return this.marked[v];
}function pathTo(v) {var source = 0;if (!this.hasPathTo(v)) {return undefined;}var path = [];for (var i = v; i != source; i = this.edgeTo[i]) {path.push(i);}path.push(s);return path;
}
load("Graph.js");
g = new Graph(6);
g.addEdge(1, 2);
g.addEdge(2, 5);
g.addEdge(1, 3);
g.addEdge(1, 4);
g.addEdge(0, 1);
g.vertexList = ["CS1", "CS2", "Data Structures","Assembly Language", "Operating Systems","Algorithms"
];
g.showGraph();
g.topSort();
以上代码的输出结果为:
CS1
CS2
Data Structures
Assembly Language
Operating Systems
Algorithms

JavaScript 拓扑排序 算法相关推荐

  1. JavaScript实现topologicalSort拓扑排序算法(附完整源码)

    JavaScript实现topologicalSort拓扑排序算法(附完整源码) Comparator.js完整源代码 LinkedListNode.js完整源代码 LinkedList.js完整源代 ...

  2. 【zz】如何去理解 拓扑排序算法

    from http://www.cnblogs.com/shanyou/archive/2006/11/16/562861.html 查看Castle的代码,在Castle.Core中内部的数据结构采 ...

  3. vant coupon 时间戳如何计算_计软考研双日练 | 如何计算拓扑排序算法的时间复杂度?...

    ☝☝☝ 软件工程考研独家平台 撰稿 | 康康哥 编辑 | 丽丽姐 本文由懂计算机.软件工程的博士师哥原创 双日练:NO.20200610 若将n个顶点e条弧的有向图采用邻接表存储,则拓扑排序算法的时间 ...

  4. C++实现topological sort拓扑排序算法(附完整源码)

    C++实现topological sort拓扑排序算法 C++实现topological sort拓扑排序算法完整源码(定义,实现,main函数测试) C++实现topological sort拓扑排 ...

  5. C++使用kahn实现topological sort拓扑排序算法(附完整源码)

    C++使用kahn实现topological sort拓扑排序算法 C++使用kahn实现topological sort拓扑排序算法完整源码(定义,实现,main函数测试) C++使用kahn实现t ...

  6. 邻接表存储 - 拓扑排序算法

    拓扑排序:用下面的例子介绍------> ---------------------------------------------------------------------------- ...

  7. JavaScript的排序算法——快速排序

    排序算法(Sorting algorithm)是计算机科学最古老.最基本的课题之一.要想成为合格的程序员,就必须理解和掌握各种排序算法. 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排 ...

  8. javascript常用排序算法总结

    算法是程序的灵魂.虽然在前端的开发环境中排序算法不是很经常用到,但常见的排序算法还是应该要掌握的.我在这里从网上整理了一下常见排序算法的javascript实现,方便以后查阅. 归并排序: 1 fun ...

  9. JavaScript实现排序算法

    排序算法主要用在元素的数组排序,常见的排序算法有冒泡排序.选择排序.插入排序.希尔排序.快速排序.归并排序等.这些排序算法都可以用JavaScript实现.下面的排序算法都假设是从小到大进行排序,从大 ...

  10. 如何理解拓扑排序算法(转)

    对于一条有向边(u,v),定义u < v:满足所有这样条件的结点序列称为拓扑序列.拓扑排序就是求一个有向图的拓扑序列的算法. 一个有向图顶点的拓扑序列不是惟一的.并不是任何有向图的顶点都可以排成 ...

最新文章

  1. 【Android开发】布局管理器-线性布局
  2. SAP常用的科目字段状态组设置
  3. LNMPA(LNMP0.7)安装出现502 Bad Gateway解决方法
  4. 【Linux系统编程学习】 文件描述符
  5. linux php 执行python,Linux(Ubuntu)下php使用exec调用python程序返回json数据
  6. 由 go orm 引发的探索
  7. python函数参数类型及其顺序
  8. [转]DotNet C#开源资源汇总
  9. java微信支付超时_Java微信支付之关闭订单
  10. android.mk if else,gradle - 如何在Android Studio中使用我自己的Android.mk文件 - SO中文参考 - www.soinside.com...
  11. MySQL 第一次练习(安装MySQL)
  12. sql Server 2008 数据库自动备份维护计划
  13. 云MAS中CMPP3.0协议封装与移动短信状态报告状态码说明
  14. String 常用方法总结
  15. Ajax请求下载文件
  16. java imageio 使用_java – 使用ImageIO发送图像流?
  17. goland集成golint
  18. 互亿天线短信接口php文档
  19. greendao 默认数据库db 生成路径,以及db文件导出
  20. 一键照片转换动漫卡通风,一键给黑白照片上色

热门文章

  1. 计算机主板过热报警,利用电脑主板BIOS的报警声音辨别电脑故障
  2. keytool密钥和证书管理工具-使用详解(整理)
  3. python statsmodel 回归结果提取(回归系数、t值、pvalue、R方、、、、)
  4. Calendar类、自定义实现日历控件
  5. IADS Revision Note: Asymptotic Notations
  6. Window同时兼容运行多版本谷歌浏览器chrome
  7. 10个不错的编程等宽字体
  8. stl格式导入matlab,机器人模型导入MATLAB(三):导入MATLAB URDF/stl 格式
  9. Zoom视频会议软件
  10. 博科光纤交换机默认密码更改