<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>拓扑排序</title>
</head>
<body>
<script>
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){
console.log(this.vertexList[stack[i]]);
}
}
}
function topSortHelper(v,visited,stack){
visited[v] = true;
for (var k in this.adj[v]){
var w = this.adj[v][k];
if(!visited[w]){
this.topSortHelper(visited[w],visited,stack);
}
}
stack.push(v);
} function addEdge(v,w){
this.adj[w].push(v);
this.adj[v].push(w);
this.edges++;
} function showGraph(){
var visited = [];
for(var i = 0;i<this.vertices;i++){
console.log(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){
console.log(this.vertexList[j]+" ");
}
}
}
visited.pop();
}
} //深度优先搜索
function dfs(v){
this.marked[v] = true;
//输出一下
if(this.adj[v] != undefined){
console.log("已访问 :"+v);
}
for(var i = 0;i<this.adj[v].length;i++){
var w = this.adj[v][i];
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'){
console.log("已访问 :"+v);
}
for(var k in this.adj[v]){
var w = this.adj[v][k];
if(!this.marked[w]){
this.edgeTo[w] = v;
this.marked[w] = true;
queue.unshift(w);
}
}
}
} 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(source);
return path;
}
function hasPathTo(v){
return this.marked[v];
}
function Graph(v){
this.vertices = v;
this.vertexList = [];
this.edges = 0;
this.adj = [];
for(var i=0;i<this.vertices;i++){
this.adj[i] = [];
}
this.addEdge = addEdge;
this.showGraph = showGraph;
this.dfs = dfs;
this.edgeTo = [];
this.marked = [];
for(var i=0;i<this.vertices;i++){
this.marked[i] = false;
}
this.bfs = bfs;
this.hasPathTo = hasPathTo;
this.topSortHelper = topSortHelper;
this.topSort = topSort;
} //测试
var obj = new Graph(6);
obj.addEdge(1,2);
obj.addEdge(2,5);
obj.addEdge(1,3);
obj.addEdge(1,4);
obj.addEdge(0,1);
obj.vertexList = ["css1","css2","data structures","javascript","operating system","html"];
obj.showGraph();
obj.topSort();
</script>
</body>
</html>

JavaScript数据结构-19.拓扑排序的更多相关文章

  1. 算法与数据结构基础 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  2. 有向图的拓扑排序的理解和简单实现(Java)

    如果图中存在环(回路),那么该图不存在拓扑排序,在这里我们讨论的都是无环的有向图. 什么是拓扑排序 一个例子 对于一部电影的制作过程,我们可以看成是一个项目工程.所有的工程都可以分为若干个" ...

  3. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  4. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  5. JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

  6. JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

  7. 算法与数据结构(七) AOV网的拓扑排序

    今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...

  8. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  9. javascript数据结构与算法--基本排序算法分析

    javascript中的基本排序算法 对计算机中存储的数据执行的两种最常见操作是排序和检索,排序和检索算法对于前端开发尤其重要,对此我会对这两种算法做深入的研究,而不会和书上一样只是会贴代码而已,下面 ...

随机推荐

  1. mysql下的常见问题处理

    1. ubuntu中启动mysql,提示mysql access denied for user root@localhost 错误. 是因为还没有给添加的root账户配置密码信息. (1)停止mys ...

  2. Java垃圾收集调优实战

    1 资料 JDK5.0垃圾收集优化之--Don't Pause(花钱的年华)  编写对GC友好,又不泄漏的代码(花钱的年华)  JVM调优总结  JDK 6所有选项及默认值  2 GC日志打印 GC调 ...

  3. #ifdef __cplusplus extern "C" { #endif 的解释

    好多程序中都会遇到下列代码段: #ifdef __cplusplus extern "C" { #endif /****************** C语法代码段 ******** ...

  4. Android-sdcard广播的接收处理

    有时候Android手机在开机成功后的那几秒会在状态栏通知,Sdcard开始扫描,Sdcard扫描完成,等信息 当Sdcard的状态发生改变后,系统会自动的发出广播 Sdcard的状态: 1.moun ...

  5. Lucene的数值索引以及范围查询

    对文本搜索引擎的倒排索引(数据结构和算法).评分系统.分词系统都清楚掌握之后,本人对数值索引和搜索一直有很大的兴趣,最近对Lucene对数值索引和范围搜索做了些学习,并将主要内容整理如下: 1. Lu ...

  6. Mac和 iOS 下的对称和非对称加密算法的使用

    分享在Mac 和 iOS 上使用到的对称和非对称加密算法. 包括RSA,DSA, AES, DES, 3DES 和 blowfish 等等.因为要实现ssh协议, 所以用到了这些算法, 这些算法在ma ...

  7. Orchard 介绍

    0.Introduction 下载地址 https://orchard.codeplex.com/ Orchard 是由微软公司创建,基于 ASP.NET MVC 技术的免费开源内容管理系统: 可用于 ...

  8. java学习笔记—JDBC1(16)

    1.数据持久化 l  持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用,也称为“固化”.在大多数情况下,服务器或客户端应用中数据的持久化是通过关系型数据库来实现 l  存储 ...

  9. SpringQuartz定时任务cronExpression配置

    <!-- 每一个小时跑一次--> <property name="cronExpression"> <value>0 0 0/1 * * ?&l ...

  10. TX2 安装v4l

    在TX2上使用v4l2-ctl --all -d /dev/video0查看相机参数时报错: v4l2-ctl :command not found 手动安装: sudo apt-get instal ...