1. 图(graph)简介
1.1 图是什么?
- 图是
网状结构的抽象模型,是一组由边链接的节点。 - 图可以表示任何二元关系,比如道路、航班✈✈......
1.2 JS中的图
- JS中没有图,但是可以用Object 和 Array 构建图
- 图的表示法:邻接矩阵、邻接表、关联矩阵......
1.3 图的表示法:邻接矩阵
右图表示来左图
1.4 图的表示法:邻接表
右图表示来左图
1.5 图的常用操作
- 深度优先遍历
- 广度优先遍历
2. 图的深度/广度优先遍历
创建一个图(邻接表表示法)
// graph.js
const graph = {
0: [1, 2],
1: [2],
2: [0, 3],
3: [3]
};
module.exports = graph;
2.1 深度优先遍历算法口诀
- 访问根节点
- 对根节点的
没访问过的相邻节点挨个进行深度算法优先遍历
2.2 深度优先遍历(dfs)实现
const graph = require('./graph');
// 记录是否访问过
const visited = new Set();
const dfs = (n) => {
console.log(n);
visited.add(n);
graph[n].forEach(c => {
// 没访问过
if(!visited.has(c)){
dfs(c);
}
});
};
dfs(2);
2.3 广度优先遍历算法口诀
- 新建一个队列,把根节点入队
- 把队头出队并访问
- 把队头的
没访问过的相邻节点入队 - 重复第二、三步,直到队列为空
2.2 广度优先遍历(bfs)实现
const graph = require('./graph');
const visited = new Set();
visited.add(2);
const q = [2];
while (q.length) {
const n = q.shift();
console.log(n);
graph[n].forEach(c => {
if (!visited.has(c)) {
q.push(c);
visited.add(c);
}
});
}