图算法系列之无向图的数据结构
前言
从本篇开始我们将会一起来学习图相关的算法,图算有很多相当实用算法,比如:垃圾回收器的标记清除算法、地图上求路径的最短距离、拓扑排序等。在开始学习这些算法之前我们需要先来了解下图的基本定义,以及使用哪种数据结构来表示一张图,本篇我们先从无向图开始学习。
图的定义
图:是有一组顶点和一组能够将两个订单相连组成的。连接两个顶点的边没有方向,这种图称之为无向图。
图的术语
通过同一条边相连的两个顶点我们称这两个顶点相邻;
某个顶点的度数即表示连接这个顶点的边的总数;如上图:顶点1的度数是3
一条边连接了一个顶点与其自身,我们称为自环
连接同一对顶点的边称为平行边
术语还有很多,暂时这里只列出本篇我们需要使用到的术语,后面有在使用到其他的术语再做解释,太多也不太容易记得住
如何表示出图
图用什么数据结构来表示主要参考两个要求:
在开发图的相关算法时,图的表示的数据结构是基础,所以这种数据结构效率的高 在实际的过程中图的大小不确定,可能会很大,所以需要预留出足够的空间
考虑了这两个要求之后大佬们提出以下三个方法来供选择:
邻接矩阵 键入有v个顶点的图,我们可以使用v乘以图算v的矩阵来表示,如果顶点v与w相连,那么把v行w列设置为true,这样就可以表示两个顶点相连,但是这个方式有个问题,如果遇到图很大,会造成空间的浪费。不满足第二点。其次这种方式没办法表示平行边 边的数组 可以定义一个表示的边对象,包含两个int属性表示顶点,但是如果需要找到某个顶点的相连顶点有哪些,我们就需要遍历一遍全部的边。这种数据结构的效率较差 邻接表数组 定义一个数组,数组的大小为顶点的个数,数据下标表示顶点,数组中每个元素都是一个链表对象(LinkedListQueue),链表中存放的值就是与该顶点相连的顶点。(LinkedListQueue我们已经在之前的文章中实现,可以参考文章《https://juejin.cn/post/6926685994347397127》)
无向图的API定义 public class Graph { public Graph(int V); //创建含有v个顶点不含边的图 &法系nbsp; public int V(); //返回顶点的个数 public int E(); //返回图中边的总数 public void addEdge(int v, int w); //向图中添加一条边 v-W public Iterable adj(int v); //返回与v相邻的所有列之顶点 public String toString(); //使用字符串打印出图的关系 } 无向图API的实现
要实现上面定义的API,我们需要三个成员变量,v表示图中顶点的个数,e表示图总共边的数据,LinkedListQueue的数组用来存储顶点v的相邻节点;
构造函数会初始化空的邻接表数组
因为是无向图,所以addEdge方法在向图中添加边既要添加一条v->w的边,有需要添加一条w->v的边
public class Graph { private final int v; private int e; privat无向e LinkedListQueue[] adj; public Graph(int v) { this.v = v; this.adj = (LinkedListQueue[]) new LinkedListQueue[v]; for (int i = 0; i < v; i++) { &nb图的sp; this.adj[i] = new LinkedListQueue<>(); } } public int V() { return v; } public int E() { &n数据bsp;return e; } public void addEdge(int v, int w) { this.adj[v].enqueue(w); this.adj[w].enqueue(v); this.e++; } public Iterable adj(int v)&n结构bsp;{ return this.adj[v]; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(v).append(" 个顶点,").append(e).append(" 条边 "); &n图算bsp; for (int i = 0; i < v; i++) { sb.append(i).append(": "); for (int j : this.adj[i]) { sb.append(j).a法系ppend(" "); } sb.append(" "); } return sb.toString(); } } 图的常用工具方法
基于图数据结构的实现,我们可以提供一些工具方法
计算顶点v的度数 顶点的度数就等于与之相连接顶点的个数
public static int degree(Graph graph,&nbs列之p;int v) { int degree = 0; for (int w : graph.adj(v)) { degree++; } return degree; }
计算所有顶点的最大度数
public static int maxDegree(Graph graph) { int maxDegree = 0; &nb无向sp; for (int v = 0; v < graph.V(); v++) { int degree = degree(graph, v); if (maxDegree < degree) { maxDegree = degree; &nb图的sp;} } return maxDegree; }
计算所有顶点的平均度数 每条边都有两个顶点,所以图所有顶点的总度数是边的2倍
public static double avgDegree(Graph graph) { return 2.0 * graph.E() / graph.V(); }
计算图中的自环个数 对于顶点v,如果v同时也出现了在v的邻接表中,那么表示v存在一个自环;由于是无向图,每条边都被记录了两次(如果不好理解可以把图的toString打印出来就可以理解了)
public static int numberOfSelfLoops(Graph graph) 数据123; int count = 0; for (int v = 0; v < graph.V(); v++) { for (int w : graph.adj(v)) { if (v == w) { 结构 count++; } } } return count / 2; } 总结
本篇我们主要学习使用何种数据结构来表示一张图,以及基于这种数据结构实现了几个简单的工具方法,在下一篇我们将来学习图的第一个搜索算法 - 深度优先搜索
文中所有源码已放入到了github仓库:https://github.com/silently9527/JavaCore
-
云计算核心技术Docker教程:Docker 守护进程dockerd命令详解标签: Last War Whiteout Survival Royal Match MONOPOLY GO!用Python神经网络预测汽车保险支出Wan2.5-Preview 发布,实现多模态输入与电影级视频同步生成英伟达 CEO 黄仁勋推动全员使用 OpenAI Codex 编程工具“英特尔侵犯芯片专利被判赔22亿美元”上热搜 网友:国内该学习云计算开发:Python内置语句-exec 函数详解标签: 味多美 北京户籍歧视 烘焙品牌 蓝领招聘Canalys:第二季度小米手机销量超越苹果首次晋升全球第二云计算核心技术Docker教程:Docker Hub授予团队访问存储库的权限
- ·云基础架构-云原生DevOps的全面介绍
- ·沙漠化的原因是什么
- ·用“大白话”精准搜图,OpenAI的CLIP惊艳了所有人
- ·400亿的卡脖子赛道即将跑出一个IPO
- ·冠闵信息CEO颜伟志谈MSP发展趋势:利用各种工具持续交付高度自动化的服务
- ·标签: 寒武纪 人工智能芯片 财报 算力
- ·阿里云为100座垃圾焚烧炉装上工业大脑,全年可多发3.6亿度绿电
- ·谷歌和Facebook或明年1月在美面临新的反垄断诉讼
- ·璋锋瓕绗�簩瀛e害骞垮憡鎬绘敹鍏ュぇ澧�69%
- ·云安全日报220426:IBM企业级商业智能报表软件发现执行任意代码漏洞,需要尽快升级
- ·标签: 鸿蒙智行 新黄河 东莞门店 韩先生
- ·标签: 曹操出行 耀出行 吉利商旅 出行平台 Robotaxi
- ·亚马逊在英国遭遇新指责:所缴商业房产税远低于实体零售店
- ·桑葚是碱性还是酸性
- ·苹果和微软在AR、游戏等领域的竞争将再次升温
- ·标签: 诺比侃 AI+交通 廖峪 赛伦生物
- ·云计算趋势:编排自动化对RPA有哪些影响?
- ·云安全日报210527:Ubuntu配套LZ4解压缩软件发现执行任意代码漏洞,需要尽快升级
- ·IDC 报告:2024年中国 AI 公有云服务市场规模激增,阿里云蝉联中国市场第一
- ·亚马逊云计划在韩国追加 50 亿美元投资,推动 AI 数据中心建设
- ·云安全日报211207:思科220系列智能交换机链路层发现协议漏洞,需要尽快升级
- ·腾讯云开源 CubeSandbox:打造 AI Agent 的高性能“安全屋”
- ·联手阿里云 MongoDB中国市场营收3年增8倍 新阶段合作将关注这些
- ·标签: AI音乐
- ·Kimi 推出全新 Agent 模式 “OK Computer”,开启灰度测试
- ·标签: 赵明 荣耀 复旦管院 AI手机
- ·https://www.teamlab.art/ko/?submit=谷歌霸屏留痕【tg:seogoogle987】,b2x
- ·https://www.remit.co.jp/en/?s=谷歌霸屏留痕【tg:seogoogle987】,dsB
- ·https://www.voices.com/talents/search?keywords=谷歌霸屏留痕【tg:seogoogle987】,XQs
- ·https://www.resopal.de/catalogsearch/result/?action=SEARCH&q=谷歌霸屏留痕【tg:seogoogle987】,TuD
- ·https://www.swanagerailway.co.uk/search?q=谷歌霸屏留痕【tg:seogoogle987】,BQC
- ·https://www.nonsolocap.it/cap?action=SEARCH&k=谷歌霸屏留痕【tg:seogoogle987】,Euv
- ·https://www.therapeuticassociates.com/?cat=5&s=谷歌霸屏留痕【tg:seogoogle987】,e5b
- ·https://www.world-architects.com/en/search?term=谷歌霸屏留痕【tg:seogoogle987】,RfQ
- ·https://www.kaliastyle.com/catalogsearch/result/?q=GOOGLE谷歌霸屏留痕【tg:seogoogle987】,d4N
- ·https://www.xbiao.com/search/index?tpf&wd=谷歌霸屏留痕【tg:seogoogle987】,ggO
