图的介绍

图是网络结构的抽象模型。图是一组由边连接的节点(或顶点)。学习图是重要的,因为任何二元关系都可以用图来表示。

任何社交网络,例如Facebook、Twitter和Google plus,都可以用图来表示。

飞机路线图就是图的实例之一:


图的相关术语

通过下图来讲解说明:

相邻顶点:由一条边连接在一起的顶点。比如,A和B是相邻的,A和D是相邻的,A和C是相邻的,A和E不是相邻的。
度:一个顶点相邻顶点的数量。比如,A和其他三个顶点相连接。因此,A的度为3;Eh 饿其他连个顶点相连。因此,E的度为2。
路径:顶点v1连续序列。如ABEI和ACDG。简单路径要求不包含重复的顶点。比如,ADG就是一条简单路径。
环:简单路径ADCA。如果途中不存在,则称该图是无环。如果途中每两个顶点间都存在路径,则该图是连通的。
无向图:图有方向的。如下图:


图的算法实例

var graph = new Graph();var myVertices = ['A','B','C','D','E','F','G','H','I'];for (var i=0; i<myVertices.length; i++){graph.addVertex(myVertices[i]);
}
graph.addEdge('A', 'B');
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');
<!-- A -> B C D B -> E F C -> D G D -> G H E -> I F -> G -> H -> I ->
-->function printNode(value){console.log('Visited vertex: ' + value);
}
graph.bfs(myVertices[0], printNode);
<!-- Visited vertex: AVisited vertex: BVisited vertex: CVisited vertex: DVisited vertex: EVisited vertex: FVisited vertex: GVisited vertex: HVisited vertex: I
-->graph.dfs();
<!-- Discovered ADiscovered BDiscovered EDiscovered Iexplored Iexplored EDiscovered Fexplored Fexplored BDiscovered CDiscovered DDiscovered Gexplored GDiscovered Hexplored Hexplored Dexplored Cexplored A
-->var shortestPathA = graph.BFS(myVertices[0]);var fromVertex = myVertices[0];for (i=1; i<myVertices.length; i++){var toVertex = myVertices[i],path = new Stack();for (var v=toVertex; v!== fromVertex; v=shortestPathA.predecessors[v]) {path.push(v);}path.push(fromVertex);var s = path.pop();while (!path.isEmpty()){s += ' - ' + path.pop();}console.log(s);
}
<!-- A - BA - CA - DA - B - EA - B - FA - C - GA - D - HA - B - E - I
-->var result = graph.DFS();var fTimes = result.finished;
s = '';
for (var count=0; count<myVertices.length; count++){var max = 0;var maxName = null;for (i=0; i<myVertices.length; i++){if (fTimes[myVertices[i]] > max){max = fTimes[myVertices[i]];maxName = myVertices[i];}}s += ' - ' + maxName;delete fTimes[maxName];
}
console.log(s);
// - B - A - D - C - F - E

ES6图完整实现代码:

