图论 (Java) 从入门到入土 /第一部分 图的基础-图的表示/

这篇具有很好参考价值的文章主要介绍了图论 (Java) 从入门到入土 /第一部分 图的基础-图的表示/。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

零.前言

        图,是一种比较复杂的数据结构。和树的一个节点只和上层一个节点相连不同,在图中,任意两个节点都可能相连,且可能具有方向性,并且节点的边具有权重,因此,图被用于描述各种复杂的数据对象,在自然科学、社会科学和人文科学等诸多领域有着非常广泛的应用。

        图论中一些经典的需要解决的问题有:图的遍历、图的连通性、图的判圈(环路检测)、最短路径、拓扑排序、最小生成树、网络流、二部图等。

        图论中一些经典的需要掌握的算法有:DFS、BFS、并查集、Dijkstra、Floyd、Prim、Kruskal等,需要了解并掌握,都是经常使用的算法。        

        本文章的系列分为三个大的部分,包括图论基础,图的算法以及图的典型题目,此大部分是图的基础,包括图的整体定义,图的相关定义和图的表示。  

        本文是有关于图的表示,主要是邻接表,邻接矩阵和链式前向星。

一.图的基础

1.图的整体定义

2.图的相关定义 

        以上部分可参考前文,前文连接:

图论 (Java) 从入门到入土 /第一部分 图的基础-图的定义/

3. 图的表示(图的存储) 

        作为一种结构复杂的数据结构,图的具体表示千差万别,我们需要以合适的、统一的、标准的方式来存储图。

        从图的定义来看,最为重要的信息莫过于图的边及其顶点的信息,那么无论采用什么方式,最重要的就是描述顶点与其边的联系。

        常用的存储图的方式主要包括邻接矩阵、邻接表和链式前向星,接下来主要介绍者三种方法,并且给出具体案例。

(1). 邻接矩阵

邻接矩阵

        对于图中的顶点,任意两个顶点之间是否有邻接关系,即是否有边直接相连。上案例,下左图为一张典型的无向(双向)无权图,那么它的邻接矩阵为右下图所示。

图论 (Java) 从入门到入土 /第一部分 图的基础-图的表示/

 对于矩阵中得元素,其值为:

比较通俗的语言就是,两边相连,那就是1,不是直接相连,那就是0。

那么,对于有权那就是把1替换成其他的值。

对于有向图,那么就表示为 。

也可以使用-1,或者无穷等来表示不存在或者不相连接,取决于具体的应用。 

显然,当图较稀疏时,大量空间将被浪费,利用邻接表存图效率更高。

邻接矩阵所需的空间为。

无向图邻接矩阵的对称性

        对于上方无向无权图的邻接矩阵,那么它具有对称性,即以y=-x对称,那么在存储的时候,可以只存储上三角或者下三角即可。

图论 (Java) 从入门到入土 /第一部分 图的基础-图的表示/

 

(2). 邻接表

邻接表

        邻接矩阵是图的顺序存储方法,邻接矩阵是图的顺序存储和链式存储相结合的方法,将每一个节点(顶点)的所有用边相连的节点链接起来,构成一个集合。

图论 (Java) 从入门到入土 /第一部分 图的基础-图的表示/

邻接表的所需的空间为图论 (Java) 从入门到入土 /第一部分 图的基础-图的表示/,其中n为顶点个数,e为顶点存储边(相邻节点)的个数。

(3). 链式前向星

        相比前两种存图法,链式向前星存图法是一种极具技巧性的存图方式,虽不太直观,但有不少优点,链式向前星的 本质也是邻接表 ,与邻接表法的显式邻接表 不同,链式向前星并不显式地存储与顶点对应的邻接表,而是将边编号,通过 边下标指针 来获取一个顶点的邻边信息Ref.[3]。

优点为:

        (1) 空间复杂度为 O(∣V∣+∣E∣) 。且相比利用泛型线性表的邻接表法,空间开销会更小,因为 List 的内部数组通常比实际大小更大。
        (2) 由于存粹以数组存图,因此处理速度也会比 List 更快。
        (3) 由于对边编号,在某些需要处理一条边的反向边的场景下 (例如最大流算法中),可以很方便地操作反向边 (具体看「小结」)。

参考来源 Ref.

[1] 数据结构与算法(JAVA语言版)Adam Drozdek

[2] 数据结构与算法(JAVA版)罗文劼,王苗,张小莉

[3] leetcode yukiyama 图论算法从入门到放下 文章来源地址https://www.toymoban.com/news/detail-481395.html

