前端之数据结构(六)图

这是我参与8月更文挑战的第七天,活动详情查看:8月更文挑战node

上一章介绍了树的另外一种形态二叉树,并说了递归版的先中后序遍历。markdown

这一章就来介绍一下图这种数据结构。网络

  • 图是网络结构的抽象模型,是一组由链接的节点数据结构

  • 图能够表示任何二元关系,好比道路、航班......app

image.png

image.png

  • JS 中没有图,可是能够用 ObjectArray 构建图。post

  • 图的表示法: 邻接矩阵、邻接表、关联矩阵......ui

图的表示法

以下图:url

image.png

邻接矩阵

用邻接矩阵能够以下表示:spa

image.png

每两个交叉点为 1 的,就表明这两个点连接。3d

邻接表

用邻接表能够以下表示:

image.png

每一个点表明相应的 key ,而每一个 key 所包含的点,就是它们相连的点。

图的经常使用操做

  • 深度优先遍历:尽量深的搜索图的分支。

  • 广度优先遍历:先访问离根节点最近的节点。

下图

image.png

经过代码表示以下:

const graph = {
    0: [1, 2],
    1: [2],
    2: [0, 3],
    3: [3]
}
复制代码

深度优先遍历

  • 访问根节点
  • 对根节点的 挨个进行深度优先遍历。

经过以下代码进行深度优先遍历:

const visited = new Set()
const dfs = (node) => {
    console.log(node);
    visited.add(node)
    graph[node].forEach(c => {
        if (!visited.has(c)) {
            dfs(c)
        }
    })
}
dfs(2)
// 2 0 1 3

复制代码

广度优先遍历

  • 新建一个队列,把根节点入队。

  • 把队头出队并访问。

  • 把对头的没访问过的相邻节点入队。

  • 重复第二三步,直到队列为空。

经过以下代码进行广度优先遍历:

const visited = new Set()
const q = [2]
visited.add(2)
while (q.length) {
    const node = q.shift()
    console.log(node);
    graph[node].forEach(c => {
        if (!visited.has(c)) {
            q.push(c)
            visited.add(c)
        }
    })
}

// 2 0 3 1
复制代码

End~~~

相关文章
相关标签/搜索