图
原文链接:https://note.noxussj.top/?source=sifo
什么是图?
图是网络结构的形象模型,是一组由边连贯的节点。图能够示意任何二元关系,比方路线、航班等。在 JavaScript 中没有图,然而能够通过 Object 和 Array 来构建图。
罕用操作
- 深度优先遍历
- 广度优先遍历
图的表示法
- 邻接矩阵
- 邻接表
- 关联矩阵
- ...
邻接矩阵
邻接表
并非仅限于通过对象/数组示意,其余模式也能够。
{ "A": ["B"], "B": ["C", "D"], "C": ["E"], "D": ["A"], "E": ["D"] }
图的深度/广度优先遍历
深度优先遍历
尽可能深的搜寻图的分支。
口诀:
- 先拜访根节点
- 对根节点的没拜访过的相邻节点挨个进行深度优先遍历(因为相邻节点可能也会指向以后节点)
const graph = { A: ['B'], B: ['C', 'D'], C: ['E'], D: ['A'], E: ['D'] } const visited = new Set() const dfs = (n) => { console.log(n) visited.add(n) graph[n].forEach((item) => { if (!visited.has(item)) { dfs(item) } }) } dfs('A') // A B C E D
广度优先遍历
先拜访离根节点最新的节点。
口诀:
- 新建一个队列,把根节点入队
- 把队头出队并拜访
- 把队头的没有拜访过的相邻节点入队
- 反复第 2、3 步直到队列为空
const graph = { A: ['B'], B: ['C', 'D'], C: ['E'], D: ['A'], E: ['D'] } const bfs = (head) => { const visited = new Set() visited.add(head) const q = [head] while (q.length) { const n = q.shift() console.log(n) graph[n].forEach((item) => { if (!visited.has(item)) { q.push(item) visited.add(item) } }) } } bfs('A') // A B C D E
原文链接:https://note.noxussj.top/?source=sifo