该系列博客索引目录:数据结构与算法—前端JavaScript学习
在计算机程序设计中, 图也是一种非常常见的数据结构.
但是, 图论其实是一个非常大的话题, 我们通过本章的学习来认识一下关于图的一些内容以及图的抽象数据类型.
一. 图的概念
我们先来认识一下什么是图, 另外图中也有很多其他的概念, 比如: 顶点/边/有向图/无向图等等.
什么是图?
-
图是一种与树有些相似的数据结构.
- 实际上, 在数学的概念上, 树是图的一种.
- 我们知道树可以用来模拟很多现实的数据结构, 比如: 家谱/公司组织架构等等
-
那么图长什么样子呢? 或者什么样的数据使用图来模拟更合适呢?
- 人与人之间的关系网.
- 甚至科学家们在观察人与人之间的关系网时, 还发现了六度空间理论.
img
-
互联网中的网络关系
img
-
村庄间的关系网
img
-
北京地铁图
img
- 人与人之间的关系网.
-
那么, 什么是图呢?
- 我们会发现, 上面的结点(其实图中叫顶点Vertex)之间的关系, 是不能使用树来表示(几叉树都不可以)
- 这个时候, 我们就可以使用图来模拟它们.
-
图通常有什么特点呢?
- 一组顶点:通常用 V (Vertex) 表示顶点的集合
- 一组边:通常用 E (Edge) 表示边的集合
- 边是顶点和顶点之间的连线
- 边可以是有向的, 也可以是无向的.(比如A — B, 通常表示无向. A --> B, 通常表示有向)
图的术语
-
关于术语
- 我们在学习树的时候, 树有很多的其他术语, 了解这些术语有助于我们更深层次的理解图.
- 我们也来学习一下图相关的术语.
- 但是图的术语其实非常多, 如果你找一本专门讲图的各个方面的书籍, 会发现只是术语就可以占据一个章节.
- 这里, 我们先介绍几个比较常见的术语, 某些术语后面用到的时候, 再了解. 没有用到的, 在自行深入学习的过程中, 可以通过查资料去了解.
-
我们先来看一个抽象出来的图
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
现实建模
- 图可用于对现实中很多系统建模
- 对交通流量建模
- 顶点可以表示街道的十字路口, 边可以表示街道.
- 加权的边可以表示限速或者车道的数量或者街道的距离.
- 建模人员可以用这个系统来判定最佳路线以及最可能堵车的街道.
- 对飞机航线建模
- 航空公司可以用图来为其飞行系统建模.
- 将每个机场看成顶点, 将经过两个顶点的每条航线看作一条边.
- 加权的边可以表示从一个机场到另一个机场的航班成本, 或两个机场间的距离.
- 建模人员可以利用这个系统有效的判断从一个城市到另一个城市的最小航行成本.
- 对交通流量建模
二. 图的表示
怎么在程序中表示图呢?