今日踏入数据结构中 “图” 的奇妙世界,相较于之前学习的线性结构和树结构,图更为复杂且充满多样性,带来了全新的知识挑战与思维拓展。
概念上,图由顶点(vertex)和边(edge)组成,顶点代表图中的节点,边则用于连接这些顶点,体现它们之间的关系。根据边是否有方向,图可分为有向图和无向图。有向图的边带有箭头,表明顶点之间的单向连接关系,例如社交网络中用户的关注关系,A 关注 B 并不意味着 B 一定关注 A;无向图的边没有方向,意味着顶点间的连接是双向的,就像朋友关系,若 A 是 B 的朋友,那么 B 也是 A 的朋友。此外,图还存在带权图的概念,即边上带有权重值,可用于表示距离、成本等实际意义,如交通网络中道路的长度或通行费用。
学习图的操作时,遍历是基础且关键的环节。深度优先搜索(DFS)类似于树的深度优先遍历,从一个起始顶点出发,沿着一条路径尽可能深地探索下去,直到无法继续,再回溯到上一个有未探索分支的顶点,重复该过程。它常借助栈来实现,通过将访问过的顶点入栈,方便回溯操作,适用于查找连通分量、判断图是否连通等场景。广度优先搜索(BFS)则从起始顶点开始,逐层向外扩展访问,先访问起始顶点的所有邻接顶点,再依次访问这些邻接顶点的邻接顶点,借助队列来维护访问顺序,确保按层推进,常用于求最短路径(无权图情况下)、寻找连通块等问题。
在图的存储表示方面,常见有邻接矩阵和邻接表两种方式。邻接矩阵是一个二维数组,若顶点 i 和顶点 j 之间有边相连,则矩阵中对应位置的值为 1(或边的权重,对于带权图),否则为 0,这种方式简单直观,判断顶点间是否有边的时间复杂度为 O (1),但对于稀疏图(边较少的图)会浪费大量存储空间。邻接表则是为每个顶点建立一个链表,链表中存储该顶点的所有邻接顶点,这种存储方式节省空间,尤其适合稀疏图,但查询两顶点间是否有边时,最坏情况需要遍历链表,时间复杂度较高。
实践过程中遇到诸多难题。由于图的结构复杂,在实现遍历算法时,容易出现重复访问顶点或遗漏某些顶点的情况,需要精心设计标记数组来记录顶点的访问状态。在存储结构选择与应用上,若对图的特性判断失误,如稀疏图选用邻接矩阵,会导致空间浪费甚至程序效率低下。对于带权图的一些算法,如求最短路径的 Dijkstra 算法、Floyd 算法,理解算法思路和边界条件颇为吃力,调试过程复杂。
明日计划深入学习图的经典算法,像最小生成树算法(Prim 算法、Kruskal 算法),进一步掌握图在解决实际问题中的强大功能,通过大量实例练习巩固今日所学,提升运用图解决复杂问题的能力,力求在数据结构领域更上一层楼。