图是网络结构的抽象模型,是一组由边连接的节点。
图是什么
图可以表示任何二元关系,比如知道的路线图、航班图...
JS中没有图,但是可以用Object和Array构建图。图的表示法: 邻接矩阵、邻接表、关联矩阵...
图的常用操作:深度优先遍历、广度优先遍历
深度、广度优先遍历
const graph = {
0: [1, 2],
1: [2],
2: [0, 3],
3: [3]
}
深度优先遍历:尽可能深的搜索图的分支。算法:
- 1、访问根节点
- 2、对根节点的没访问过的相邻节点挨个进行深度优先遍历
let visibled = new Set();
const dfs = (n)=> {
console.log(n);
visibled.add(n);
graph[n].forEach(g => {
if(!visibled.has(g)){
dfs(g);
}
});
}
dfs(2);
//输出结果
2
0
1
3
广度优先遍历:先访问离根节点最近的节点。算法:
- 1、新建一个队列,把根节点入队
- 2、把队头出队并访问
- 3、把队头的没访问过的相邻节点入队
- 4、重复2、3步,直到队列为空
const bsf = (start) => {
let visibled = new Set();
let queue = [start];
visibled.set(start);
while (queue.length) {
const n = queue.shift();
console.log(n);
graph[n].forEach((g) => {
if (!visibled.has(g)) {
queue.push(g);
visibled.add(g);
}
})
}
}
bsf(2);
//输出结果
2
0
3
1