JavaScript数据结构——图(Graph)
概念和结构
- 图是由顶点和连接顶点的边构成的,通常将数据元素称为顶点,顶点之间的关系称为边。
- 图分为两种,一种是有向图,另一种是无向图。
- 图常用的表示方法有两种,一种是邻接矩阵,另一种是邻接表。因为邻接矩阵会占用更多的内存,而且进行添加和删除操作会很麻烦,所以这里我们实现邻接表。
- 我们这里实现无向图。
无向图的操作
无向图有六种常用操作,分别为
- 添加顶点 addVertex(v)
- 添加边 addEdge(a,b)
- 打印邻接表 print()
- 广度优先遍历 bfs(v,callback)
- 获取最短路径 shortestPath(from,to)
- 深度优先遍历 dfs(v,callback)
JS实现无向图
JS里面的树结构需要通过对象(object)和数组(array)来实现,其中,对象用来存放边,数组用来存放顶点。
var Graph = function(){//存储顶点var vertexes = [];//存储边var edges = {};//添加顶点this.addVertex = function(v){if(!vertexes.includes(v)){vertexes.push(v);edges[v] = [];}}//添加边this.addEdge = function(a, b){if(vertexes.includes(a) && vertexes.includes(b)){if(!edges[a].includes(b)){edges[a].push(b);edges[b].push(a);}}}//打印邻接表this.print = function(){vertexes.forEach(element => {var s = element + " => ";edges[element].forEach(element2 => {s += element2;});console.log(s);});}//广度优先遍历//用颜色标记状态 white -> 未探索 grey -> 已发现 black -> 已探索this.bfs = function(v , callback){//初始化颜色var color = initColor();//创建队列var queue = new Queue();queue.enqueue(v);while(!queue.isEmpty()){//正在遍历的顶点nowvar now = queue.dequeue();//遍历now相连的每个顶点edges[now].forEach(element => {if(color[element] === 'white'){queue.enqueue(element);color[element] = 'grey';}});color[now] = 'black';if(callback){callback(now);}}}//广度优先遍历需要用到的函数,将每个顶点颜色初始化为whitefunction initColor(){var color = {};vertexes.forEach(element => {color[element] = 'white';});return color;}//广度优先遍历需要用到的队列function Queue(){var queue = [];//入队this.enqueue = function(element){queue.push(element);}//出队this.dequeue = function(){return queue.shift();}//检查队头元素this.front = function(){return queue[0];}//检查队列是否为空this.isEmpty = function(){return queue.length === 0;}//获取队列长度this.size = function(){return queue.length;}//检查队列this.getQueue = function(){return queue;}}//获取最短路径this.shortestPath = function(from , to){//路径栈,从to不断寻找回溯点,在寻找过程中推进栈,最后后进先出拿出来var path = new Stack(),//包含 pre 回溯点 和 d 距离 的对象objobj = this.BFS(from);while(to !== from){path.push(to);to = obj.pre[to];}path.push(to);var s = path.pop();while(!path.isEmpty()){s += ' => ';s += path.pop();}return s;}//获取最短路径需要用到的栈function Stack(){var stack = [];//入栈this.push = function(element){stack.push(element);}//出栈this.pop = function(){return stack.pop();}//检查栈顶元素this.peek = function(){return stack[stack.length - 1];}//检查栈是否为空this.isEmpty = function(){return stack.length === 0;}//清空栈this.clear = function(){stack = [];}//获取栈长度this.size = function(){return stack.length;}//检查栈this.getStack = function(){return stack;}}//获取最短路径需要用到的改良的广度优先算法//回溯点 pre//距离 dthis.BFS = function(v , callback){//初始化颜色var color = initColor();//创建队列var queue = new Queue();queue.enqueue(v);var d = {},pre = {};//初始化d和prevertexes.forEach(element => {d[element] = 0;pre[element] = null;});while(!queue.isEmpty()){//正在遍历的顶点nowvar now = queue.dequeue();//遍历now相连的每个顶点edges[now].forEach(element => {if(color[element] === 'white'){queue.enqueue(element);color[element] = 'grey';pre[element] = now;d[element] = d[now] + 1;}});color[now] = 'black';if(callback){callback(now);}}return {pre: pre,d: d};}//深度优先遍历this.dfs = function(v , callback){var color = initColor();dfsFun(v , color , callback);}//深度优先遍历需要用到的遍历函数function dfsFun(v , color , callback){color[v] = 'grey';edges[v].forEach(element => {if(color[element] === 'white'){dfsFun(element , color , callback);}});color[v] = 'black';if(callback){callback(v);}}
}
JavaScript数据结构——图(Graph)相关推荐
- 数据结构--图(Graph)详解(四)
数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...
- 数据结构--图(Graph)详解(三)
数据结构–图(Graph)详解(三) 文章目录 数据结构--图(Graph)详解(三) 一.深度优先生成树和广度优先生成树 1.铺垫 2.非连通图的生成森林 3.深度优先生成森林 4.广度优先生成森林 ...
- 数据结构--图(Graph)详解(二)
数据结构–图(Graph)详解(二) 文章目录 数据结构--图(Graph)详解(二) 一.图的存储结构 1.图的顺序存储法 2.图的邻接表存储法 3.图的十字链表存储法 4.图的邻接多重表存储法 二 ...
- 数据结构--图(Graph)详解(一)
数据结构–图(Graph)详解(一) 文章目录 数据结构--图(Graph)详解(一) 一.图的基本概念 1.图的分类 2.弧头和弧尾 3.入度和出度 4.(V1,V2) 和 < V1,V2 & ...
- JavaScript数据结构——图的实现
在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用Ja ...
- 数据结构--图 Graph
文章目录 1. 概念 2. 存储方法 2.1 邻接矩阵 Adjacency Matrix 2.2 邻接表 Adjacency List 3. 图的遍历 3.1 广度优先搜索BFS(Breadth Fi ...
- JavaScript数据结构与算法(2)(集合、字典、哈希表、二叉树、图)(ES6)
注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...
- 数据结构与算法(python):图(Graph)的基本概念及应用
参考自 MOOC数据结构与算法Python版 本章代码: https://github.com/HuiFang-hub/-/tree/main. 目录 一.图Graph的概念 1.1 互联网 1.2 ...
- JavaScript数据结构与算法(1)(数组、栈、队列、链表)(ES6)
注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...
最新文章
- 【Excle数据透视表】如何创建非共享缓存的数据透视表
- 如何打开CMD命令行
- ActiveX(二)
- 解决 webpack-dev-server 不能使用 IP 访问
- Ubuntu14.04 YouCompleteMe Configure
- Dynamic Web Module 3.0 requires Java 1.6 or newer.
- SDNU 1406.A+B问题(水题)
- 学爬虫,需要掌握哪些Python基础?
- 从零搭建分布式文件系统MinIO比FastDFS要更合适
- javascript-抽象工厂模式
- 面对来势凶猛的社区电商 小商店的路在哪里?
- 菊子曰测试草稿{29C28FD771BA4B0D8693}
- ArcEngine中打开各种数据源(WorkSpace)的连接
- 电视家鸿蒙系统,ZNDS智能电视强烈推荐:机顶盒上好用的四款软件!
- jvm虚拟机规范官方文档入口
- DNA甲基化可实现转座因子驱动的基因组扩增
- 我的偶像Micheal.Jackson (MTV全集):本来是有一套Micheal的经典VCD的,但被朋友拿走再没还回来……...
- 如何解决外边距重叠问题
- recovery之刷机脚本自定义(解决刷zip文件时出现Status 6错误)
- JAVA中随机数的选取方法
热门文章
- python 迭代器协议斐波那契数列
- 基于HTML5的iPad电子杂志横竖屏自适应方案
- Android之控件与布局,结构知识点,基础完结
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 员工离职管理
- Apache Rewrite实现URL的跳转和域名跳转
- css模拟select设置高度在ie67下有效(也可作为去除边框)
- The Double-Checked Locking is Broken Declaration
- 贺:MSN-.NET 技术交流群荣登群首页
- 无法定位软件包 docker-ce_自媒体!做自媒体账号需要注意什么?定位很重要
- mplab 语法错误不报错_Python怎么解决报错?