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

news/2024/11/28 22:33:51/

零.前言

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

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

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

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

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

一.图的基础

1.图的整体定义

2.图的相关定义 

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

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

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

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

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

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

(1). 邻接矩阵

邻接矩阵

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

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

a_{i,j}=\left\{\begin{matrix} 1,& v_{i}v_{j} connected & \\ 0,& v_{i}v_{j} unconnected & \end{matrix}\right.

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

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

对于有向图,那么就表示为a_{i,j}\neq a_{j,i} 。

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

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

邻接矩阵所需的空间为O(n^{^{2}})

无向图邻接矩阵的对称性

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

 

(2). 邻接表

邻接表

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

邻接表的所需的空间为O(n+e),其中n为顶点个数,e为顶点存储边(相邻节点)的个数。

(3). 链式前向星

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

优点为:

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

参考来源 Ref.

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

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

[3] leetcode yukiyama 图论算法从入门到放下 


http://www.ppmy.cn/news/296321.html

相关文章

新一批高考毕业生即将迈入大学校园,作为前辈想要对即将进入本专业学习的后辈们分享

提醒:在发布作品前,请把不需要的内容删掉。 基于高考毕业生都是本行业的“萌新”,请你以较为通俗的语言介绍当前IT行业的发展和前景,提出IT专业的重要性,并预告本文将介绍的一些小tips,帮助高考生选择适合…

【大数据学习番外篇之爬虫2】爬虫入门简单例子

目录 1. 图片爬取 2. 破解百度翻译 3. 豆瓣电影爬取 4. 肯德基餐厅位置爬取 1. 图片爬取 通过以下代码我们可以看到图片已经爬取进入虚拟机里面。 # -*- coding: utf-8 -*- import re import requests from urllib import error from bs4 import BeautifulSoup import os…

2021单机游戏排行榜前十名

提供十大PC单机游戏排行榜前十名下载,以及推荐各类型2021单机游戏排行榜前十名,单机游戏排行榜大全汇集了所有的十大pc单机游戏榜下载资源,不断更新… 生化危机8:村庄 Resident Evil Village 鬼谷八荒 人类 神佑释放 怪物猎人物语2&#xff1…

shell脚本删除不带错误日志的文件

#!/bin/bash#查找带.log结尾的文件 #datals -l ./*.log| awk {print $9} datals ./*.log|cut -f 1for i in $data;doerrcat $i|grep error if [ -z "$err" ];thenecho $i,"[ok-del]"#使用的时候取消下面代码前面的##rm -f $i elseecho $i,"[error]&qu…

如何做好功能测试,看这几点就够了

关于新人如何做好功能测试,以下是我个人的一些思考。 01、测试基础的重要性 作为一名测试新人,测试基础非常非常重要。这里说的基础,不仅仅是什么是软件测试、软件测试的目的,而是测试用例的设计能力。 因工作的原因&#xff0…

【Vue3重点概念总结和实践二】(watch / props / toRaw / makeRaw)

目录 1、watch全家桶 2、Prop验证 3、原始值API 4、Vue3 Vue-cli (1) 基础篇 5、Vue3 Vue-cli (2) 组件篇 1、watch全家桶 原题: vuejs-challenges/README.zh-CN.md at main webfansplz/vuejs-challenges GitHub 答案: watch() 默认是懒侦听的…

ai文案生成器:让写作更快、更准、更有趣

人工智能在各行各业中已经广泛应用,其中包括文案行业。而AI文案生成器是一种利用深度学习算法、自然语言处理技术等实现文本自动生成的工具。这种工具不仅能够帮助我们简化写作流程,还能够提高我们的写作效率、准确度和创造力。 快速生成大量文案 使用A…

上海市大数据技术与应用创新中心成立

大数据到底有什么用?如何对含有意义的数据进行专业化“加工”?如何盘活已有的大数据资源,挖掘其应用价值?今天上午,上海大数据技术与应用创新中心在上海交通大学成立。该中心由上海交通大学发起成立,联合复…