JavaScript数据结构-19.拓扑排序
<!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.拓扑排序的更多相关文章
- 算法与数据结构基础 - 拓扑排序(Topological Sort)
拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...
- 有向图的拓扑排序的理解和简单实现(Java)
如果图中存在环(回路),那么该图不存在拓扑排序,在这里我们讨论的都是无环的有向图. 什么是拓扑排序 一个例子 对于一部电影的制作过程,我们可以看成是一个项目工程.所有的工程都可以分为若干个" ...
- javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较
javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
- JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序
1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...
- JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序
1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- javascript数据结构与算法--高级排序算法
javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...
- javascript数据结构与算法--基本排序算法分析
javascript中的基本排序算法 对计算机中存储的数据执行的两种最常见操作是排序和检索,排序和检索算法对于前端开发尤其重要,对此我会对这两种算法做深入的研究,而不会和书上一样只是会贴代码而已,下面 ...
随机推荐
- Http 安全检测
httpsecurityreport.com www.ssllabs.com
- 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 4、创建数据上下文和数据实体模型
说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dodu ...
- Nutch 问题杂记
1. 如何绕过目标站点的robots.txt限制 多数站点都是只允许百度.google等搜索引擎抓取的,所以会在robots.txt里限制其他爬虫. nutch自然是会遵循robots协议的,但是我们 ...
- daylyknowledge1
1.数据库截取字符串:toFixed():四舍五入substring(cp_introduce,0,11) cp_introduce前台截取: field: 'an_content', title: ...
- ASP.NET中Onclick和OnserverClick事件的区别 (转)
对于服务器按钮控件(即<asp:Button>类型的按钮): 服务器响应事件:OnClick 客户端响应属性:OnClientClick 对于html按钮控件(即<input typ ...
- Winform嵌入其它应用程序
Options: using CommandLine; using System; using System.Collections.Generic; using System.Linq; using ...
- WPF解决方案------调用线程无法访问此对象,因为另一个线程拥有该对象
WPF [调用线程无法访问此对象,因为另一个线程拥有该对象.] 解决方案 在这里以播放图片为例进行说明,代码如下: void _Timer_Elapsed(object sender, Elapsed ...
- SQL server 添加主外键约束
---添加主键约束 alter table 表名 add constraint 约束名 primary key (主键) - --添加唯一约束 alter table 表名 ...
- 在 Cef 中实现 C++ 与 JavaScript 交互场景分析
此文已由作者邓佳佳授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 本文主要介绍 CEF 场景中 C++ 和 JavaScript 交互(以下简称 JS Bridge)中的一些重 ...
- Python脱产8期 Day15 2019/4/30
一 生成器send方法 1.send的工作原理# 1.send发生信息给当前停止的yield# 2.再去调用__next__()方法,生成器接着往下指向,返回下一个yield值并停止 2.例: per ...