JavaScript版:数据结构之“图”

427 阅读1分钟

1. 图(graph)简介

1.1 图是什么?

  • 图是网状结构的抽象模型,是一组由边链接的节点
  • 图可以表示任何二元关系,比如道路、航班✈✈......

1.2 JS中的图

  • JS中没有图,但是可以用Object 和 Array 构建图
  • 图的表示法:邻接矩阵、邻接表、关联矩阵......

1.3 图的表示法:邻接矩阵

右图表示来左图 image.png

1.4 图的表示法:邻接表

右图表示来左图 image.png

1.5 图的常用操作

  • 深度优先遍历
  • 广度优先遍历

2. 图的深度/广度优先遍历

创建一个图(邻接表表示法)

// graph.js
const graph = {
    0: [1, 2],
    1: [2],
    2: [0, 3],
    3: [3]
};

module.exports = graph;

2.1 深度优先遍历算法口诀

  • 访问根节点
  • 对根节点的没访问过的相邻节点挨个进行深度算法优先遍历

image.png

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 广度优先遍历算法口诀

  • 新建一个队列,把根节点入队
  • 把队头出队并访问
  • 把队头的没访问过的相邻节点入队
  • 重复第二、三步,直到队列为空

image.png

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);
        }
    });
}