什么是图?

菜园前端
• 阅读 486

原文链接:https://note.noxussj.top/?source=helloworld


什么是图?

图是网络结构的抽象模型,是一组由边连接的节点。图可以表示任何二元关系,比如道路、航班等。在 JavaScript 中没有图,但是可以通过 Object 和 Array 来构建图。

常用操作

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

图的表示法

  • 邻接矩阵
  • 邻接表
  • 关联矩阵
  • ...

什么是图?

邻接矩阵

A B C D E
A 0 1 0 0 0
B 0 0 1 1 0
C 0 0 0 0 1
D 1 0 0 0 0
E 0 0 0 1 0

邻接表

并非仅限于通过对象/数组表示,其他形式也可以。

{
    "A": ["B"],
    "B": ["C", "D"],
    "C": ["E"],
    "D": ["A"],
    "E": ["D"]
}

图的深度/广度优先遍历

深度优先遍历

尽可能深的搜索图的分支。

口诀:

  1. 先访问根节点
  2. 对根节点的没访问过的相邻节点挨个进行深度优先遍历(因为相邻节点可能也会指向当前节点)
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

广度优先遍历

先访问离根节点最新的节点。

口诀:

  1. 新建一个队列,把根节点入队
  2. 把队头出队并访问
  3. 把队头的没有访问过的相邻节点入队
  4. 重复第 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
点赞
收藏
评论区
推荐文章
小天 小天
2年前
图数据库简介
概况图数据库(Graphdatabase,GDB)是一个使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。该系统的关键概念是图,它直接将存储中的数据项,与数据节点和节点间表示关系的边的集合相关联。图形数据库应用场景非常
菜园前端 菜园前端
1年前
前端切图仔玩转蓝湖设计图
原文链接:介绍前面已经介绍了如何使用git来管理我们的项目代码。这里顺带介绍一下,在企业实际开发中,基本上都是有设计图的存在,前端是按照设计图去开发实现,并不是自己凭空想象页面长什么样子。蓝湖就是目前比较主流的设计图网站。在设计图上面可以方便查看任何一个元
Wesley13 Wesley13
3年前
C语言数据结构之图的基本操作
本博文是是博主在学习数据结构图的这一章知识时做的一些总结,代码运行环境:visualstudio2017纯C语言,当然掌握了方法,你也可以试着用其它的语言来实现同样的功能。下面的程序主要实现了对有向图,有向网,无向图,无向网,无向图的深度优先遍历,广度优先遍历,有向无环图的拓扑排序功能等。主要代码实现如下:1pragmao
Stella981 Stella981
3年前
Python绘制拓扑图(无向图)、有向图、多重图。最短路径计算
前言:数学中,“图论”研究的是定点和边组成的图形。计算机中,“网络拓扑”是数学概念中“图”的一个子集。因此,计算机网络拓扑图也可以由节点(即顶点)和链路(即边)来进行定义和绘制。延伸:无向图两个节点之间只有一条线相连接,且没有方向。 有向图两个节点之间只有一条线相连接,且有方向。方向可以单向,也可以双向。 多重图两个节点之
Wesley13 Wesley13
3年前
DFS(深度优先遍历) 以及 BFS(广度优先遍历)
DFS(DeepFirstSearch)概念:    顾名思义,这种遍历方法是以深度为优先进行对图的搜索或者遍历,至于什么是以深度为优先条件,先看下面DFS的基本步骤:   (这是一个递归思想的DFS)    DFS:从当前节点开始,先标记当前节点,再寻找与当前节点相邻,且未标记过的节
Stella981 Stella981
3年前
PIL包中图像的mode参数
在这里的第一篇。这篇的是为了说明PIL库中图像的mode参数。我做的事情是:1.在本地找了jpg的图,convert为不同mode,将不同的图截取做了个脑图,有个直观的感觉吧。2.把不同mode的图通过np.array()转化为array,打印出array的shape,和array\0,0\的值,便于理解不同mode的
Wesley13 Wesley13
3年前
C语言实现数据结构的邻接矩阵
写在前面  图的存储结构有两种:一种是基于二维数组的邻接矩阵表示法。            另一种是基于链表的的邻接表表示法。  在邻接矩阵中,可以如下表示顶点和边连接关系:    !(https://oscimg.oschina.net/oscnet/fe38c2aff8c2a62f0d7ab71f55c1eb1cea
Stella981 Stella981
3年前
HugeGraph图数据库各类索引功能对比
HugeGraphDatabaseIndexHugeGraph图数据库的索引支持比较全面,图数据库的索引一般包括几方面:图索引/边索引(graphindex):主要用于加速获取顶点的关联边,一般使用邻接表或十字链表等方式,也可以使用hash索引。hugegraph使用的是邻接表。超级点索引(vertexcentricind
Stella981 Stella981
3年前
LeetCode 42. 接雨水
给定 _n_ 个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。!(https://oscimg.oschina.net/oscnet/b0cc4f8b9a129e159dc6141c019d5b3c043.png)上面是由数组\0,1,0,2,1,0,1,3,2,1,2,1\表示的高度图,在这种情况
菜园前端 菜园前端
1年前
什么是堆?
原文链接:什么是堆?堆是一种特殊的完全二叉树。完全二叉树的含义就是每层节点都完全填满,除了最后一层外只允许最右边缺少若干个节点。在JavaScript中通常用数组表示堆(按照广度优先遍历顺序)。最大堆最小堆特性所有的节点都大于等于它的子节点(最大堆)或者所