TypeScript方式实现源码

  1. // 图的遍历算法
  2. // 算 法 数据结构 描 述
  3. // 深度优先搜索 栈 通过将顶点存入栈中,顶点是沿着路径被探索的,存在新的相
  4. // 邻顶点就去访问
  5. // 广度优先搜索 队列 通过将顶点存入队列中,最先入队列的顶点先被探索
  6. // 当要标注已经访问过的顶点时,我们用三种颜色来反映它们的状态。
  7. //  白色:表示该顶点还没有被访问。
  8. //  灰色:表示该顶点被访问过,但并未被探索过。
  9. //  黑色:表示该顶点被访问过且被完全探索过。
  10. // 广度优先搜索算法会从指定的第一个顶点开始遍历图, 先访问其所有的相邻点, 就像一次访
  11. // 问图的一层
  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 = ; 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 = ; 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 = ; i < this.vertices.length; i++) {
  56. d[this.vertices[i]] = ;
  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 = ; i < neighbors.length; i++) {
  64. let w = neighbors[i];
  65. if (color[w] === 'white') {
  66. color[w] = 'grey';
  67. d[w] = d[u] + ;
  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 = ; i < this.vertices.length; i++) {
  82. s += this.vertices[i] + ' -> ';
  83. let neighbors = this.adjList.get(this.vertices[i]);
  84. for (var j = ; 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 = ; 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[], printNode);
  114.  
  115. var shortestPathA = graph.BFS(myVertices[]);
  116. console.log(shortestPathA);

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 = ; 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 = ; 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 = ; i < this.vertices.length; i++) {
  53. d[this.vertices[i]] = ;
  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 = ; 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] + ;
  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 = ; 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 = ; j < neighbors.length; j++) {
  81. s += neighbors[j] + ' ';
  82. }
  83. s += '\n';
  84. }
  85. return s;
  86. };
  87. return Graph;
  88. }());

JavaScript 图的更多相关文章

  1. 使用JavaScript在项目前台开发的58种常用小技巧

    oncontextmenu="return false" :禁止右键 onselectstart="return false" : 禁止选取 onpaste = ...

  2. javascript实现prim算法

    <script type="text/javascript"> //图的构建 function vnode() { this.visited = 0; this.ver ...

  3. ASP.NET MVC 5 学习教程:添加验证

    原文 ASP.NET MVC 5 学习教程:添加验证 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控 ...

  4. js原型链的说明

    首先需要明确的是:只有对象有__proto__属性,而函数只有prototype属性,没有__proto__属性,函数的原型有一个constructor属性,指向的是函数本身! Function是Ob ...

  5. Javascript的原型链图

    90%的前端或者js程序员或者老师们对Javascript懂得不比这个多 给手机看的 但是这个图里的所有褐色单向箭头链就是Javascript的原型链(颜色标注对理解js原型链很关键) 这图中的各个_ ...

  6. 深入理解javascript作用域系列第五篇——一张图理解执行环境和作用域

    × 目录 [1]图示 [2]概念 [3]说明[4]总结 前面的话 对于执行环境(execution context)和作用域(scope)并不容易区分,甚至很多人认为它们就是一回事,只是高程和犀牛书关 ...

  7. 跟着9张思维导图学习Javascript

    学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将 po 出我收集的 9 张 javascript 相关的思维导图(非原创). 思维导图小tips: 思维导图又叫心智图,是表达发射性思维的 ...

  8. 【原】十张javascript思维导图

    下面附上十张javascript思维导图,如果把里面的内容全部掌握,那就是高手了.思维导图提供给我们一个整体的知识体系,也可以说是一种工具,废话不多说,上图: 1.javascript数据类型 2.j ...

  9. 一张图轻松搞懂javascript event对象的clientX,offsetX,screenX,pageX区别

    总是会被javascript的event对象的clientX,offsetX,screenX,pageX 弄得头晕,于是决定做个图来区分一下(画得我手那个酸呀....) 先总结下区别: event.c ...

随机推荐

  1. 数据管理 - 每天5分钟玩转 Docker 容器技术(147)

    本章将讨论 Kubernetes 如何管理存储资源. 首先我们会学习 Volume,以及 Kubernetes 如何通过 Volume 为集群中的容器提供存储:然后我们会实践几种常用的 Volume ...

  2. java性能调优---------------------JVM调优方案

    JVM的调优的主要过程有: 1.确定堆内存大小(-Xmx.-Xms) 2.合理分配新生代和老年代(-XX:NewRatio.-Xmn.-XX:SurvivorRatio) 3.确定永久区大小(-XX: ...

  3. 设计模式之 观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...

  4. C语言最后一次博客作业

    1.当初你是如何做出选择计算机专业的决定的? 一开始选专业的时候,说实话我很纠结也很迷茫,对我来说,中学时代,似乎就只要考好试,做好题就可以了,对于未来想要做啥并没有那么多的规划和想法,偶尔跟基友畅聊 ...

  5. Alpha冲刺Day6

    Alpha冲刺Day6 一:站立式会议 今日安排: 由张梨贤继续完成前一天委托第三方剩余的内容,并完成委托情况查看这一子模块 由黄腾飞继续完成前一天企业自查风险管理剩余的内容,并完成风险上报这一子模块 ...

  6. python全栈开发-Day13 内置函数

    一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以 ...

  7. nyoj 正数性质

    整数性质 时间限制:500 ms  |  内存限制:65535 KB 难度:1   描述 我们知道,在数学中,对于任意两个正整数a和b,必定存在一对整数s.t使得sa+tb=gcd(a,b).   输 ...

  8. Python 黑客相关电子资源和书籍推荐

    原创 2017-06-03 玄魂工作室 玄魂工作室 继续上一次的Python编程入门的资源推荐,本次为大家推荐的是Python网络安全相关的资源和书籍. 在去年的双11送书的时候,其实送过几本Pyth ...

  9. WPF 自定义ItemsControl/ListBox/ListView控件样式

    一.前言 ItemsControl.ListBox.ListView这三种控件在WPF中都可作为列表信息展示控件.我们可以通过修改这三个控件的样式来展示我们的列表信息. 既然都是展示列表信息的控件,那 ...

  10. 阿里云API网关(5)用户指南(调用 API)

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...