C++ 邻接表2025 年 3 月 17 日 | 23 分钟阅读 在本文中,您将学习 C++ 中的邻接表及其不同的方法和实现。 图的表示图是节点(顶点)和连接这些节点的边的集合。图可以分为各种类型,包括有向图和无向图、加权图和无权图、有环图和无环图等。为了对图执行操作或算法,需要以计算机可以有效操作的方式表示它们。 邻接表邻接表是一种流行的图表示方法,尤其是在图是稀疏的(包含的边少于最大可能边数)时。在邻接表中,图中的每个顶点都与一个其相邻顶点的列表相关联。这种表示方法有效地捕获了图的连通性。 邻接表是一种表示图中顶点之间连接的数据结构。它特别适用于稀疏图,其中边的数量远小于总可能边的数量。在邻接表中,图中的每个顶点都与一个其相邻顶点的列表相关联。 在 C++ 中,您可以使用各种数据结构实现邻接表,例如链表数组、向量的向量,或从顶点到其邻居的映射。 有向图有向图,也称为有向图,是一种图类型,其中边具有特定的方向,表示顶点之间的一对一关系。与无向图不同,无向图中的边表示顶点之间的连接而没有方向,有向图捕获元素之间的不对称关系或依赖性。 在有向图中,每条边都有一个起始顶点(尾部)和一个终止顶点(头部),由一个从尾部指向头部的箭头表示。这个箭头表示由边表示的关系或流的方向。方向的概念赋予有向图与无向图不同的特性和行为。 ![]() 方法 1:使用列表数组(或向量)让我们举一个例子来理解 C++ 中使用列表数组的邻接表。 输出 Vertex 0 has outgoing edges to: 1 3 Vertex 1 has outgoing edges to: 2 Vertex 2 has outgoing edges to: 3 4 Vertex 3 has outgoing edges to: 4 Vertex 4 has outgoing edges to: 说明
有向图可视化 0 --> 1 | | v v 3 --> 2 --> 4 说明
复杂度分析 时间复杂度 构造函数 (DirectedGraph):O(V),其中V是顶点数。 addEdge 函数:O(1),因为添加边涉及向顶点的邻接表追加。 printGraph 函数:O(V + E),其中V是顶点数,E是边数。这是因为它遍历每个顶点及其邻居。 主函数:O(E),其中E是边数,因为我们在主函数中添加边。 空间复杂度 构造函数 (DirectedGraph):O(V + E),因为它初始化adjacencyList向量以及其中每个向量的边。 addEdge 函数:每条边 O(1),因为它只将元素追加到向量。 printGraph 函数:O(V + E),由于邻接表及其向量的存储。 主函数:O(V + E) 涉及创建图对象和添加边。 其中 V是顶点数。 E是图中的边数。 方法 2:使用从顶点到邻居的映射让我们举一个例子来理解 C++ 中使用从顶点到邻居的映射的邻接表。 输出 Vertex 0 has outgoing edges to: 1 3 Vertex 1 has outgoing edges to: 2 Vertex 2 has outgoing edges to: 3 4 Vertex 3 has outgoing edges to: 4 以下是使用从顶点到邻居的映射的有向图的可视化表示 有向图可视化 顶点 0 --> [1] 顶点 1 --> [2] | | v v 顶点 3 --> [4] 顶点 2 --> [3, 4] | v 顶点 4 --> [] 说明
复杂度分析 时间复杂度 构造函数 (DirectedGraph):O(V),其中 V 是顶点数。 addEdge 函数:O(1),因为添加边涉及向顶点的邻接表追加。 printGraph 函数:O(V + E),其中V是顶点数,E是边数。这是因为它遍历每个顶点及其邻居。 主函数:O(E),其中 E 是边数,因为我们在主函数中添加边。 空间复杂度 构造函数 (DirectedGraph):O(V),因为它初始化adjacencyList map来存储顶点映射。 addEdge 函数:O(E),其中E是图中的边数,因为我们将所有边存储在邻接列表中。 printGraph 函数:O(V + E),由于邻接表及其向量的存储。 主函数:O(V + E) 涉及创建图对象和添加边。 其中 V是顶点数。 E是图中的边数。 无向图无向图是图论中的一个基本概念,它表示顶点(节点)和边(连接)的集合,其中边没有特定的方向。换句话说,顶点之间的关系是对称的——如果一条边将顶点 A连接到顶点 B,它也意味着从顶点 B到顶点 A有一条边。 ![]() 方法 1:使用列表数组(或向量)让我们举一个例子来理解 C++ 中使用列表数组的邻接表。 输出 0 is connected to: 1 3 Vertex 1 is connected to: 0 2 Vertex 2 is connected to: 1 3 4 Vertex 3 is connected to: 0 2 4 Vertex 4 is connected to: 2 3 每个数字代表一个顶点。 顶点之间的线表示边。 该图是无向的,因此边表示顶点之间的相互连接。 说明
复杂度分析 时间复杂度 构造函数 (UndirectedGraph):O(V),其中V是顶点数。 addEdge 函数:O(1),因为添加边涉及向两个顶点的邻接表追加。 printGraph 函数:O(V + E),其中 V 是顶点数,E是边数。这是因为它遍历每个顶点及其邻居。 主函数:O(E),其中E是边数,因为我们在主函数中添加边。 空间复杂度 构造函数 (UndirectedGraph):O(V),因为它调整邻接表向量的大小以匹配顶点数。 addEdge 函数:每条边 O(1),因为它只将元素追加到向量。 printGraph 函数:O(V + E),由于邻接表的存储。 主函数:O(V + E) 涉及创建图对象和添加边。 其中 V是顶点数。 E是图中的边数。 方法 2:使用双端队列数组我们使用双端队列数组(双端队列),其中每个双端队列包含整数来表示无向图。每个双端队列中的整数表示与当前顶点共享边的相邻顶点。这种表示适用于无向图,其中边没有方向,并且双向连接顶点。 输出 Vertex 0 is connected to: 1 3 Vertex 1 is connected to: 0 2 Vertex 2 is connected to: 1 3 4 Vertex 3 is connected to: 0 2 4 Vertex 4 is connected to: 2 3 说明
复杂度分析 时间复杂度
空间复杂度
方法 3:使用从顶点到邻居的映射这是一个如何使用从顶点到其邻居的映射在 C++ 中表示无向图的示例 输出 Vertex 0 is connected to: 1 3 Vertex 1 is connected to: 0 2 Vertex 2 is connected to: 1 3 4 Vertex 3 is connected to: 0 2 4 Vertex 4 is connected to: 2 3 说明
复杂度分析 时间复杂度
空间复杂度 邻接列表和集合的存储决定了空间复杂度:
加权图加权图是一种图,其中每条边都带有一个数值,称为“权重”。此权重表示与边连接的两个顶点之间的连接相关联的某些属性、成本、距离或值的定量度量。换句话说,分配给边的权重提供了有关它连接的顶点之间关系的附加信息。 在加权图中
例如,考虑一个场景,其中顶点表示城市,边表示它们之间的道路。在这种情况下,边上的权重可以表示城市之间的距离。同样,在金融网络中,权重表示账户之间的交易金额。加权图用途广泛,在交通、社交网络、网络路由和资源分配等各个领域都有应用。 ![]() 方法 1:使用列表数组(或向量)这是一个如何使用向量数组在 C++ 中表示加权图以存储邻接表的示例 输出 Vertex 0 is connected to: 1 (Weight: 2) 3 (Weight: 5) Vertex 1 is connected to: 2 (Weight: 3) Vertex 2 is connected to: 3 (Weight: 1) 4 (Weight: 4) Vertex 3 is connected to: 4 (Weight: 6) Vertex 4 is connected to: 说明
复杂度分析 时间复杂度
空间复杂度 空间复杂度由邻接表和表示边的对的存储决定
其中 V是顶点数。 E是图中的边数。 方法 2:使用从顶点到邻居的映射这是一个如何使用从顶点到其邻居的映射(其中每个邻居都与权重相关联)来表示加权图的示例 输出 Vertex 0 is connected to: 1 (Weight: 2) 3 (Weight: 5) Vertex 1 is connected to: 2 (Weight: 3) Vertex 2 is connected to: 3 (Weight: 1) 4 (Weight: 4) Vertex 3 is connected to: 4 (Weight: 6) 说明
在主函数中
复杂度分析 时间复杂度
空间复杂度 空间复杂度由邻接表和表示边的映射的存储决定
方法 3:使用双端队列数组我们使用包含整数对的双端队列数组(双端队列)来表示加权图。每对中的整数表示邻居顶点以及连接当前顶点与其邻居的边的权重。 输出 Vertex 0 is connected to: 1 (Weight: 2) 3 (Weight: 5) Vertex 1 is connected to: 0 (Weight: 2) 2 (Weight: 3) Vertex 2 is connected to: 1 (Weight: 3) 3 (Weight: 1) 4 (Weight: 4) Vertex 3 is connected to: 0 (Weight: 5) 2 (Weight: 1) 4 (Weight: 6) Vertex 4 is connected to: 2 (Weight: 4) 3 (Weight: 6) 说明
复杂度分析 时间复杂度
空间复杂度
邻接表应用邻接表由于其在各种应用中的效率,是一种常用的图表示方法。以下是邻接表的一些常见应用 社交网络:在Facebook、Twitter和LinkedIn等社交网络中,每个用户都可以表示为一个顶点,他们的连接(友谊、关注者等)可以使用邻接表表示。 推荐系统:许多推荐算法使用图结构推荐项目、产品或朋友。邻接表表示有助于建模用户或项目之间的关系和连接,从而实现更准确的推荐。 路由和网络:在计算机网络中,邻接表表示网络的拓扑。它们有助于找到最短路径、优化数据路由并有效管理网络资源。 游戏开发:在视频游戏开发中,邻接表可用于建模游戏世界,其中顶点表示位置或场景,边表示场景之间可能的转换。 数据挖掘和聚类:在聚类算法中,邻接表可以表示数据点之间的相似关系。每个顶点表示一个数据点,边表示相似性度量。 图算法:许多图算法,如深度优先搜索 (DFS)、广度优先搜索 (BFS)、Dijkstra 算法和Prim 算法,与邻接表表示一起工作效率很高。这种表示允许快速访问邻居及其相关信息。 好处内存效率:邻接表对于稀疏图来说内存效率高,因为它们只存储有关现有边的信息。这使得它们适用于边数少于最大可能边数的图。 遍历便捷性:使用邻接表遍历顶点的邻居非常简单。遍历顶点的邻接表所需时间仅等于邻居数,这使得某些图算法效率更高。 动态图:邻接表非常适合图结构不断演变的情况。添加或删除边或顶点可以高效完成,而不会影响整个数据结构。 具有可变连通性的应用程序:当顶点之间的连通性程度差异很大时,邻接表在内存使用方面比邻接矩阵更有效。 局限性空间复杂度(稠密图):对于稠密图(边很多),邻接表的空间复杂度可能高于邻接矩阵。在这种情况下,它们的内存效率会降低。 邻居查找时间:虽然邻接表对于遍历邻居来说效率很高,但查找两个顶点是否直接连接(边存在)需要O(度) 时间,其中度是平均邻居数。 边权重检索:在加权图中,邻接表需要额外的空间来存储边权重。由于需要搜索特定邻居,检索边权重可能需要额外时间。 边删除:从邻接表中删除边需要搜索并可能调整列表大小。此操作可能不如邻接矩阵中的边删除效率高。 图表示权衡:邻接表和矩阵之间的选择取决于特定的图特性和执行的操作类型。由于常数时间边存在检查,某些算法可能对矩阵更有效。 下一主题C++ 中的 Make_pair |
我们请求您订阅我们的新闻通讯以获取最新更新。