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. Web安全概述

    互联网刚开始是安全的,但是伴随着黑客(Hacker)的诞生,互联网变得越来越不安全.任何一个事情都有两面性,黑客也有好有坏,好的黑客叫白帽子,坏的黑客叫黑帽子.与此同时,随着Web技术发展越来越成熟, ...

  2. "机器人防火墙":人机识别在应用安全及风控领域的一点实践

    美剧 WestWorld 第二集里有个场景十分有意思:游客来到西部世界公园,遇到了一个漂亮的女接待员,但无法区分对方是否是人类,于是产生了如下对话: Guest: "Are you real ...

  3. 设置如何远程连接mysql数据库

    安装好mysql5.6.37后,默认情况下,只允许本地登录,禁止远程登录. 可以现在本地安装好连接工具,比如sqlyog或者navicat 登陆后,切换至mysql数据库 执行下面2条语句 '; FL ...

  4. iOS极光推送SDK的使用流程

    一.极光推送简介 极光推送是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,整合了iOS.Android和WP平台的统一推送服务.使用起来方便简单,已于集成,解决了原生远程推送繁 ...

  5. bzoj 4373 算术天才⑨与等差数列

    4373: 算术天才⑨与等差数列 Time Limit: 10 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.ph ...

  6. jQuery 写的textarea输入字数限制

    //先判断浏览器是不是万恶的IE        var bind_name = 'input';//默认事件        if (navigator.userAgent.indexOf(" ...

  7. java中final 关键字的作用

    final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...

  8. SQL Server(MySql)中的联合主键(联合索引) 索引分析

    最近有人问到这个问题,之前也一直没有深究联合索引具体使用逻辑,查阅多篇文章,并经过测试,得出一些结论 测试环境:SQL Server 2008 R2 测试结果与MySql联合索引查询机制类似,可以认为 ...

  9. openssl几个加密算法使用介绍

    1.openssl简介 1)openssl概述 OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. ...

  10. kafka之zookeeper 节点

    1.zookeeper 节点 kafka 在 zookeeper 中的存储结构如下图所示: