图算法系列之无向图的数据结构
前言
从本篇开始我们将会一起来学习图相关的算法,图算有很多相当实用算法,比如:垃圾回收器的标记清除算法、地图上求路径的最短距离、拓扑排序等。在开始学习这些算法之前我们需要先来了解下图的基本定义,以及使用哪种数据结构来表示一张图,本篇我们先从无向图开始学习。
图的定义
图:是有一组顶点和一组能够将两个订单相连组成的。连接两个顶点的边没有方向,这种图称之为无向图。
图的术语
通过同一条边相连的两个顶点我们称这两个顶点相邻;
某个顶点的度数即表示连接这个顶点的边的总数;如上图:顶点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个顶点不含边的图 法系 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; priv无向ate LinkedListQueue[] adj; public Graph(int v) { this.v = v; this.adj = (LinkedListQueue[]) new LinkedListQueue[v]; for (int i = 0; i < v; i++) { &nbs图的p; this.adj[i] = new LinkedListQueue<>(); } } public int V() { return v; } public int E() { 数据 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&结构nbsp;v) { return this.adj[v]; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(v).append(" 个顶点,").append(e).append(" 条边 ");图算 for (int i = 0; i < v; i++) { sb.append(i).append(": "); for (int j : this.adj[i]) { &nbs法系p;sb.append(j).append(" "); } sb.append(" "); } return sb.toString(); } } 图的常用工具方法
基于图数据结构的实现,我们可以提供一些工具方法
计算顶点v的度数 顶点的度数就等于与之相连接顶点的个数
public static int degree(Graph列之 graph, int v) { int degree = 0; for (int w : graph.adj(v)) { degree++; } return degree; }
计算所有顶点的最大度数
public static int maxDegree(Graph graph) { int maxDegree 无向;= 0; for (int v = 0; v < graph.V(); v++) { int degree = degree(graph, v); if (maxDegree < degree) { maxDegree = degree; 图的 } } 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) { 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使用Logentries 日志驱动程序
Docker使用logentries日志驱动程序发送容器日志到 Logentries服务器。 用法 通过--log-opt根据需要指定多次来支持某些选项: logentries-token: 指定 l...[详细]
-
近年来,人工智能技术的发展为我们带来了许多便利,但同时也引发了关于其生成文本的准确性和可信度的讨论。特别是在学术界,AI 生成的文字常常被视为一种捷径,但这种捷径的潜在问题不容忽视。维基百科作为一个以...[详细]
-
微软Copilot迎来重磅更新:类ChatGPT记忆管理功能即将上线!
微软 Copilot 正加速迈向智能助手的新阶段,最新消息显示,该平台即将推出全面的记忆管理功能,体验方式将与 ChatGPT 日渐相似。此外,Copilot 还将支持与 Google Drive 的...[详细]
-
云梦级3月26日云梦级消息,汇顶科技26日晚间披露其2025年年度报告,年度营收同比增长8.24%至47.36亿元,净利润同比增长38.66%至8.37亿元,扣非后净利润同比增长31.05%至7.31...[详细]
-
TWS苹果称王,华为不见踪影,小米第二OPPO、vivo成看客
当年苹果在iPhone 7系列之上正式取消了标准的耳机孔,很多人开始吐槽甚至是安卓阵营很多品牌还以自己家的机型有标准的耳机孔为卖点。但是谁也没有想到苹果在下一盘很大的棋,随后没多久苹果就推出了真无线蓝...[详细]
-
OpenAI 与 Anthropic 进行首次合作测试,推动 AI 安全标准
在当前竞争激烈的人工智能(AI)领域,OpenAI 和 Anthropic 两家顶尖 AI 实验室决定进行一项前所未有的合作,联合对彼此的 AI 模型进行安全性测试。 这一举措旨在识别各自内部评估中的...[详细]
-
据外媒报道,一场静默却剧烈的“数据中心退潮”正在席卷美国——2026年第一季度,全美至少75个在建或规划中的数据中心项目被叫停或延期,总投资额高达1300亿美元(约合8816亿元人民币)。这一数字竟与...[详细]
-
云梦级11月17日云梦级消息,11月17日,联想控股发布公告,宣布核心人事调整,相关变动当日正式生效。 公告显示,李蓬因其个人职业选择,辞任公司执行董事及首席执行官职务,并不再担任公司环境、社...[详细]
-
前字节AI高管廖谦“下海”做乙方:半个月搞定数百万美元,要让营销代理像007一样接单
前字节跳动AI产品副总裁廖谦已于 8 月底离职创办“极致上下文”(Apex Context),定位“营销场景多模态Agent”。公司成立仅两周,便拿下硅谷HT Investment、百度风投等合计数百...[详细]
-
摘要:程书书 编辑:李信马 头图:豆包AI 今年1月,在成都街头落地的“所有女生的快乐市集”,成为大众关注的焦点。 这场由李佳琦直播间衍生出的线下IP活动,吸引了大量年轻消费者前往,其核心并非直接售卖...[详细]
- https://www.ushmm.org/search/results/?ID=8s0587Oi8UTv74zPPM4fuhwjNpe2hsEE&q=谷歌霸屏24小时见效-实现思路与效果衡量【tg:seogoogle987】,2ng
- https://xehay.vn/tim-kiem/=谷歌霸屏24小时见效-实现思路与效果衡量【tg:seogoogle987】,spt
- https://www.symatoys.com/search.html?ID=UyMD6aO58bPrJvQAB1I0N69KzJBZeNPC&keyword=谷歌霸屏24小时见效-实现思路与效果衡量【tg:seogoogle987】,hy4
- https://www.signingsavvy.com/sentence/谷歌霸屏24小时见效-实现思路与效果衡量【tg:seogoogle987】,GAK
- https://www.tarleton.edu/?s=谷歌霸屏24小时见效-实现思路与效果衡量【tg:seogoogle987】,WbK
- https://www.qidulp.com/search?query=谷歌霸屏24小时见效-实现思路与效果衡量【tg:seogoogle987】,uod
- https://www.southmeadows.co.uk/2019/07/?s=谷歌霸屏24小时见效-实现思路与效果衡量【tg:seogoogle987】,ILT
- https://www.hanbat.ac.kr/search/front/Search.jsp?qt=谷歌霸屏24小时见效-实现思路与效果衡量【tg:seogoogle987】J1f
- https://www.localfootdoc.com/?s=谷歌霸屏24小时见效-实现思路与效果衡量【tg:seogoogle987】,S0d
- https://www.universal-music.co.jp/search/?q=谷歌霸屏24小时见效-实现思路与效果衡量【tg:seogoogle987】,FHa

AI现在能教你画画了
微软人工智能主管:警惕 AI 或将 “要求权利”
亚马逊AGI实验室负责人为"反向收购"模式正名!称只有科技巨头才能承担通用人工智能研发重任
腾讯智能体大升级!全新开发平台助力企业轻松构建 AI 应用
B 站开源文本转语音模型IndexTTS-2.0,情感与时长可控
