概念和结构

  • 图是由顶点和连接顶点的构成的,通常将数据元素称为顶点,顶点之间的关系称为边。
  • 图分为两种,一种是有向图,另一种是无向图。
  • 图常用的表示方法有两种,一种是邻接矩阵,另一种是邻接表。因为邻接矩阵会占用更多的内存,而且进行添加和删除操作会很麻烦,所以这里我们实现邻接表。

  • 我们这里实现无向图

无向图的操作

无向图有六种常用操作,分别为

  1. 添加顶点 addVertex(v)
  2. 添加边 addEdge(a,b)
  3. 打印邻接表 print()
  4. 广度优先遍历 bfs(v,callback)
  5. 获取最短路径 shortestPath(from,to)
  6. 深度优先遍历 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)相关推荐

  1. 数据结构--图(Graph)详解(四)

    数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...

  2. 数据结构--图(Graph)详解(三)

    数据结构–图(Graph)详解(三) 文章目录 数据结构--图(Graph)详解(三) 一.深度优先生成树和广度优先生成树 1.铺垫 2.非连通图的生成森林 3.深度优先生成森林 4.广度优先生成森林 ...

  3. 数据结构--图(Graph)详解(二)

    数据结构–图(Graph)详解(二) 文章目录 数据结构--图(Graph)详解(二) 一.图的存储结构 1.图的顺序存储法 2.图的邻接表存储法 3.图的十字链表存储法 4.图的邻接多重表存储法 二 ...

  4. 数据结构--图(Graph)详解(一)

    数据结构–图(Graph)详解(一) 文章目录 数据结构--图(Graph)详解(一) 一.图的基本概念 1.图的分类 2.弧头和弧尾 3.入度和出度 4.(V1,V2) 和 < V1,V2 & ...

  5. JavaScript数据结构——图的实现

    在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用Ja ...

  6. 数据结构--图 Graph

    文章目录 1. 概念 2. 存储方法 2.1 邻接矩阵 Adjacency Matrix 2.2 邻接表 Adjacency List 3. 图的遍历 3.1 广度优先搜索BFS(Breadth Fi ...

  7. JavaScript数据结构与算法(2)(集合、字典、哈希表、二叉树、图)(ES6)

    注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...

  8. 数据结构与算法(python):图(Graph)的基本概念及应用

    参考自 MOOC数据结构与算法Python版 本章代码: https://github.com/HuiFang-hub/-/tree/main. 目录 一.图Graph的概念 1.1 互联网 1.2 ...

  9. JavaScript数据结构与算法(1)(数组、栈、队列、链表)(ES6)

    注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...

最新文章

  1. 【Excle数据透视表】如何创建非共享缓存的数据透视表
  2. 如何打开CMD命令行
  3. ActiveX(二)
  4. 解决 webpack-dev-server 不能使用 IP 访问
  5. Ubuntu14.04 YouCompleteMe Configure
  6. Dynamic Web Module 3.0 requires Java 1.6 or newer.
  7. SDNU 1406.A+B问题(水题)
  8. 学爬虫,需要掌握哪些Python基础?
  9. 从零搭建分布式文件系统MinIO比FastDFS要更合适
  10. javascript-抽象工厂模式
  11. 面对来势凶猛的社区电商 小商店的路在哪里?
  12. 菊子曰测试草稿{29C28FD771BA4B0D8693}
  13. ArcEngine中打开各种数据源(WorkSpace)的连接
  14. 电视家鸿蒙系统,ZNDS智能电视强烈推荐:机顶盒上好用的四款软件!
  15. jvm虚拟机规范官方文档入口
  16. DNA甲基化可实现转座因子驱动的基因组扩增
  17. 我的偶像Micheal.Jackson (MTV全集):本来是有一套Micheal的经典VCD的,但被朋友拿走再没还回来……...
  18. 如何解决外边距重叠问题
  19. recovery之刷机脚本自定义(解决刷zip文件时出现Status 6错误)
  20. JAVA中随机数的选取方法

热门文章

  1. python 迭代器协议斐波那契数列
  2. 基于HTML5的iPad电子杂志横竖屏自适应方案
  3. Android之控件与布局,结构知识点,基础完结
  4. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 员工离职管理
  5. Apache Rewrite实现URL的跳转和域名跳转
  6. css模拟select设置高度在ie67下有效(也可作为去除边框)
  7. The Double-Checked Locking is Broken Declaration
  8. 贺:MSN-.NET 技术交流群荣登群首页
  9. 无法定位软件包 docker-ce_自媒体!做自媒体账号需要注意什么?定位很重要
  10. mplab 语法错误不报错_Python怎么解决报错?