14-什么是图结构----JavaScript数据结构与算法学习

本文介绍了图的基本概念,包括顶点、边、有向图和无向图等,并通过实例展示了图如何模拟现实世界中的关系网络。接着探讨了图的两种常见表示方法:邻接矩阵和邻接表,以及它们各自的优缺点。最后,文章讨论了如何在JavaScript中封装图类,包括添加顶点和边的方法,并展示了测试代码的运行结果。
摘要由CSDN通过智能技术生成

该系列博客索引目录:数据结构与算法—前端JavaScript学习

在计算机程序设计中, 图也是一种非常常见的数据结构.

但是, 图论其实是一个非常大的话题, 我们通过本章的学习来认识一下关于图的一些内容以及图的抽象数据类型.

一. 图的概念

我们先来认识一下什么是图, 另外图中也有很多其他的概念, 比如: 顶点/边/有向图/无向图等等.

什么是图?
  • 图是一种与树有些相似的数据结构.

    • 实际上, 在数学的概念上, 树是图的一种.
    • 我们知道树可以用来模拟很多现实的数据结构, 比如: 家谱/公司组织架构等等
  • 那么图长什么样子呢? 或者什么样的数据使用图来模拟更合适呢?

    • 人与人之间的关系网.
      • 甚至科学家们在观察人与人之间的关系网时, 还发现了六度空间理论.

    img

    img

    • 互联网中的网络关系

      img

      img

    • 村庄间的关系网

      img

      img

    • 北京地铁图

      img

      img

  • 那么, 什么是图呢?

    • 我们会发现, 上面的结点(其实图中叫顶点Vertex)之间的关系, 是不能使用树来表示(几叉树都不可以)
    • 这个时候, 我们就可以使用图来模拟它们.
  • 图通常有什么特点呢?

    • 一组顶点:通常用 V (Vertex) 表示顶点的集合
    • 一组边:通常用 E (Edge) 表示边的集合
      • 边是顶点和顶点之间的连线
      • 边可以是有向的, 也可以是无向的.(比如A — B, 通常表示无向. A --> B, 通常表示有向)
图的术语
  • 关于术语

    • 我们在学习树的时候, 树有很多的其他术语, 了解这些术语有助于我们更深层次的理解图.
    • 我们也来学习一下图相关的术语.
    • 但是图的术语其实非常多, 如果你找一本专门讲图的各个方面的书籍, 会发现只是术语就可以占据一个章节.
    • 这里, 我们先介绍几个比较常见的术语, 某些术语后面用到的时候, 再了解. 没有用到的, 在自行深入学习的过程中, 可以通过查资料去了解.
  • 我们先来看一个抽象出来的图

    img

    img

  • 顶点:

    • 顶点刚才我们已经介绍过了, 表示图中的一个结点.
    • 比如地铁站中某个站/多个村庄中的某个村庄/互联网中的某台主机/人际关系中的人.
  • 边:

    • 边刚才我们也介绍过了, 表示顶点和顶点之间的连线.
    • 比如地铁站中两个站点之间的直接连线, 就是一个边.
    • 注意: 这里的边不要叫做路径, 路径有其他的概念, 待会儿我们会介绍到.
    • 下面的图中: 0 - 1有一条边, 1 - 2有一条边, 0 - 2没有边.
  • 相邻顶点

    • 由一条边连接在一起的顶点称为相邻顶点.
    • 比如0 - 1是相邻的, 0 - 3是相邻的. 0 - 2是不相邻的
  • 度:

    • 一个顶点的度是相邻顶点的数量.
    • 比如0顶点和其他两个顶点相连, 0顶点的度是2
    • 比如1顶点和其他四个顶点相连, 1顶点的度是4
  • 路径:

    • 路径是顶点v1, v2…, vn的一个连续序列, 比如上图中0 1 5 9就是一条路径.
    • 简单路径: 简单路径要求不包含重复的顶点. 比如 0 1 5 9是一条简单路径.
    • 回路: 第一个顶点和最后一个顶点相同的路径称为回路. 比如 0 1 5 6 3 0
  • 无向图:

    • 上面的图就是一张无向图, 因为所有的边都没有方向.
    • 比如 0 - 1之间有变, 那么说明这条边可以保证 0 -> 1, 也可以保证 1 -> 0.
  • 有向图:

    • 有向图表示的图中的边是有方向的.
    • 比如 0 -> 1, 不能保证一定可以 1 -> 0, 要根据方向来定.
  • 无权图和带权图

    • 无权图:
      • 我们上面的图就是一张无权图(边没有携带权重)
      • 我们上面的图中的边是没有任何意义的, 不能收 0 - 1的边, 比4 - 9的边更远或者用的时间更长.
    • 带权图:
      • 带权图表示边有一定的权重.
      • 这里的权重可以是任意你希望表示的数据: 比如距离或者花费的时间或者票价.
  • 我们来看一张有向和带权的图

    img

    img

现实建模
  • 图可用于对现实中很多系统建模
    • 对交通流量建模
      • 顶点可以表示街道的十字路口, 边可以表示街道.
      • 加权的边可以表示限速或者车道的数量或者街道的距离.
      • 建模人员可以用这个系统来判定最佳路线以及最可能堵车的街道.
    • 对飞机航线建模
      • 航空公司可以用图来为其飞行系统建模.
      • 将每个机场看成顶点, 将经过两个顶点的每条航线看作一条边.
      • 加权的边可以表示从一个机场到另一个机场的航班成本, 或两个机场间的距离.
      • 建模人员可以利用这个系统有效的判断从一个城市到另一个城市的最小航行成本.

二. 图的表示

怎么在程序中表示图呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值