TypeScript方式实现源码

// 图的遍历算法
// 算 法 数据结构 描 述
// 深度优先搜索 栈 通过将顶点存入栈中,顶点是沿着路径被探索的,存在新的相
// 邻顶点就去访问
// 广度优先搜索 队列 通过将顶点存入队列中,最先入队列的顶点先被探索
// 当要标注已经访问过的顶点时,我们用三种颜色来反映它们的状态。
//  白色:表示该顶点还没有被访问。
//  灰色:表示该顶点被访问过,但并未被探索过。
//  黑色:表示该顶点被访问过且被完全探索过。
// 广度优先搜索算法会从指定的第一个顶点开始遍历图, 先访问其所有的相邻点, 就像一次访
// 问图的一层
 class Graph {
vertices = [];
adjList = new Dictionary();
public addVertex(v) {
this.vertices.push(v);
this.adjList.set(v, []);
}
public addEdge(v, w) {
this.adjList.get(v).push(w);
this.adjList.get(w).push(v);
}
public initializeColor() {
let color = [], length = this.vertices.length;
for (var i = ; i < length; i++) {
color[this.vertices[i]] = 'white';
}
return color;
}
/**
* 宽度优先搜索
* @param v
* @param callback
*/
public bfs(v, callback) {
let color = this.initializeColor(),
queue = new Queue();
queue.enqueue(v);
while (!queue.isEmpty()) {
let u = queue.dequeue(),
neighbors = this.adjList.get(u);
color[u] = 'grey';
for (let i = ; i < neighbors.length; i++) {
let w = neighbors[i];
if (color[w] === 'white') {
color[w] = 'grey';
queue.enqueue(w);
}
}
color[u] = 'black';
if (callback) {
callback(u);
}
}
}
/**
* 寻找最短路径
* @param v
*/
public BFS(v) {
let color = this.initializeColor(),
queue = new Queue(),
d = [],
pred = [];
queue.enqueue(v);
for (var i = ; i < this.vertices.length; i++) {
d[this.vertices[i]] = ;
pred[this.vertices[i]] = null;
}
while (!queue.isEmpty()) {
let u = queue.dequeue(),
neighbors = this.adjList.get(u);
color[u] = 'grey';
for (let i = ; i < neighbors.length; i++) {
let w = neighbors[i];
if (color[w] === 'white') {
color[w] = 'grey';
d[w] = d[u] + ;
pred[w] = u;
queue.enqueue(w);
}
}
color[u] = 'black';
}
return {
distances: d,
predecessors: pred
}
}
public toString() {
let s = '';
for (let i = ; i < this.vertices.length; i++) {
s += this.vertices[i] + ' -> ';
let neighbors = this.adjList.get(this.vertices[i]);
for (var j = ; j < neighbors.length; j++) {
s += neighbors[j] + ' ';
}
s += '\n';
}
return s;
}
}
var graph = new Graph();
var myVertices = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']; //{7}
for (var i = ; i < myVertices.length; i++) { //{8}
graph.addVertex(myVertices[i]);
}
graph.addEdge('A', 'B'); //{9}
graph.addEdge('A', 'C');
graph.addEdge('A', 'D');
graph.addEdge('C', 'D');
graph.addEdge('C', 'G');
graph.addEdge('D', 'G');
graph.addEdge('D', 'H');
graph.addEdge('B', 'E');
graph.addEdge('B', 'F');
graph.addEdge('E', 'I'); console.log(graph.toString()); function printNode(value) {
console.log('Visited vertex:' + value);
}
graph.bfs(myVertices[], printNode); var shortestPathA = graph.BFS(myVertices[]);
console.log(shortestPathA);

