最后一例,搞得快。三天之内走了一次。。

下一步,面象对像的javascript编程。

  1. function Dictionary(){
  2. var items = {};
  3.  
  4. this.has = function (key) {
  5. return key in items;
  6. };
  7.  
  8. this.set = function(key, value){
  9. items[key] = value;
  10. };
  11.  
  12. this.remove = function(key){
  13. if (this.has(key)){
  14. delete items[key];
  15. return true;
  16. }
  17. return false;
  18. };
  19.  
  20. this.get = function(key){
  21. return this.has(key) ? items[key] : undefined;
  22. };
  23.  
  24. this.values = function(){
  25. var values = [];
  26. for(var k in items){
  27. if (this.has(k)) {
  28. values.push(items[k]);
  29. }
  30. }
  31. return values;
  32. };
  33.  
  34. this.clear = function(){
  35. items = {};
  36. };
  37.  
  38. this.size = function(){
  39. var count = 0;
  40. for (var prop in items){
  41. if(items.hasOwnProperty(prop)){
  42. ++count;
  43. }
  44. }
  45. return count;
  46. };
  47.  
  48. this.getItems = function(){
  49. return items;
  50. };
  51. }
  52.  
  53. function Queue() {
  54. var items = [];
  55. this.enqueue = function(element){
  56. items.push(element);
  57. }
  58.  
  59. this.dequeue = function(){
  60. return items.shift();
  61. }
  62.  
  63. this.front = function(){
  64. return items[0];
  65. }
  66.  
  67. this.isEmpty = function(){
  68. return items.length == 0;
  69. }
  70.  
  71. this.clear = function(){
  72. items = [];
  73. }
  74.  
  75. this.size = function(){
  76. return items.length;
  77. }
  78.  
  79. this.print = function(){
  80. console.log(items.toString());
  81. }
  82. }
  83.  
  84. function Graph() {
  85. var vertices = [];
  86. var adjList = new Dictionary();
  87.  
  88. var initializeColor = function(){
  89. var color = [];
  90. for (var i=0; i<vertices.length; i++){
  91. color[vertices[i]] = 'white'; //{1}
  92. }
  93. return color;
  94. };
  95.  
  96. this.addVertex = function(v) {
  97. vertices.push(v);
  98. adjList.set(v, []);
  99. };
  100.  
  101. this.addEdge = function(v, w){
  102. adjList.get(v).push(w);
  103. adjList.get(w).push(v);
  104. };
  105.  
  106. this.bfs = function(v, callback){
  107. var color = initializeColor(), //{2}
  108. queue = new Queue(); //{3}
  109. queue.enqueue(v); //{4}
  110. while (!queue.isEmpty()){ //{5}
  111. var u = queue.dequeue(), //{6}
  112. neighbors = adjList.get(u); //{7}
  113. color[u] = 'grey'; // {8}
  114. for (var i=0; i<neighbors.length; i++){ // {9}
  115. var w = neighbors[i]; // {10}
  116. if (color[w] === 'white'){ // {11}
  117. color[w] = 'grey'; // {12}
  118. queue.enqueue(w); // {13}
  119. }
  120. }
  121. color[u] = 'black'; // {14}
  122. if (callback) { // {15}
  123. callback(u);
  124. }
  125. }
  126. };
  127.  
  128. this.dfs = function(callback){
  129. var color = initializeColor(); //{1}
  130. for (var i=0; i<vertices.length; i++){ //{2}
  131. if (color[vertices[i]] === 'white'){ //{3}
  132. dfsVisit(vertices[i], color, callback); //{4}
  133. }
  134. }
  135. };
  136. var dfsVisit = function(u, color, callback){
  137. color[u] = 'grey'; //{5}
  138. if (callback) { //{6}
  139. callback(u);
  140. }
  141. var neighbors = adjList.get(u); //{7}
  142. for (var i=0; i<neighbors.length; i++){ //{8}
  143. var w = neighbors[i]; //{9}
  144. if (color[w] === 'white'){ //{10}
  145. dfsVisit(w, color, callback); //{11}
  146. }
  147. }
  148. color[u] = 'black'; //{12}
  149. };
  150.  
  151. this.toString = function(){
  152. var s = '';
  153. for (var i=0; i<vertices.length; i++){ //{10}
  154. s += vertices[i] + ' -> ';
  155. var neighbors = adjList.get(vertices[i]); //{11}
  156. for (var j=0; j<neighbors.length; j++){ //{12}
  157. s += neighbors[j] + ' ';
  158. }
  159. s += '\n'; //{13}
  160. }
  161. return s;
  162. };
  163. }
  164.  
  165. var graph = new Graph();
  166. var myVertices = ['A','B','C','D','E','F','G','H','I'];
  167. for (var i=0; i<myVertices.length; i++){
  168. graph.addVertex(myVertices[i]);
  169. }
  170. graph.addEdge('A', 'B'); //{9}
  171. graph.addEdge('A', 'C');
  172. graph.addEdge('A', 'D');
  173. graph.addEdge('C', 'D');
  174. graph.addEdge('C', 'G');
  175. graph.addEdge('D', 'G');
  176. graph.addEdge('D', 'H');
  177. graph.addEdge('B', 'E');
  178. graph.addEdge('B', 'F');
  179. graph.addEdge('E', 'I');
  180.  
  181. console.log(graph.toString());
  182.  
  183. function printNode(value){ //{16}
  184. console.log('Visited vertex: ' + value); //{17}
  185. }
  186. graph.bfs(myVertices[0], printNode); //{18}
  187. graph.dfs(printNode);

javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)的更多相关文章

  1. (转)广度优先搜索BFS和深度优先搜索DFS

    1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...

  2. 广度优先(bfs)和深度优先搜索(dfs)的应用实例

    广度优先搜索应用举例:计算网络跳数 图结构在解决许多网络相关的问题时直到了重要的作用. 比如,用来确定在互联网中从一个结点到另一个结点(一个网络到其他网络的网关)的最佳路径.一种建模方法是采用无向图, ...

  3. matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  4. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  5. 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS

    前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...

  6. 广度优先搜索(BFS)与深度优先搜索(DFS)的对比及优缺点

    深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇到终点,他 ...

  7. 深度优先搜索 & 广度优先搜索

    目录 邻接表 邻接表的深度优先搜索 邻接表的广度优先搜索 临接数组 临接数组的深度优先搜索 临接数组的广度优先搜索 二叉树 二叉树的深度优先搜索 二叉树的广度优先搜索 邻接表 邻接表的深度优先搜索 假 ...

  8. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  9. 回溯算法 DFS深度优先搜索 (递归与非递归实现)

    回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...

随机推荐

  1. tp auth 转载保存

    PS:最近需要做一个验证用户权限的功能,在官方和百度看了下,发现大家都是用auth来做验证,官方有很多auth的使用教程,但是都不全面,我也提问了几个关于auth的问题 也没人来回答我,无奈只好一步步 ...

  2. Docker系列之(三):Docker微容器Alpine Linux

    1. 前言 使用Docker创建容器时,基础镜像通常选择Ubuntu或Centos,不管哪个镜像的大小都在100MB以上. Alpine Linux是一个面向安全的轻型的Linux发行版. Alpin ...

  3. 定义declare、%TYPE%、ROWTYPE、加循环

    %TYPE:定义一个变量,其数据类型与已经定义的某个 数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE. %ROWTYPE PL/SQL 提供%ROWTYPE 操作符, ...

  4. mysql链接数据库时报错

    今天在命令行下链接mysql数据库报错,如下: ERROR (HY000): Can't connect to MySQL server on 'ost' (113) 这是一个什么玩意呢,怎么会报这个 ...

  5. 繁华模拟赛 vicent的字符串

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  6. show processlist 其中status详解(适用于所有概况)

    mysql show processlist分析 2011-04-11 16:13:00 分类: Mysql/postgreSQL mysql> show processlist; +—–+—— ...

  7. java笔记--枚举总结与详解

    由于工作原因,已经有两礼拜没有更新博客了,好不容易完成了工作项目,终于又可以在博客园上愉快的玩耍了. 嗯,今天下午梳理了一下关于java枚举的笔记,比较长,不过还是觉得挺厚实的,哈哈,有出入的地方,欢 ...

  8. [Educational Codeforces Round 16]C. Magic Odd Square

    [Educational Codeforces Round 16]C. Magic Odd Square 试题描述 Find an n × n matrix with different number ...

  9. 破解TP-Link路由-嗅探PPPoE拨号密码

    如果你平时都使用路由器直接上网,那么你还记得你的宽带(ADSL)帐户名和密码吗?忘记密码后又该如何找回呢?别急,本文带你一同找回遗忘的ADSL密码.1.安全性较差的路由器(例如腾达的某些路由器):这里 ...

  10. 关于LINUX文件与目录的问题说明

    文件权限一般可认为是0 123 456 789,一共十位: 0:表示该文件的文件类型.Windows里面是使用了一种文件关联的技术,通过扩展名来关联相应的应用程序,使得双击某个文件,就能达到调用相应的 ...