Java数据结构:图(图论知识中一些概念的简单概括)
5. 图
图由顶点和边组成。
G(V, E):其中,G表示图,V表示顶点的集合,E表示边的集合
5.1 基本概念
无向图和有向图
- 无向图:边没有方向,代表双方有关系/联系,可以理解为双箭头
- 有向图:边有方向,单项的关系/联系,可以理解为单箭头
无权图和有权图
- 无权图:只关注是否有关系,不关心关系的强度
- 有权图:关注是否有关系,也关心强度,如表示两个顶点的距离
顶点
可以理解为图中的结点,图至少由一个顶点
边
边表示顶点间的联系,有边相连的两点成为邻接关系
度
度为一个顶点包含多少条边
有向图中:
- 入度:指向该顶点的边的个数
- 出度:由该顶点出发的边的个数
图的存储
邻接矩阵存储
邻接矩阵将图用二维矩阵的方式存储。
矩阵中的非零点的索引代表第i个顶点和第j个顶点有关系,关系权值为该数值,既 A[i][j]=n
- 无权图中权值都为1
- 无向图的邻接矩阵是对称矩阵,因为当
A[i][j]=n
时,A[j][i]
必然也为n
优缺点:
- 优点:简单直接,容易获取两节点间的关系
- 缺点:占用空间较大
邻接表存储
邻接表是针对邻接矩阵占用空间大问题的改进。
邻接表使用链表存储某个顶点的所有相邻顶点,形成一个由该点(head)开始,存储了所有相邻顶点的单链表:
如:顶点vi**(head)** -> 邻接点vj1 -> 邻接点vj2 -> …
- 有向图的邻接表由边出发的点指向边指向的点
- 有向图的元素个数是是无向图的一半,与边的个数相同
图的搜索
广度优先搜索
使用队列搜索,初始将源顶点放入队列,把未访问的后继顶点放入队列,循环获取后继顶点,直至队列为空
深度优先搜索
从源顶点开始走到没有后继结点,回溯到上一顶点,继续搜索(最大路的思想)