JavaScript 图
TypeScript方式实现源码
// 图的遍历算法 // 算 法 数据结构 描 述 // 深度优先搜索 栈 通过将顶点存入栈中,顶点是沿着路径被探索的,存在新的相 // 邻顶点就去访问 // 广度优先搜索 队列 通过将顶点存入队列中,最先入队列的顶点先被探索 // 当要标注已经访问过的顶点时,我们用三种颜色来反映它们的状态。 // 白色:表示该顶点还没有被访问。 // 灰色:表示该顶点被访问过,但并未被探索过。 // 黑色:表示该顶点被访问过且被完全探索过。 // 广度优先搜索算法会从指定的第一个顶点开始遍历图, 先访问其所有的相邻点, 就像一次访 // 问图的一层
1 class Graph { 2 vertices = []; 3 adjList = new Dictionary(); 4 public addVertex(v) { 5 this.vertices.push(v); 6 this.adjList.set(v, []); 7 } 8 public addEdge(v, w) { 9 this.adjList.get(v).push(w); 10 this.adjList.get(w).push(v); 11 } 12 public initializeColor() { 13 let color = [], length = this.vertices.length; 14 for (var i = 0; i < length; i++) { 15 color[this.vertices[i]] = 'white'; 16 } 17 return color; 18 } 19 /** 20 * 宽度优先搜索 21 * @param v 22 * @param callback 23 */ 24 public bfs(v, callback) { 25 let color = this.initializeColor(), 26 queue = new Queue(); 27 queue.enqueue(v); 28 while (!queue.isEmpty()) { 29 let u = queue.dequeue(), 30 neighbors = this.adjList.get(u); 31 color[u] = 'grey'; 32 for (let i = 0; i < neighbors.length; i++) { 33 let w = neighbors[i]; 34 if (color[w] === 'white') { 35 color[w] = 'grey'; 36 queue.enqueue(w); 37 } 38 } 39 color[u] = 'black'; 40 if (callback) { 41 callback(u); 42 } 43 } 44 } 45 /** 46 * 寻找最短路径 47 * @param v 48 */ 49 public BFS(v) { 50 let color = this.initializeColor(), 51 queue = new Queue(), 52 d = [], 53 pred = []; 54 queue.enqueue(v); 55 for (var i = 0; i < this.vertices.length; i++) { 56 d[this.vertices[i]] = 0; 57 pred[this.vertices[i]] = null; 58 } 59 while (!queue.isEmpty()) { 60 let u = queue.dequeue(), 61 neighbors = this.adjList.get(u); 62 color[u] = 'grey'; 63 for (let i = 0; i < neighbors.length; i++) { 64 let w = neighbors[i]; 65 if (color[w] === 'white') { 66 color[w] = 'grey'; 67 d[w] = d[u] + 1; 68 pred[w] = u; 69 queue.enqueue(w); 70 } 71 } 72 color[u] = 'black'; 73 } 74 return { 75 distances: d, 76 predecessors: pred 77 } 78 } 79 public toString() { 80 let s = ''; 81 for (let i = 0; i < this.vertices.length; i++) { 82 s += this.vertices[i] + ' -> '; 83 let neighbors = this.adjList.get(this.vertices[i]); 84 for (var j = 0; j < neighbors.length; j++) { 85 s += neighbors[j] + ' '; 86 } 87 s += '\n'; 88 } 89 return s; 90 } 91 } 92 var graph = new Graph(); 93 var myVertices = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']; //{7} 94 for (var i = 0; i < myVertices.length; i++) { //{8} 95 graph.addVertex(myVertices[i]); 96 } 97 graph.addEdge('A', 'B'); //{9} 98 graph.addEdge('A', 'C'); 99 graph.addEdge('A', 'D'); 100 graph.addEdge('C', 'D'); 101 graph.addEdge('C', 'G'); 102 graph.addEdge('D', 'G'); 103 graph.addEdge('D', 'H'); 104 graph.addEdge('B', 'E'); 105 graph.addEdge('B', 'F'); 106 graph.addEdge('E', 'I'); 107 108 console.log(graph.toString()); 109 110 function printNode(value) { 111 console.log('Visited vertex:' + value); 112 } 113 graph.bfs(myVertices[0], printNode); 114 115 var shortestPathA = graph.BFS(myVertices[0]); 116 console.log(shortestPathA);
View Code
JavaScript方式实现源码
1 var Graph = (function () { 2 function Graph() { 3 this.vertices = []; 4 this.adjList = new Dictionary(); 5 } 6 Graph.prototype.addVertex = function (v) { 7 this.vertices.push(v); 8 this.adjList.set(v, []); 9 }; 10 Graph.prototype.addEdge = function (v, w) { 11 this.adjList.get(v).push(w); 12 this.adjList.get(w).push(v); 13 }; 14 Graph.prototype.initializeColor = function () { 15 var color = [], length = this.vertices.length; 16 for (var i = 0; i < length; i++) { 17 color[this.vertices[i]] = 'white'; 18 } 19 return color; 20 }; 21 /** 22 * 宽度优先搜索 23 * @param v 24 * @param callback 25 */ 26 Graph.prototype.bfs = function (v, callback) { 27 var color = this.initializeColor(), queue = new Queue(); 28 queue.enqueue(v); 29 while (!queue.isEmpty()) { 30 var u = queue.dequeue(), neighbors = this.adjList.get(u); 31 color[u] = 'grey'; 32 for (var i_1 = 0; i_1 < neighbors.length; i_1++) { 33 var w = neighbors[i_1]; 34 if (color[w] === 'white') { 35 color[w] = 'grey'; 36 queue.enqueue(w); 37 } 38 } 39 color[u] = 'black'; 40 if (callback) { 41 callback(u); 42 } 43 } 44 }; 45 /** 46 * 寻找最短路径 47 * @param v 48 */ 49 Graph.prototype.BFS = function (v) { 50 var color = this.initializeColor(), queue = new Queue(), d = [], pred = []; 51 queue.enqueue(v); 52 for (var i = 0; i < this.vertices.length; i++) { 53 d[this.vertices[i]] = 0; 54 pred[this.vertices[i]] = null; 55 } 56 while (!queue.isEmpty()) { 57 var u = queue.dequeue(), neighbors = this.adjList.get(u); 58 color[u] = 'grey'; 59 for (var i_2 = 0; i_2 < neighbors.length; i_2++) { 60 var w = neighbors[i_2]; 61 if (color[w] === 'white') { 62 color[w] = 'grey'; 63 d[w] = d[u] + 1; 64 pred[w] = u; 65 queue.enqueue(w); 66 } 67 } 68 color[u] = 'black'; 69 } 70 return { 71 distances: d, 72 predecessors: pred 73 }; 74 }; 75 Graph.prototype.toString = function () { 76 var s = ''; 77 for (var i_3 = 0; i_3 < this.vertices.length; i_3++) { 78 s += this.vertices[i_3] + ' -> '; 79 var neighbors = this.adjList.get(this.vertices[i_3]); 80 for (var j = 0; j < neighbors.length; j++) { 81 s += neighbors[j] + ' '; 82 } 83 s += '\n'; 84 } 85 return s; 86 }; 87 return Graph; 88 }());
View Code
转载于:https://www.cnblogs.com/menu/p/6991945.html
JavaScript 图相关推荐
- 使用Electron.js运行JavaScript图应用程序
MindFusion.Diagramming for WinForms是一个能帮助你创建工作流和进程图表的.NET控件:数据库实体关系图表:组织图表:对象层次和关系图表:图表和树.它是基于对象-图表框 ...
- JavaScript图中以编程方式平移和缩放
MindFusion.Diagramming for WinForms是一个能帮助你创建工作流和进程图表的.NET控件:数据库实体关系图表:组织图表:对象层次和关系图表:图表和树.它是基于对象-图表框 ...
- [读书笔记]5个小技巧让你写出更好的JavaScript[图]
在使用JavaScript时,我们常常要写不少的条件语句.这里有五个小技巧,可以让你写出更干净.漂亮的条件语句. 使用Array.includes来处理多重条件 举个栗子: //条件语句 functi ...
- 奔图内部扫描错误13_现代浏览器内部揭秘(第三部分)
这是关于浏览器工作原理博客系列四部分中的第三部分.之前,我们介绍了 多进程架构 和 导航流.在这篇文章中,我们将一探渲染进程的内部机制. 渲染进程的内部机制 渲染进程涉及 Web 性能的许多方面.由于 ...
- 翻译:《JavaScript 权威指南(第5版)》第一章(一)
声明:翻译只有一个目的:学习用途.若有版权问题请及时联系本人. 本贴文根据篇幅将第一章的翻译分为两个部分,这是第一部分的内容. Chapter 1. Introduction to JavaScrip ...
- js pug 代码_用JS写的windows95操作系统
README.md 这是Windows95,在Electron应用程序中运行.是的,这是完整的. 它有用吗? 是的,可以.实际上,在macOS,Windows和Linux上.请记住,这完全是用Java ...
- Python 可视化库
https://www.infoq.cn/article/pSV6tZ1SbUC8qJpo_v8H 在奥斯汀举行的SciPy 2018年特别会议上,大量开源 Python 可视化工具的代表分享了他们对 ...
- Python数据可视化2018:数据可视化库为什么这么多?
本文最初发布于Anaconda开发者博客,经原作者授权由InfoQ中文站翻译并分享. 在奥斯汀举行的SciPy 2018年特别会议上,大量开源Python可视化工具的代表分享了他们对Python数据可 ...
- python基于web可视化_python可视化(转载)
本文是关于Python数据可视化工具状态和SciPy 2018中出现的趋势的三部分系列文章中的第一篇. 作者:James A.Bender 在奥斯汀举行的SciPy 2018特别会议上,各种开源Pyt ...
最新文章
- python编程程序设计_程序设计入门—Python
- spring data jpa从入门到精通_Spring Data JPA的简单入门
- ADSL宽带为什么下载和上传速度差别如此之大?
- Java爬取校内论坛新帖
- java oracle 乐观锁,oracle为什么默认乐观锁
- 确定最小的正整数n,使得n!的结尾恰好有1987个0
- oracle将字符串的日期格式化,oracle格式化字符串 oracle 怎么把字符串转换成日期...
- 复联4里用到的方法论
- 安装了Node.js 从VScode 使用node -v 和 npm -v等命令却无效
- spring 事物的级别_Spring 事务中的隔离级别有哪几种?
- 神经网络优化中的病态问题
- QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件...
- Maven无法下载com.oracle:ojdbc14:jar解决方法
- zblog博客模板-zblog插件免费-支持PHP以及ASP
- islower,isalnum,isalpha,tolower,isdigit等c++对ascii字符的处理判断
- java数据结构和算法——前缀表达式(即波兰表达式)、中缀表达式及后缀表达式(即逆波兰表达式)介绍
- 利用python爬取租房信息网_python实战计划:爬取租房信息
- 打包错误:Entry name 'META-INF/ XXX ' collided
- DevOps: Mountain Duck - 多网盘挂载本地工具
- 心得|Python新手如何渡过小白期,不再当菜鸟程序员?
热门文章
- 1.5T和2.0L哪个好?
- 准备进入股市炒股,资金10万,各位能否给点建议?
- 和媳妇加一起月薪三万五想换车了不知道x5养的起吗?
- 南乡子·归梦寄吴樯 [宋] 陆游
- 具有块表的地址变换机构
- linux下文件时间戳
- 统计标点符号的次数 java_Java实现统计一篇文章中每个单词出现的次数
- sql脚本导入sql_学习SQL:SQL脚本
- 浅谈Java的Nio以及报Connection refused: no further information异常原因?
- 认识CSS中高级技巧之元素的显示与隐藏