JavaScript 图
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 图的更多相关文章
- 使用JavaScript在项目前台开发的58种常用小技巧
oncontextmenu="return false" :禁止右键 onselectstart="return false" : 禁止选取 onpaste = ...
- javascript实现prim算法
<script type="text/javascript"> //图的构建 function vnode() { this.visited = 0; this.ver ...
- ASP.NET MVC 5 学习教程:添加验证
原文 ASP.NET MVC 5 学习教程:添加验证 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控 ...
- js原型链的说明
首先需要明确的是:只有对象有__proto__属性,而函数只有prototype属性,没有__proto__属性,函数的原型有一个constructor属性,指向的是函数本身! Function是Ob ...
- Javascript的原型链图
90%的前端或者js程序员或者老师们对Javascript懂得不比这个多 给手机看的 但是这个图里的所有褐色单向箭头链就是Javascript的原型链(颜色标注对理解js原型链很关键) 这图中的各个_ ...
- 深入理解javascript作用域系列第五篇——一张图理解执行环境和作用域
× 目录 [1]图示 [2]概念 [3]说明[4]总结 前面的话 对于执行环境(execution context)和作用域(scope)并不容易区分,甚至很多人认为它们就是一回事,只是高程和犀牛书关 ...
- 跟着9张思维导图学习Javascript
学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将 po 出我收集的 9 张 javascript 相关的思维导图(非原创). 思维导图小tips: 思维导图又叫心智图,是表达发射性思维的 ...
- 【原】十张javascript思维导图
下面附上十张javascript思维导图,如果把里面的内容全部掌握,那就是高手了.思维导图提供给我们一个整体的知识体系,也可以说是一种工具,废话不多说,上图: 1.javascript数据类型 2.j ...
- 一张图轻松搞懂javascript event对象的clientX,offsetX,screenX,pageX区别
总是会被javascript的event对象的clientX,offsetX,screenX,pageX 弄得头晕,于是决定做个图来区分一下(画得我手那个酸呀....) 先总结下区别: event.c ...
随机推荐
- 数据管理 - 每天5分钟玩转 Docker 容器技术(147)
本章将讨论 Kubernetes 如何管理存储资源. 首先我们会学习 Volume,以及 Kubernetes 如何通过 Volume 为集群中的容器提供存储:然后我们会实践几种常用的 Volume ...
- java性能调优---------------------JVM调优方案
JVM的调优的主要过程有: 1.确定堆内存大小(-Xmx.-Xms) 2.合理分配新生代和老年代(-XX:NewRatio.-Xmn.-XX:SurvivorRatio) 3.确定永久区大小(-XX: ...
- 设计模式之 观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...
- C语言最后一次博客作业
1.当初你是如何做出选择计算机专业的决定的? 一开始选专业的时候,说实话我很纠结也很迷茫,对我来说,中学时代,似乎就只要考好试,做好题就可以了,对于未来想要做啥并没有那么多的规划和想法,偶尔跟基友畅聊 ...
- Alpha冲刺Day6
Alpha冲刺Day6 一:站立式会议 今日安排: 由张梨贤继续完成前一天委托第三方剩余的内容,并完成委托情况查看这一子模块 由黄腾飞继续完成前一天企业自查风险管理剩余的内容,并完成风险上报这一子模块 ...
- python全栈开发-Day13 内置函数
一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以 ...
- nyoj 正数性质
整数性质 时间限制:500 ms | 内存限制:65535 KB 难度:1 描述 我们知道,在数学中,对于任意两个正整数a和b,必定存在一对整数s.t使得sa+tb=gcd(a,b). 输 ...
- Python 黑客相关电子资源和书籍推荐
原创 2017-06-03 玄魂工作室 玄魂工作室 继续上一次的Python编程入门的资源推荐,本次为大家推荐的是Python网络安全相关的资源和书籍. 在去年的双11送书的时候,其实送过几本Pyth ...
- WPF 自定义ItemsControl/ListBox/ListView控件样式
一.前言 ItemsControl.ListBox.ListView这三种控件在WPF中都可作为列表信息展示控件.我们可以通过修改这三个控件的样式来展示我们的列表信息. 既然都是展示列表信息的控件,那 ...
- 阿里云API网关(5)用户指南(调用 API)
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...