11.10
图的定义非常简洁——由顶点和边组成。但正是这种简洁,赋予了它极强的表达能力。我们生活中无处不在的“关系”都可以用图来抽象:社交网络中的好友关系、交通网络中的站点线路、知识图谱中的概念关联等等。这让我深刻体会到,数据结构的价值就在于其抽象能力。图不再仅仅关注数据本身(顶点),更核心的是关注数据之间的联系(边),尤其是边可以带有方向、权重,这让模型的描述能力产生了质的飞跃。从“数据集合”到“关系网络”,这是图带给我的第一个,也是最重要的思维转变。
图的存储是学习中的第一个难点,主要接触了邻接矩阵和邻接表。邻接矩阵非常直观,一个二维数组就清晰地展现了顶点间的连接关系。它的优势在于判断任意两点是否相邻非常快,是O(1)的时间复杂度。但它的缺点也同样明显,就是太“费”空间了,特别是对于边数远小于顶点数平方的稀疏图来说,矩阵里大部分都是0,造成了巨大的浪费。
邻接表则显得“精明”很多,它只存储实际存在的边,为每个顶点维护一个链表,记录它的所有邻居。这在空间效率上优势巨大,但也付出了代价:要判断两个顶点是否相连,需要遍历其中一个顶点的链表,效率不如矩阵。
图的遍历是后续几乎所有算法的基础。深度优先搜索和广度优先搜索,这两种策略体现了两种截然不同的“世界观”。
DFS像是一个执着于“一条道走到黑”的探险家。它选择一个分支,不断地深入,直到尽头再回溯。这种策略非常适合探索所有可能的分支路径,比如寻找一条路径的通达性、检测环路等。它带着一种递归的、回溯的美感。
而BFS则像是一位稳扎稳打的“波浪”推进者。它从起点开始,先访问所有直接邻居,再访问邻居的邻居,一层层地向外扩散。这保证了它找到的路径一定是“最短”的(在边权为1的情况下)。这非常适合求解最短路径、最小步数等问题。
浙公网安备 33010602011771号