博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构--图
阅读量:5809 次
发布时间:2019-06-18

本文共 860 字,大约阅读时间需要 2 分钟。

(如图1)图的顶点是多对多的关系,并且没有父子(层级)关系;

 

 

(如图2)最基本单元顶点,顶点之间的关系叫做边,边的长度叫做权重,涉及到权重的的图叫带权图。

(如图3)带方向的图叫有向图

 

(图4)无向图邻接矩阵

拥有n个顶点的图,它所包含的连接数量最多是n(n-1)个。因此,要表达各个顶点之间的关联关系,最清晰易懂的方式是使用二维数组(矩阵)。

因为是无向图所以A[V0][V1]和A[V1][V0]的值是一样的。

 

(如图5)有向图邻接矩阵,A[V0][V1]=1,A[V1][V0]=0因为单向不可达所以为0

 

邻接矩阵的缺点:用了太多的空间,如果一个图有1000个顶点,其中只有10个顶点之间有关联,却不得不建立一个1000X1000的二维数组,浪费空间。

 

(如图6)邻接表和逆邻接表(在邻接表中,图的每一个顶点都是一个链表的头节点,其后连接着该顶点能够直接达到的相邻顶点。)

 

很明显,这种邻接表的存储方式,占用的空间比邻接矩阵要小得多。

要想查出从顶点0能否到达顶点1,该怎么做呢?很简单,我们从顶点0开始,顺着链表的头节点向后遍历,看看后继的节点中是否存在顶点1。

要想查出顶点0能够到达的所有相邻节点,也很简单,从顶点0向后的所有链表节点,就是顶点0能到达的相邻节点。

那么,要想查出有哪些节点能一步到达顶点1,又该怎么做呢?这样就麻烦一些了,我们要遍历每一个顶点所在的链表,看看链表节点中是否包含节点1,最后发现顶点0和顶点3可以到达顶点1。

像这种逆向查找的麻烦,该如何解决呢?我们可以是用逆邻接表(图7)来解决。

逆邻接表每一个顶点作为链表的头节点,后继节点所存储的是能够直接达到该顶点的相邻顶点。

因此,我们可以根据实际需求,选择使用邻接表还是逆邻接表。

如图所示,十字链表的每一个顶点,都是两个链表的根节点,其中一个链表存储着该顶点能到达的相邻顶点,另一个链表存储着能到达该顶点的相邻节点。

 

转载于:https://www.cnblogs.com/abstracting/p/10599512.html

你可能感兴趣的文章
iOS sqlite3(数据库)
查看>>
粤出"飞龙",打造新制造广东样本
查看>>
编玩边学获数千万元A轮融资,投资方为君联资本
查看>>
蓝图(Blueprint)详解
查看>>
Spark之SQL解析(源码阅读十)
查看>>
Android图片添加水印图片并把图片保存到文件存储
查看>>
C#字符串的不变性
查看>>
前端路由简介以及vue-router实现原理
查看>>
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)...
查看>>
分享15款很实用的 Sass 和 Compass 工具
查看>>
AMD优势: 与众不同 选择丰富
查看>>
玩转高性能超猛防火墙nf-HiPAC
查看>>
简单按日期查询mysql某张表中的记录数
查看>>
自动化部署之jenkins发布PHP项目
查看>>
C/C++编程可用的Linux自带工具
查看>>
如何判断webview是不是滑到底部
查看>>
海贼王十大悲催人物
查看>>
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 搞定!
查看>>
热点热词新闻资讯API开放接口(永久免费开放)
查看>>
8.1_Linux习题和作业
查看>>