let Graph = (function() {class Graph {constructor() {this.vertices = [];this.adjList = new Dictionary();this.time = 0;}addVertex(v) {//增加节点this.vertices.push(v);this.adjList.set(v, []); };addEdge(v, w) {//连接路径this.adjList.get(v).push(w);};toString() {//转为string返回var s = '';for(var i = 0; i < this.vertices.length; i++) {s += this.vertices[i] + ' -> ';var neighbors = this.adjList.get(this.vertices[i]);for(var j = 0; j < neighbors.length; j++) {s += neighbors[j] + ' ';}s += '\n';}return s;};initializeColor() {//var color = {};for(var i = 0; i < this.vertices.length; i++) {color[this.vertices[i]] = 'white';}return color;};bfs(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 = 0; i < neighbors.length; i++) {var w = neighbors[i];if(color[w] === 'white') {color[w] = 'grey';queue.enqueue(w);}}color[u] = 'black';if(callback) {callback(u);}}};dfs(callback) {var color = this.initializeColor();for(var i = 0; i < this.vertices.length; i++) {if(color[this.vertices[i]] === 'white') {this.dfsVisit(this.vertices[i], color, callback);}}};dfsVisit(u, color, callback) {color[u] = 'grey';if(callback) {callback(u);}console.log('Discovered ' + u);var neighbors = this.adjList.get(u);for(var i = 0; i < neighbors.length; i++) {var w = neighbors[i];if(color[w] === 'white') {this.dfsVisit(w, color, callback);}}color[u] = 'black';console.log('explored ' + u);};BFS(v) {//广度优先搜索var color = this.initializeColor(),queue = new Queue(),d = {},pred = {};queue.enqueue(v);for(var i = 0; i < this.vertices.length; i++) {d[this.vertices[i]] = 0;pred[this.vertices[i]] = null;}while(!queue.isEmpty()) {var u = queue.dequeue(),neighbors = this.adjList.get(u);color[u] = 'grey';for(i = 0; i < neighbors.length; i++) {var w = neighbors[i];if(color[w] === 'white') {color[w] = 'grey';d[w] = d[u] + 1;pred[w] = u;queue.enqueue(w);}}color[u] = 'black';}return {distances: d,predecessors: pred};};DFS() {//深度优先搜索var color = this.initializeColor(),d = {},f = {},p = {};this.time = 0;for(var i = 0; i < this.vertices.length; i++) {f[this.vertices[i]] = 0;d[this.vertices[i]] = 0;p[this.vertices[i]] = null;}for(i = 0; i < this.vertices.length; i++) {if(color[this.vertices[i]] === 'white') {this.DFSVisit(this.vertices[i], color, d, f, p);}}return {discovery: d,finished: f,predecessors: p};};DFSVisit(u, color, d, f, p) {console.log('discovered ' + u);color[u] = 'grey';d[u] = ++this.time;var neighbors = this.adjList.get(u);for(var i = 0; i < neighbors.length; i++) {var w = neighbors[i];if(color[w] === 'white') {p[w] = u;this.DFSVisit(w, color, d, f, p);}}color[u] = 'black';f[u] = ++this.time;console.log('explored ' + u);};}return Graph;
})()

javascript 图(Graphs)算法与说明相关推荐

  1. JavaScript实现graphBridges图桥算法(附完整源码)

    JavaScript实现graphBridges图桥算法 depthFirstSearch.js完整源代码 graphBridges.js完整源代码 depthFirstSearch.js完整源代码 ...

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

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

  3. JavaScript数据结构与算法——链表详解(下)

    在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...

  4. JavaScript数据结构与算法——链表详解(上)

    注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...

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

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

  6. JavaScript数据结构和算法简述——数组

    为什么先讲数组 数据结构可以简单的被分为线性结构和非线性结构. 线性结构大致包括: 数组(连续存储): 链表(离散存储): 栈(线性结构常见应用,由链表或数组增删和改进功能实现): 队列(线性结构常见 ...

  7. JavaScript数据结构和算法简述——前言

    为什么要使用数据结构和算法(程序=数据结构+算法)         数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排.包括数组.链表.栈.二叉树.哈希表等.        算法是对这些结构中 ...

  8. 《学习JavaScript数据结构与算法》第三章 数组

    文章目录 前言 一.创建 && 初始化数组 二.操作数组 push-添加元素于末尾 unshift-添加元素于开头 pop-从数组末尾开始删除元素 shift-从数组开头开始删除元素 ...

  9. python实现的基于NMF的多图聚类算法

    python实现的基于NMF的多图聚类算法的封装 代码均由论文复现 文章目录 python实现的基于NMF的多图聚类算法的封装 前言 参考论文 一.NMF 二.Mjnmf 总结 前言 怕忘记干了这个事 ...

  10. 学习JavaScript 数据结构与算法

    学习链接:https://github.com/XPoet/js-data-structures-and-algorithms JavaScript 数据结构与算法 1.数据结构(data struc ...

最新文章

  1. mysql8.0本机登录要1秒_Mysql8.0的登录大坑……(忘记登录密码也可以这么搞)
  2. Streaming API
  3. 测试有道:微软测试技术心得
  4. 某IT公司的面试题,难度系数“爆表”。。。
  5. socket通信,server与多客户端通信(二)
  6. 用积木搭出的埃菲尔铁塔
  7. 汉字编码,GB2312、GB 13000、GBK、GB18030 介绍
  8. js原生css修改,原生js获取、添加、修改_非行间css样式
  9. 【物联网毕设基础】NBIOT 窄带物联网
  10. 舟山景区概况 舟山旅游项目介绍
  11. 电子词典 C语言实现
  12. 时间序列学习 经典案例(1)【tsfresh】预测多只股票
  13. 新媒体运营的岗位晋升路线是怎么样的? 新媒体管理师是趋势吗?
  14. 一切相识,都是有缘人
  15. 【MySQL 8.0 OCP 1Z0-908认证考试】题库精讲--第四讲mysql8.0权限安全审计(上)
  16. 自己动手做sidebar
  17. 用Taylor公式估计函数值
  18. 作为非技术背景的创始人,你希望找到一位什么样的CTO?
  19. 蓝桥学习 PREV-50
  20. pubg国际版服务器维护苹果,pubg国际版服务器维护

热门文章

  1. springboot kafka集成
  2. 海思HI3751_HMS开发指南
  3. 【NLP】第16章 Transformer驱动副驾驶的出现
  4. Pinyin4j---JAVA拼音解决方案
  5. ERC-3525 通过倒计时|SFT 是什么?有什么用?
  6. 企业邮箱哪个品牌最好用?10年hr的经验分享
  7. 中国各省存贷款余额(2003-2020年)
  8. 员工转正申请书_员工转正申请书优秀范文两篇
  9. 改造 Firefox 浏览器——GitHub 热点速览 v.21.23
  10. 【JavaEE-面试总结】(未完,待续···)