@TOC
图是什么
- 图是网络结构的抽象模型,是一组由边连接的节点
- 图可以表示任何二元关系,比如道路、航班.....
.
- JS中没有图,但是可以用Object和Array构建图
- 图的表示法:邻接矩阵、邻接表、关联矩阵......
图的常用操作
深度优先遍历 广度优先遍历
图的深度/广度优先遍历
const graph = {
0: [1, 2],
1: [2],
2: [0, 3],
3: [3]
};
module.exports = graph;
什么是深度/广度优先遍历
深度优先遍历:尽可能深的搜索图的分支 广度优先遍历:先访问离根节点最近的节点
深度优先遍历算法口诀
没访问过的防止陷入死循环
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);
广度优先遍历算法口诀
新建一个队列,把根节点入队
把队头出队并访问
把队头的没访问过的相邻节点入队
重复第二、三步,直到队列为空
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);
}
});
}
LeetCode:65.有效数字
时间复杂度O(n),n为字符串长度,空间复杂度为O(1)
LeetCode:417.太平洋大西洋水流问题
时间复杂度O(m * n),空间复杂度 O(m * n)
LeetCode:133.克隆图
法一:深度优先遍历
时间复杂度O(n),n为图的节点数,空间复杂度O(n)
法二:广度优先遍历
时间复杂度O(n),空间复杂度O(n)
思考题
1、请用图画出你的朋友圈,无需Coding 2、请用图画出你的偶像的人物关系,无需Coding