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 图相关推荐

  1. 使用Electron.js运行JavaScript图应用程序

    MindFusion.Diagramming for WinForms是一个能帮助你创建工作流和进程图表的.NET控件:数据库实体关系图表:组织图表:对象层次和关系图表:图表和树.它是基于对象-图表框 ...

  2. JavaScript图中以编程方式平移和缩放

    MindFusion.Diagramming for WinForms是一个能帮助你创建工作流和进程图表的.NET控件:数据库实体关系图表:组织图表:对象层次和关系图表:图表和树.它是基于对象-图表框 ...

  3. [读书笔记]5个小技巧让你写出更好的JavaScript[图]

    在使用JavaScript时,我们常常要写不少的条件语句.这里有五个小技巧,可以让你写出更干净.漂亮的条件语句. 使用Array.includes来处理多重条件 举个栗子: //条件语句 functi ...

  4. 奔图内部扫描错误13_现代浏览器内部揭秘(第三部分)

    这是关于浏览器工作原理博客系列四部分中的第三部分.之前,我们介绍了 多进程架构 和 导航流.在这篇文章中,我们将一探渲染进程的内部机制. 渲染进程的内部机制 渲染进程涉及 Web 性能的许多方面.由于 ...

  5. 翻译:《JavaScript 权威指南(第5版)》第一章(一)

    声明:翻译只有一个目的:学习用途.若有版权问题请及时联系本人. 本贴文根据篇幅将第一章的翻译分为两个部分,这是第一部分的内容. Chapter 1. Introduction to JavaScrip ...

  6. js pug 代码_用JS写的windows95操作系统

    README.md 这是Windows95,在Electron应用程序中运行.是的,这是完整的. 它有用吗? 是的,可以.实际上,在macOS,Windows和Linux上.请记住,这完全是用Java ...

  7. Python 可视化库

    https://www.infoq.cn/article/pSV6tZ1SbUC8qJpo_v8H 在奥斯汀举行的SciPy 2018年特别会议上,大量开源 Python 可视化工具的代表分享了他们对 ...

  8. Python数据可视化2018:数据可视化库为什么这么多?

    本文最初发布于Anaconda开发者博客,经原作者授权由InfoQ中文站翻译并分享. 在奥斯汀举行的SciPy 2018年特别会议上,大量开源Python可视化工具的代表分享了他们对Python数据可 ...

  9. python基于web可视化_python可视化(转载)

    本文是关于Python数据可视化工具状态和SciPy 2018中出现的趋势的三部分系列文章中的第一篇. 作者:James A.Bender 在奥斯汀举行的SciPy 2018特别会议上,各种开源Pyt ...

最新文章

  1. python编程程序设计_程序设计入门—Python
  2. spring data jpa从入门到精通_Spring Data JPA的简单入门
  3. ADSL宽带为什么下载和上传速度差别如此之大?
  4. Java爬取校内论坛新帖
  5. java oracle 乐观锁,oracle为什么默认乐观锁
  6. 确定最小的正整数n,使得n!的结尾恰好有1987个0
  7. oracle将字符串的日期格式化,oracle格式化字符串 oracle 怎么把字符串转换成日期...
  8. 复联4里用到的方法论
  9. 安装了Node.js 从VScode 使用node -v 和 npm -v等命令却无效
  10. spring 事物的级别_Spring 事务中的隔离级别有哪几种?
  11. 神经网络优化中的病态问题
  12. QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件...
  13. Maven无法下载com.oracle:ojdbc14:jar解决方法
  14. zblog博客模板-zblog插件免费-支持PHP以及ASP
  15. islower,isalnum,isalpha,tolower,isdigit等c++对ascii字符的处理判断
  16. java数据结构和算法——前缀表达式(即波兰表达式)、中缀表达式及后缀表达式(即逆波兰表达式)介绍
  17. 利用python爬取租房信息网_python实战计划:爬取租房信息
  18. 打包错误:Entry name 'META-INF/ XXX ' collided
  19. DevOps: Mountain Duck - 多网盘挂载本地工具
  20. 心得|Python新手如何渡过小白期,不再当菜鸟程序员?

热门文章

  1. 1.5T和2.0L哪个好?
  2. 准备进入股市炒股,资金10万,各位能否给点建议?
  3. 和媳妇加一起月薪三万五想换车了不知道x5养的起吗?
  4. 南乡子·归梦寄吴樯 [宋] 陆游
  5. 具有块表的地址变换机构
  6. linux下文件时间戳
  7. 统计标点符号的次数 java_Java实现统计一篇文章中每个单词出现的次数
  8. sql脚本导入sql_学习SQL:SQL脚本
  9. 浅谈Java的Nio以及报Connection refused: no further information异常原因?
  10. 认识CSS中高级技巧之元素的显示与隐藏