java数据结构图_Java数据结构和算法(一)图的基本介绍和存储形式

从今天开始,我跟大家一起仔细学习Java的数据结构和算法,首先是进行图结构的学习,因为图结构之前已经做过很多介绍,比较清晰。

图是描述现实世界各类复杂系统的一种普遍适用的模型,具有很强的表述能力。在现实世界中,很多应用将数据和数据之间的关系表示为一个图结构,如社交网络、车载网络、协作网络、电子商务网络、通信网络、生物蛋白质网络等。那么我们为什么要用图结构呢,原因有以下几点:

第一,线性表局限于一个直接前驱和一个直接后继的关系。第二,常用的树也同样只能有一个直接前驱,也就是我们所说的父结点。因此,当我们需要表示多对多的关系时,我们就用到了图。

图是一种数据结构,其中结点可以具有零个或多个相邻元素,两个结点之间的连接称为边。

4baa8408251b5684123e2e72c7692aaa.png

如图所示,A,B,C,D,E为五个结点,五个结点之间的连接称为边。

图的常用概念:结点(vertex,node)

边(edge)

路径:D到C的路径:(D-B-C和D-A-B-C)

无向图:结点之间的连接没有方向,如A-B,既可以是从A到B,也可以是从B到A

有向图:结点之间的连接有方向,如A-B,只能是从A到B,不可以是从B到A

带权图:边带权值的图称为带权图,也就是平时所说的网。

b8a67e4fd93cdca7cf2b59613dae6978.png

如图便为带权图,连接上的权值代表两地之间的距离。

图的表示方式:

重点来说一下图的表示方式,以便在以后的文章中使用,图的表示方式有两种,第一种是二维数组表示(邻接矩阵),第二种则是使用链表表示(邻接表)。

首先说一下第一种表示方式,邻接矩阵:

邻接矩阵时表示图形中结点之间相连关系的矩阵,对于n个结点的图而言,矩阵的行(row)和列(column)表示的是1到n个结点,举个例子:

ce21ae662e4d752fac4f8e5ade878fb9.png

左侧为一个图结构,右侧为改图结构转换而成的邻接矩阵的形式,上方和左侧的数字代表结点标号,如果结点之间有直接相连的关系,那么在邻接矩阵中,则将值置为1,若结点之间没有直接相连的关系,则将值置为0。

这种方式比较容易理解,不过这种邻接矩阵也存在缺点:

第一,邻接矩阵需要为每个结点都分配n个边的空间,因为图结构形成的矩阵必须为正方形,因此有很多表都是不存在的,会造成一定的空间上的损失,因此我们可以使用第二种表示方式来解决这个问题,邻接表。

邻接表的实现只关心存在的边,不关心不存在的边,因此没有空间上的损失和浪费,邻接表由数组加链表组成。

下面举个例子来看一下:

29e555ab2da88bebdf81116ef439d6d2.png

同样的图结构,如果使用邻接矩阵,我们会发现矩阵中有很多的零,这些都会造成空间上的浪费,而邻接表就没有这个问题,我们首先同样使用数组,如右图的左侧,0到5依然表示结点,而每个结点的邻居都采用链表的形式,5个结点就用5条链表,之后用数组将它们管理起来,用数组加链表来表示图结构:

3df940b92f6956bfc0da98b253303e31.png

图的基本介绍就到这里,接下来的文章会讲一些基于图结构的优先遍历的算法,谢谢大家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值