到了这里,关于图论 (Java) 从入门到入土 /第一部分 图的基础-图的表示/的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第一部分:Spark基础篇

    第一部分:Spark基础篇_奔跑者-辉的博客-CSDN博客 第二部分:Spark进阶篇_奔跑者-辉的博客-CSDN博客 第三部分:Spark调优篇_奔跑者-辉的博客-CSDN博客 第一部分:Flink基础篇_奔跑者-辉的博客-CSDN博客 (*建议收藏*) 实时数仓之 Kappa 架构与 Lambda 架构_奔跑者-辉的博客-CSDN博客(*建议收

    2024年02月05日
    浏览(34)
  • 第一部分-基础篇-第一章:PSTN与VOIP(下篇)

      学习资料来源《FreeSWITCH权威指南》-作者杜金房这本书。我是2022年6月毕业的,偶然的机会接触到FreeSWITCH,但是目前在南京从事java后端开发,FreeSWITCH纯属个人爱好,进行笔记整理。也一直希望有机会可以参与FreeSWITCH相关工作开发,如有需要,请联系我18956043585,先说声谢

    2024年02月06日
    浏览(41)
  • [软件测试] 第一部分 软件测试基础

    软件测试期末复习系列 课件知识点整合 : 软件测试基础 白盒测试 黑盒测试 PTA习题汇总 : 软件测试基础 白盒测试-逻辑覆盖测试 白盒测试-基本路径测试 白盒测试-静态测试 黑盒测试-等价类划分 黑盒测试-边界值测试 黑盒测试-场景法 软件危机 :软件危机是指落后的软件生

    2024年02月04日
    浏览(52)
  • STM32单片机入门学习笔记——定时器TIM第一部分

    笔记整理自B站UP主 江科大自化协 教程 《STM32入门教程-2023持续更新中》 ,所用单片机也为教程推荐单片机。 第一部分:定时器基本定时的功能,定时器每隔这个时间产生一个中断,来实现每隔一个固定时间执行一段程序的目的,比如要做一个时钟、秒表或者使用一些程序算

    2024年02月03日
    浏览(35)
  • 【干货】Android系统定制基础篇:第一部分(文件权限、增加信号强度、双路背光控制)

    当需要修改某文件或路径权限时,我们可以在init.rc开机启动某节点添加chmod命令进行修改。但是对于system分区,由于是ro权限,在init.rc使用chmod修改权限无效。需要在文件编译时,对权限进行修改。不同的Android版本改法一样,但是文件所在目录有差异,Android O主要修改文件是

    2024年02月09日
    浏览(37)
  • C/C++网络编程基础知识超详细讲解第一部分(系统性学习day11)

    目录 前言 一、网络的含义与构成 含义: 构成:  二、网络的体系结构 1OSI七层模型 2TCP/IP协议体系结构  3数据经过体系结构,怎么封装?  4端口号 5大小端序 6TCP/UDP传输层的协议  三、系统函数API学习框架(TCP)     服务器(优先):  客户端: 四、服务器和客户端代码实

    2024年02月08日
    浏览(40)
  • 模拟第一部分5

    1、如果想要在外部包中使用全局变量,则全局变量必须( ) 正确答案:A A、首字母必须大写 B、首字母必须小写 C、必须加上const D、必须加上var 答案解析:在函数体外声明的变量称之为全局变量。全局变量声明必须以 var 开头,如果想要在外部包中使用

    2024年02月08日
    浏览(36)
  • 第一部分:核心容器

    Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!         什么是IoC、IoC容器、bean、DI ? IoC:对象创建控制权由程序转移到IoC容器的控制反转思想。 IoC容器:创建管理对象的容器。 bean:IoC容器中被创建管理的对象。 DI:IoC容器中建立bean之间依赖关

    2024年02月13日
    浏览(38)
  • 6.播放音频(第一部分)

    这一章将对播放音频的具体内容做讲解。我的想法是按照tinyalsa中的例子作为讲解的范本,因为tinyalsa足够简单,很多时候都忽略了它的细节。趁着这个机会再整理一下tinyalsa的内容。我使用的tinyalsa从https://github.com/tinyalsa/tinyalsa下载,从examples/writei.c开始。 其中函数read_file从

    2023年04月08日
    浏览(29)
  • MySQL学习-第一部分

    MySQL数据库 MySQL是一个**关系型数据库管理系统****,**由瑞典[MySQL AB](https://baike.baidu.com/item/MySQL AB/2620844) 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包