数据结构——邻接矩阵

要将图的"顶点连接关系"转化为计算机可存储的形式,邻接矩阵是一种直观且高效的方法------它通过二维数组直接刻画顶点间的"是否相邻"或"权值大小"。下面从定义、不同图的邻接矩阵形态,以及操作特点展开讲解。

邻接矩阵

图由"顶点"和"边/弧"构成,邻接矩阵的核心是用二维数组存储顶点间的连接关系,让"顶点是否相邻""边的权值"等信息能被快速查询与修改。

1. 邻接矩阵的定义

对于含( n )个顶点的图( G = (V, E) ),邻接矩阵是一个( n \times n )的二维数组( A ),数组元素( A[i][j] )的取值规则由图的"无权/带权""有向/无向"决定:

  • 无权图:若顶点( v_i )与( v_j )间有边(无向图)或弧(有向图,( v_i )指向( v_j )),则( A[i][j] = 1 );否则( A[i][j] = 0 )(或用特殊值标记"无连接")。
  • 带权图(网):若顶点( v_i )与( v_j )间有边/弧,且权值为( w_{ij} ),则( A[i][j] = w_{ij} );否则( A[i][j] )用"无穷大(( \infty ))"或特殊标记表示"无连接且无权值"。
2. 不同类型图的邻接矩阵(结合图示分析)

图示左侧为有向图 ,右侧为带权无向图,可通过它们理解邻接矩阵的具体形态:

(1)有向图的邻接矩阵

左侧有向图的顶点为( 0,1,2,3,4,5 ),弧的方向(如( 0 )指向( 1 )、( 3 )指向( 0 )等)决定了邻接矩阵的"非对称性":

  • 若存在弧( <v_i, v_j> ),则( A[i][j] = 1 );若不存在(如无( 1 )指向( 0 )的弧),则( A[1][0] = 0 )。
  • 例如,顶点( 0 )的出弧指向( 1 )、( 3 )、( 4 ),因此邻接矩阵第( 0 )行的( A[0][1] )、( A[0][3] )、( A[0][4] )为( 1 ),其余列为( 0 );顶点( 3 )的出弧指向( 0 )、( 2 )、( 4 ),因此第( 3 )行的( A[3][0] )、( A[3][2] )、( A[3][4] )为( 1 )。
    有向图的邻接矩阵不具备对称性(因为弧是单向的,( <v_i, v_j> )和( <v_j, v_i> )是不同弧)。

(2)带权无向图的邻接矩阵

右侧带权无向图的顶点为( 0,1,2,3,4,5 ),边的无向性与权值决定了邻接矩阵的"对称性":

  • 若存在边( (v_i, v_j) ),则( A[i][j] = A[j][i] = )边的权值(如( 0 )与( 1 )的边权为( 1.1 ),故( A[0][1] = A[1][0] = 1.1 );( 4 )与( 5 )的边权为( 6.0 ),故( A[4][5] = A[5][4] = 6.0 ))。
  • 若两顶点无直接边(如( 1 )与( 2 )),则( A[1][2] = A[2][1] = \infty )(表示无连接)。
    无向图的邻接矩阵必然对称(因为边( (v_i, v_j) )与( (v_j, v_i) )是同一条边)。
3. 邻接矩阵的操作与特点

邻接矩阵的存储方式,让"顶点相邻判断""边权修改"等操作高效,但空间特性需根据图的"稀疏/稠密"灵活选择:

(1)操作的时间复杂度

  • 判断顶点( v_i )与( v_j )是否相邻:直接访问( A[i][j] ),时间复杂度( O(1) );
  • 遍历顶点( v_i )的所有邻接顶点:需遍历二维数组的第( i )行(或列),时间复杂度( O(n) )(( n )为顶点数);
  • 修改边的权值(或增删边):直接赋值( A[i][j] ),时间复杂度( O(1) )。

(2)空间复杂度

无论边数多少,邻接矩阵都需( n \times n )的存储空间,空间复杂度为( O(n^2) )。这意味着:

  • 稠密图(边数接近( n^2 )),邻接矩阵能高效利用空间,且操作便捷;
  • 稀疏图(边数远小于( n^2 )),邻接矩阵会浪费大量空间(多数元素为( 0 )或( \infty )),此时更适合后续的"邻接表"存储。

综上,邻接矩阵是一种"直观且查询高效"的图存储方式,能直接体现顶点间的连接关系,适合稠密图或对"顶点相邻判断"要求高的场景;但面对稀疏图时,空间利用率不足的问题会较为突出。

相关推荐
低音钢琴5 小时前
【人工智能系列:机器学习学习和进阶01】机器学习初学者指南:理解核心算法与应用
人工智能·算法·机器学习
傻童:CPU7 小时前
C语言需要掌握的基础知识点之前缀和
java·c语言·算法
深思慎考8 小时前
从合并两个链表到 K 个链表:分治思想的递进与堆优化
数据结构·链表·递归··队列·合并链表
又见野草8 小时前
软件设计师知识点总结:数据结构与算法(超级详细)
数据结构·算法·排序算法
GalaxyPokemon8 小时前
有一个服务器,用于提供HTTP服务,但是需要限制每个用户在任意的100秒内只能请求60次,怎么实现这个功能
算法
fl1768319 小时前
基于opencv+Mediapipe+CNN实现用手势识别控制对鼠标操控python源码+项目说明+设计文档
算法
K 旺仔小馒头9 小时前
优选算法:01 双指针巧解移动零问题
c++·算法·刷题
sali-tec9 小时前
C# 基于halcon的视觉工作流-章49-网面破损
开发语言·图像处理·算法·计算机视觉·c#
ysa0510309 小时前
Fenwick 树进行快速统计
算法