当前位置: 首页 > news >正文

图的领接矩阵表示法

详细解释**图的邻接矩阵(Adjacency Matrix)**这一核心数据结构。

邻接矩阵定义

邻接矩阵是表示图(Graph)的一种经典方式,使用一个二维数组来存储图中顶点之间的连接关系。

对于一个具有nnn个顶点的图,邻接矩阵是一个n×nn \times nn×n的方阵AAA,其中:

A[i][j]={1 或 wij如果顶点 i 和 j 之间有边0如果顶点 i 和 j 之间没有边A[i][j] = \begin{cases} 1 \text{ 或 } w_{ij} & \text{如果顶点 } i \text{ 和 } j \text{ 之间有边} \\ 0 & \text{如果顶点 } i \text{ 和 } j \text{ 之间没有边} \end{cases}A[i][j]={1wij0如果顶点ij之间有边如果顶点ij之间没有边


无向图的邻接矩阵

特点:矩阵关于主对角线对称(A[i][j]=A[j][i]A[i][j] = A[j][i]A[i][j]=A[j][i]

0 —— 1 | | 2 —— 3

邻接矩阵表示

0123
00110
11001
21001
30110

有向图的邻接矩阵

特点:矩阵不一定对称,A[i][j]=1A[i][j]=1A[i][j]=1表示从iiijjj有边

0 → 1 ↑ ↙ 2 ← 3

邻接矩阵表示

0123
00100
10010
21000
30010

带权图的邻接矩阵

对于带权图,矩阵元素存储边的权重,无边时用∞\infty或 0 表示:

012
005∞\infty
1503
2∞\infty30

Java 实现示例

publicclassAdjacencyMatrixGraph{privateint[][]matrix;// 邻接矩阵privateintnumVertices;// 顶点数privatebooleanisDirected;// 是否有向privatebooleanisWeighted;// 是否带权// 初始化publicAdjacencyMatrixGraph(intn,booleandirected,booleanweighted){this.numVertices=n;this.isDirected=directed;this.isWeighted=weighted;this.matrix=newint[n][n];// 带权图初始化:对角线为0,其他为无穷大if(weighted){for(inti=0;i<n;i++){for(intj=0;j<n;j++){matrix[i][j]=(i==j)?0:Integer.MAX_VALUE;}}}}// 添加边publicvoidaddEdge(intfrom,intto){addEdge(from,to,1);// 无权图默认权重为1}publicvoidaddEdge(intfrom,intto,intweight){matrix[from][to]=weight;if(!isDirected){matrix[to][from]=weight;// 无向图对称}}// 获取邻居节点publicList<Integer>getNeighbors(intvertex){List<Integer>neighbors=newArrayList<>();for(inti=0;i<numVertices;i++){if(matrix[vertex][i]!=0&&matrix[vertex][i]!=Integer.MAX_VALUE){neighbors.add(i);}}returnneighbors;}// 打印矩阵publicvoidprintMatrix(){for(inti=0;i<numVertices;i++){for(intj=0;j<numVertices;j++){System.out.printf("%4d ",matrix[i][j]==Integer.MAX_VALUE?-1:matrix[i][j]);}System.out.println();}}}

复杂度分析

操作时间复杂度空间复杂度
添加边O(1)O(1)O(1)O(n2)O(n^2)O(n2)
删除边O(1)O(1)O(1)O(n2)O(n^2)O(n2)
查询边O(1)O(1)O(1)O(n2)O(n^2)O(n2)
获取所有邻居O(n)O(n)O(n)O(n2)O(n^2)O(n2)

适用场景

✅ 适合使用❌ 不适合
稠密图(边数接近n2n^2n2稀疏图(边数远小于n2n^2n2
需要频繁查询边是否存在顶点数很大(内存消耗大)
实现简单的图算法(如Floyd-Warshall)需要频繁增删顶点

与邻接表对比

特性邻接矩阵邻接表
空间O(V2)O(V^2)O(V2)O(V+E)O(V+E)O(V+E)
查边O(1)O(1)O(1)O(V)O(V)O(V)O(degree)O(\text{degree})O(degree)
遍历邻居O(V)O(V)O(V)O(degree)O(\text{degree})O(degree)
适合图类型稠密图稀疏图

如果你对分子算法(Molecular Algorithm)中的图结构表示感兴趣,邻接矩阵也常用于表示分子拓扑结构,比如原子间的键连关系。

http://www.jsqmd.com/news/497560/

相关文章:

  • 软件文档管理中的权限控制机制
  • Android Developer的这段代码的注释(kotlin的类和对象
  • 如何评估大数据产品的用户满意度?
  • Day03——java基础语法
  • 多格式电子书阅读软件KOReader,你的阅读终极伴侣!
  • 低代码-无代码平台背后的开源技术
  • 免费降AI率的上限在哪?从技术角度分析效果天花板
  • 一行代码都不写?用AI工具10分钟生成一个Chrome插件
  • 小而强大的文件系统,大大提高微控制器的稳定性
  • 技术支持管理化技术服务台与事件管理
  • STM32:UART串口通信
  • 第八天(3.18)
  • 湖南特产酱板鸭项目有哪些
  • Rust Trait 对象动态分派原理
  • 身份认证方案
  • 去中心化应用(DApp)开发全流程
  • 计算机视觉算法优化
  • 【GUI-Agent】阶跃星辰 GUI-MCP 解读---(2)---决策层
  • 图像处理优化技巧
  • 如何设计一个安全的 RESTful API?
  • Python的__init_subclass__类方法在框架开发中的钩子机制与扩展点设计
  • 318记录
  • OpenClaw 目录结构详细介绍
  • 消息队列选型指南2024
  • JavaScript性能优化实战拿墩
  • SSH隧道实战:内网穿透与端口转发
  • Spring Boot 异步任务超时控制机制
  • Go Channel 死锁问题与调试
  • 旅游社交平台:用户生成内容与经验分享
  • TypeScript学习笔记 - P4