C++ Prim 算法2024年8月28日 | 阅读 22 分钟 Prim 算法是一种贪心算法,用于查找连通无向图的最小生成树 (MST)。图的最小生成树是边的子集,它形成一棵树并连接图中的所有顶点,同时最小化总边权重。Prim 算法通过添加权重最小的边来确保生成 MST。 历史Prim 算法由捷克数学家兼计算机科学家 Robert C. Prim 命名,是图论和计算机科学中的一个基本算法,用于查找连通无向图的最小生成树 (MST)。以下是 Prim 算法的简要历史。 最小生成树的起源最小生成树的概念可以追溯到 20 世纪初,应用于电气网络设计和运输。 Borůvka 算法 (1926)Prim 算法的最早前身由捷克数学家 Otakar Borůvka 于 1926 年开发。Borůvka 算法旨在找到最小生成树问题的近似解。 Prim 算法 (1957)1957 年,美国数学家 Robert C. Prim 独立地重新发现了并发表了后来以他命名的算法。他的工作受到高效电气网络构建的启发。 Edsger W. Dijkstra (1959)荷兰计算机科学家 Edsger W. Dijkstra 在计算机科学的背景下独立地重新发现了并推广了 Prim 算法。他在 1959 年对该算法的介绍有助于确立其在计算机科学和图论中的重要性。 正确性证明该算法的正确性由计算机科学家 R.C. Prim 和 Vojtěch Jarník 在 20 世纪 50 年代末和 60 年代初得到严格证明。 广泛采用Prim 算法因其简单性和效率而被计算机科学和图论广泛采用。它成为解决涉及最小生成树问题的基本算法。 在网络设计中的应用Prim 算法在网络设计、电路布局和运输规划等各个领域都有应用。 计算机科学教科书该算法被包含在计算机科学教科书和课程中,进一步促进了其声誉和理解。 后续发展多年来,人们提出了 Prim 算法的变体和改进,例如 Prim-Jarník 算法和各种数据结构以优化其性能。 Prim 算法仍然是图论和计算机科学中的基本工具,用于解决与网络设计和优化相关的问题。它以其简单性、效率以及在连通无向图中始终找到最小生成树的能力而闻名。 这里是 Prim 算法工作原理的深入解释输入
输出
算法步骤初始化
迭代过程
终止 一旦所有顶点都包含在 MST 中,您就已构建了最小生成树。 结果 MST 中的边集构成了给定图的最小生成树。 注意:Prim 算法通过在每一步贪婪地选择权重最小的边来确保 MST 以可能的最小总边权重构建。实施方法 1输出 Enter the number of vertices: 5 Enter the adjacency matrix of the graph: 0 2 0 1 0 2 0 3 2 5 0 3 0 0 4 1 2 0 0 6 0 5 4 6 0 Edges of Minimum Spanning Tree: Edge: 0 - 3 Weight: 1 Edge: 1 - 3 Weight: 2 Edge: 3 - 4 Weight: 6 Edge: 1 - 2 Weight: 3 解释 初始化
迭代过程 当还有未添加到 MST 的顶点时,算法将继续进行
终止 当所有顶点都包含在 MST 中时,算法终止。 结果 MST 由算法执行过程中选择的边组成。 Prim 算法的关键思想是逐个顶点地增长 MST,始终选择具有最小键值的顶点,并添加连接到它的最小权重的边。这确保了 MST 是通过添加最小权重的边来构建的,从而保证了最优解。 该算法维护三个主要数据结构
通过迭代地选择顶点和更新键值,Prim 算法可以高效且最优地构建给定图的最小生成树。 方法 2输出 Enter the number of vertices: 5 Enter the number of edges: 7 Enter the edges and their weights (from to weight): 0 1 2 0 3 1 1 2 3 1 3 2 1 4 5 2 4 4 3 4 6 Edges of Minimum Spanning Tree: Edge: 0 - 3 Weight: 1 Edge: 3 - 1 Weight: 2 Edge: 1 - 2 Weight: 3 Edge: 1 - 4 Weight: 5 解释 用于图和边的自定义类
用于将边添加到图的函数 (addEdge)
Prim 算法 (primMST 函数)
初始化
主算法循环
顶点包含 选定的顶点 u 被标记为包含在 MST 中,方法是将 inMST[u] 设置为 true。 更新相邻顶点
终止 算法一直进行,直到所有顶点都包含在 MST 中。 打印 MST 算法完成后,我们通过遍历父数组并显示所选的边及其权重来打印 MST 边。 主函数 在 main 函数中,我们获取用户输入的顶点数和边数,创建一个 Graph 对象,使用 addEdge 函数向其添加边,最后调用 primMST 来查找并打印 MST。 示例示例 1:邻接矩阵输出 Enter the number of vertices: 5 Enter the adjacency matrix: 0 2 0 1 0 2 0 3 2 5 0 3 0 0 4 1 2 0 0 6 0 5 4 6 0 Edge Weight 0 - 3 1 3 - 1 2 1 - 2 3 0 - 4 5 解释
选择一个起始顶点作为最小生成树 (MST) 的初始节点。 创建数据结构来跟踪 MST key[]:一个数组,用于存储将每个顶点连接到 MST 的最小边权重。将所有值初始化为无穷大,除了起始顶点(设置为 0)。 mstSet[]:一个数组或集合,用于跟踪哪些顶点已包含在 MST 中。将所有值初始化为 false。
重复以下步骤,直到所有顶点都包含在 MST 中 选择一个不在 MST 中且具有最小键值的顶点 u。 将 u 添加到 MST。 如果 u 的邻接顶点尚未在 MST 中,并且到 u 的边权重小于其当前键值,则更新其键值。
当所有顶点都包含在 MST 中时,算法终止。
最小生成树 (MST) 由算法执行过程中选择的边组成。这些边连接所有顶点,同时最小化总边权重。 示例 2:邻接列表输出 Enter the number of vertices: 5 Enter the number of edges: 7 Enter the edges (from to weight): 0 1 2 0 3 1 1 2 3 1 3 2 1 4 5 2 4 4 3 4 6 Edges of Minimum Spanning Tree: Edge: 0 - 3 Weight: 1 Edge: 1 - 3 Weight: 2 Edge: 3 - 4 Weight: 6 Edge: 1 - 2 Weight: 3 解释 步骤 1:初始化
步骤 2:增长 MST 重复以下步骤,直到所有顶点都包含在 MST 中
步骤 3:终止 当所有顶点都包含在 MST 中时,算法终止。 步骤 4:结果 最小生成树 (MST) 由算法执行过程中选择的边组成。这些边连接所有顶点,同时最小化总边权重。 应用
Prim 算法常用于网络设计问题,例如计算机网络、电力分配网络和电信网络的 T 设计。它有助于最小化成本,同时确保连通性。
在电子电路设计中,Prim 算法可用于优化电路板上组件的布局,从而最小化导线长度和连接。
Prim 算法可应用于城市规划,以优化交通路线,例如道路网络、地铁系统或公交路线,以减少行程距离和拥堵。
它用于生成迷宫,目标是创建连接的迷宫,并具有最少的墙壁或通道。
在图像处理和计算机视觉中,Prim 算法可用于将图像分割成具有最小边界成本的区域或组件。
Prim 算法可应用于聚类和层次聚类技术,根据数据点的相似性将它们分组,形成数据点的最小生成树。
Prim 算法是其他算法和数据结构(如 Borůvka 算法和 Kruskal 算法)的基础组件,它们也用于查找最小生成树。
在计算机网络中,Prim 算法可用于构建路由表或确定网络路由协议(如 OSPF(开放最短路径优先))中的最佳路径。
它可以优化网络中资源的分配,如电力、水或天然气,从而最小化连接长度和基础设施成本。
Prim 算法有助于在无线传感器网络中创建高效的通信拓扑,其中能源效率和连通性至关重要。
Prim 算法可应用于数据聚类和可视化任务,以识别数据集中的聚类或连通分量。
在游戏开发中,Prim 算法可用于生成游戏地图和布局,确保游戏环境是可连接和可导航的。
最小生成树在其他图算法中用作子问题,使 Prim 算法成为计算机科学中的基础概念。 优点Prim 算法具有多种优点,使其成为在各种应用中查找最小生成树 (MST) 的宝贵选择。
Prim 算法的结合了最优性、效率和易于实现的优点,使其成为解决从网络设计到图像处理再到游戏开发等各个领域各种问题的宝贵工具。 Prim 算法与其他算法的区别Prim 算法虽然是一种强大且广泛使用的最小生成树算法,但它也有可以解决相同问题的竞争者或替代方案。以下是用于查找最小生成树的 Prim 算法的一些主要竞争者或替代方案:
Kruskal 算法是另一种流行的查找最小生成树的算法。它通过按权重对所有边进行排序,然后以升序添加它们来工作,只要它们不产生环路。Kruskal 算法的时间复杂度为 O(E log E),其中 E 是边数,并且通常在图是稀疏的时首选。
Borůvka 算法是 Prim 算法和 Kruskal 算法的早期前身。它旨在通过反复将图收缩成更小的组件来找到最小生成树问题的近似解。
反向删除算法从图中的所有边开始,并反复删除权重最高的边,同时保持连通性。此过程一直持续到图成为生成树。对于稠密图,它的效率可能低于 Prim 算法或 Kruskal 算法。
该算法是 Borůvka 算法的修改版,旨在高效地找到近似 MST。它将图分成更小的连通分量,并为每个分量计算 MST,然后将这些 MST 连接起来形成最终的 MST。
Prim 算法的优化版本,它使用斐波那契堆来加速优先队列操作,从而实现更快的实现,时间复杂度为 O(E + V log V)。这种变体对于稠密图尤其有效。
随机算法,如随机 Prim 算法和随机 Kruskal 算法,在选择边的过程中引入了随机性。这些算法可以以高概率提供近似 MST,并且在不需要精确解的情况下很有用。
Borůvka 算法的改进,它使用斐波那契堆等高效数据结构来提高查找近似 MST 的时间复杂度。 在这些算法之间进行选择取决于因素,例如特定的问题、图的特性(例如密度)和性能考虑。虽然 Prim 算法以其在稠密图中的简单性和效率而闻名,但 Kruskal 算法通常用于稀疏图。研究人员和工程师根据问题的要求和可用计算资源选择最合适的算法。 缺点
尽管存在这些缺点,Prim 算法在各种实际场景中仍然是查找最小生成树的宝贵工具,尤其是在应用于稠密图和具有唯一边权重时,并且计算效率不是主要考虑因素。研究人员和工程师应仔细考虑其问题的具体要求和数据特征,以选择 MST 计算算法。 总结Prim 算法概述
Prim 算法的关键步骤 初始化
迭代过程 重复以下步骤,直到所有顶点都包含在 MST 中
终止 当所有顶点都包含在 MST 中时,算法终止。 结果 最小生成树 (MST) 由算法执行过程中选择的边组成。 图的表示 图可以使用邻接矩阵或邻接列表来表示,具体取决于具体的实现。 应用
总之,Prim 算法是在图中查找最小生成树的基本方法。它有效地构建了一棵连接所有顶点同时最小化总边权重的树。对于需要在优化和高效网络设计方面的各种领域的有价值的工具。 下一个主题C++ 显示数字因数的程序 |
我们请求您订阅我们的新闻通讯以获取最新更新。