JavaScript方式实现源码

 var Graph = (function () {
function Graph() {
this.vertices = [];
this.adjList = new Dictionary();
}
Graph.prototype.addVertex = function (v) {
this.vertices.push(v);
this.adjList.set(v, []);
};
Graph.prototype.addEdge = function (v, w) {
this.adjList.get(v).push(w);
this.adjList.get(w).push(v);
};
Graph.prototype.initializeColor = function () {
var color = [], length = this.vertices.length;
for (var i = ; i < length; i++) {
color[this.vertices[i]] = 'white';
}
return color;
};
/**
* 宽度优先搜索
* @param v
* @param callback
*/
Graph.prototype.bfs = function (v, callback) {
var color = this.initializeColor(), queue = new Queue();
queue.enqueue(v);
while (!queue.isEmpty()) {
var u = queue.dequeue(), neighbors = this.adjList.get(u);
color[u] = 'grey';
for (var i_1 = ; i_1 < neighbors.length; i_1++) {
var w = neighbors[i_1];
if (color[w] === 'white') {
color[w] = 'grey';
queue.enqueue(w);
}
}
color[u] = 'black';
if (callback) {
callback(u);
}
}
};
/**
* 寻找最短路径
* @param v
*/
Graph.prototype.BFS = function (v) {
var color = this.initializeColor(), queue = new Queue(), d = [], pred = [];
queue.enqueue(v);
for (var i = ; i < this.vertices.length; i++) {
d[this.vertices[i]] = ;
pred[this.vertices[i]] = null;
}
while (!queue.isEmpty()) {
var u = queue.dequeue(), neighbors = this.adjList.get(u);
color[u] = 'grey';
for (var i_2 = ; i_2 < neighbors.length; i_2++) {
var w = neighbors[i_2];
if (color[w] === 'white') {
color[w] = 'grey';
d[w] = d[u] + ;
pred[w] = u;
queue.enqueue(w);
}
}
color[u] = 'black';
}
return {
distances: d,
predecessors: pred
};
};
Graph.prototype.toString = function () {
var s = '';
for (var i_3 = ; i_3 < this.vertices.length; i_3++) {
s += this.vertices[i_3] + ' -> ';
var neighbors = this.adjList.get(this.vertices[i_3]);
for (var j = ; j < neighbors.length; j++) {
s += neighbors[j] + ' ';
}
s += '\n';
}
return s;
};
return Graph;
}());

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. sessionStorage和localStorage的用法,不同点和相同点

    一,共同点 (1)存储时用setItem: localStorage.setItem("key","value");//以"key"为名称存 ...

  2. Matlab绘图基础——一些标准三维曲面

    标准三维曲面 t=0:pi/20:2*pi; [x,y,z]= cylinder(2+sin(t),30);     %[x,y,z]= cylinder(R,n),其中R为圆周半径,n为组成圆周的点 ...

  3. SDK提交到CocoaPods

    一:GitHub新建仓库,并clone到本地 1.注册GitHub账号并登录 2.右上方点击+,新建仓库(仓库名字(Repository name).仓库权限(Public).readme.licen ...

  4. CentOS7搭建solr7.2

    solr介绍 一.Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中. 二.Solr 提供了层面搜索(就是统计).命中醒目显示并且支持多种输出格式( ...

  5. Hive 报错:java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient

    在配置好hive后启动报错信息如下: [walloce@bigdata-study- hive--cdh5.3.6]$ bin/hive Logging initialized using confi ...

  6. 201621123062《java程序设计》第13周作业总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 思维导图: 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多 ...

  7. Codechef March Challenge 2014——The Street

    The Street Problem Code: STREETTA https://www.codechef.com/problems/STREETTA Submit Tweet All submis ...

  8. SAN LUN Mapping出错导致文件系统共享冲突,数据恢复成功

    [用户单位] 中国联通某分公司[数据恢复故障描述]    SUN 光纤存储系统,中心存储为6枚300G硬盘组成的RAID6,划分为若干LUN,MAP到不同业务的服务器上,服务器上运行SUN SOLAR ...

  9. D的下L

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2   描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...

  10. .Net Core MongoDB 简单操作。

    一:MongoDB 简单操作类.这里引用了MongoDB.Driver. using MongoDB.Bson; using MongoDB.Driver; using System; using S ...