数据结构(二)图

36 篇文章 0 订阅

就是由 顶点的有穷非空集合 和 顶点之间的边 组成的集合。通常表示为:G(V,E),其中,G表示一个图,V表示顶点的集合,E表示边的集合。

1 线性结构、树形结构、图三者的区别:

  • 线性数据结构的元素满足唯一的线性关系,每个元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继。
  • 树形数据结构的元素之间有着明显的层次关系。
  • 图形结构的元素之间的关系是任意的。

2 图的基本概念

图的应用非常广泛,比如在社交软件上的好友关系,就可以用图来表示。

2.1 顶点

图中的数据元素,我们称之为顶点,图至少有一个顶点(非空有穷集合),对应到好友关系图,每一个用户就代表一个顶点。

2.2 边

顶点之间的关系用表示。对应到好友关系图,两个用户是好友的话,那两者之间就存在一条边。

2.3 度

表示一个顶点包含多少条边。在有向图中,还分为出度入度出度表示从该顶点出去的边的条数,入度表示进入该顶点的边的条数。对应到好友关系图,度就代表了某个人的好友数量。

2.4 无向图和有向图

无向图:边表示的是顶点之间的关系,有的关系是双向的,就不用去关注方向,即不用带箭头的边表示,这样的图就是无向图。比如:同学关系,A是B的同学,那么B也肯定是A的同学,那么在表示A和B的关系时,就不用关注方向。

有向图:边表示的是顶点之间的关系,有的关系是有方向的,我们就需要用带箭头的边表示其关系,这样的图就是有向图。比如:父子关系,师生关系,微博的关注关系,A是B的爸爸,但B肯定不是A的爸爸,A关注B,B不一定关注A。

2.5 无权图和带权图

无权图:对于一个关系,如果我们只关心关系的有无,而不关心关系有多强,那么就恶意用 无权图 来表示二者之间的关系。

带权图:对于一个关系,如果我们既关心关系的有无,也关心关系的强度,那么就用带权图来表示(比如:描述地图上两个城市的关系,需要用到距离)。带权图中的每一条边都有一个数值表示权值,代表关系的强度。

3 图的存储

  • 邻接矩阵存储
  • 邻接表存储

3.1 邻接矩阵存储

邻接矩阵存储,是指将图以二维矩阵的方式 来进行存储,是一种较为直观的存储方式。

如果第 个顶点和第 个顶点之间有关系,且关系权值为 n,则 A[i][j] = n 。

无向图中的存储:我们只关心关系的有无,所以当顶点 和顶点 j 有关系时,A[i][j] = 1;当顶点 i 和顶点 j 没有关系时,A[i][j] = 0。如下图所示:

值得注意的是:无向图的邻接矩阵是一个对称矩阵,因为在无向图中,顶点i和顶点j有关系,则顶点j和顶点i必有关系。

邻接矩阵存储的方式优点:是简单直接(直接使用一个二维数组即可),并且在获取两个顶点之间的关系的时候也非常高效(直接获取指定位置的数组元素的值即可)。

邻接矩阵存储的方式缺点:就是比较浪费空间。

3.2 邻接表存储

介于邻接矩阵比较浪费内存空间,于是诞生了图的另外一种存储方式:邻接表存储

邻接链表是用一个链表来存储某个顶点的所有后继相邻顶点。对于图中每个顶点Vi,把所有邻接于Vi的顶点Vj链成一个单链表,这个单链表称为顶点Vi的 邻接表。如下图所示:

 大家可以数一数邻接表中所存储的元素的个数以及图中边的条数,你会发现:

  • 在无向图中,邻接表元素个数等于边的条数的 2 倍,如上图所示的无向图中,边的条数为7,邻接表存储的元素个数为14。
  • 在有向图中,邻接表元素个数等于边的条数,如右图所示的有向图中,边的条数为8,邻接表存储的元素个数为8。

4 图的搜索

  • 广度优先搜索
  • 深度优先搜索

4.1 广度优先搜索

广度优先搜索,就像水面上的波纹一样,一层一层的向外扩展,如下图所示:

广度优先搜索的具体实现方式用到了之前所学过的线性数据结构——队列 。具体过程如下图所示:

4.2 深度优先搜索

深度优先搜索就是“一条路走到黑”,从源顶点开始,一直走到没有后继节点,才回溯到上一顶点,然后继续“一条路走到黑”,如下图所示:

和广度优先搜索类似,深度优先搜索的具体实现用到了另一种线性数据结构—— 。具体过程如下图所示: 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值