Javatpoint标志
Javatpoint标志

Kruskal算法在Python中的实现

加权无向图的最小生成树可以用克鲁斯卡方法.在所有可能的生成树中最小生成树是一种张成图上每个顶点并且总权值最低的方法。

该算法的工作原理是对图中所有的边按其权值的递增顺序排序,如果添加的边没有形成一个循环,则逐个将这些边添加到最小生成树中。直到所有的顶点都连接起来。

Kruskal算法的步骤

以下是Kruskal算法的步骤:

  1. 排序图中所有边的权重按递增顺序排列。
  2. 创建一个新的空集来表示最小生成树。
  3. 遍历排序过的边列表中的每条边。
  4. 检查向最小生成树添加边是否会生成一个循环。如果不是,就把这条边加入最小生成树。重复直到每个顶点都连接起来。

克鲁斯卡算法时间复杂度是O(E log E),在那里E的数量是多少?边缘在图中。这使得它成为寻找大型图的最小生成树的一个非常有效的算法。

Kruskal算法在python中的实现

逐步实现可以描述如下:

  1. 我们定义了一个带有三个实例变量的Graph类:顶点,它是图中所有顶点的列表;边缘,它是图中所有边的列表;和adjacency_list,它是表示图的邻接表的字典。
  2. 我们定义一个方法add_edge向图中添加一条边。这个方法有三个参数:uv,即这条边所连接的顶点;和重量,也就是边的权值。我们将这条边添加到边列表中同时也将它添加到adjacency_list
  3. 我们定义一个方法find_parent找到一个给定顶点的父结点在不相交集数据结构中。方法跟踪图的连接元素disjoint-set数据结构。每个顶点最初都是它自己的父顶点,我们使用find_parent方法查找属于的已连接组件的根目录
  4. 我们定义了一个方法union来合并不相交集数据结构中的两个连通的组件。union方法接受四个参数:,它是一个字典,表示每个顶点的父节点;排名,它是一个表示每个顶点秩的字典;xy,即我们想要合并其连通分量的顶点。我们使用find_parent方法找到属于x和y的连通分量的根,然后根据它们的秩合并这些分量。
  5. 我们定义a克鲁斯卡尔实现Kruskal算法的方法。该方法初始化一个空集minimum_spanning_tree将边存储在最小生成树中。它还为disjoint-set初始化父字典和秩字典。

代码:

输出:

{(1,3,1), (2,3,4), (0,3,3)}

输入图如下:

Kruskal算法在Python中的实现
  • Kruskal的算法是贪婪算法求一个连通的加权图的最小生成树。

这个集合表示输入图的最小生成树中的边。我们可以看到最小生成树的总权值是1 + 3 + 5 = 9

  • 该算法的工作原理是按权值对图中的边进行排序,然后从权值最小的边开始,将这些边依次添加到最小生成树中。
  • 当每条边被添加到最小生成树时,它被检查以确保它不会创建一个循环。如果这条边连接了两个已经在同一连接组件中的顶点,那么添加这条边将创建一个循环,并且这条边将被丢弃。
  • 只要图是连通的,且边权不同,Kruskal的方法总是能识别出图的最小生成树。
  • 时间复杂度Kruskal的算法是O(E log E)在哪里E的数量是多少?边缘在图中。这是因为该算法需要按权重对边进行排序,这需要O(E log E)时间,然后逐个处理每条边,这需要O (E)
  • 空间复杂度Kruskal的算法是O(v + e),在那里V的数量是多少?顶点在图中E的数量是多少?边缘.这是因为该算法需要存储图的边和邻接表,以及用于跟踪连接组件的不相交集数据结构。
  • Kruskal的算法可以使用优先级队列来更有效地按权重对边进行排序。它改进了算法时间复杂度O(E log V),在那里V是图形的顶点然而,空间复杂度仍然是O(v + e)
  • 在某些情况下,对于给定的图可能有多个最小生成树。Kruskal的算法会找到其中一棵树,但不一定能找到所有树。

Kruskal算法常用于网络设计问题例如设计通信网络或电网。该算法也可以在python中使用优先级队列来实现:

代码:

输出:

(2,3,1) (0,2,3) (0,1,2) (1,4,3)

这些是上面同一个图的最小生成树中的边。

在这个实现中,我们使用优先队列排序边的权重。我们将每条边添加到优先级队列中重量作为优先级,这样当我们从队列中检索边时,我们总是首先获得权值最小的边。之后,我们遍历优先级队列中的边,并将它们逐个添加到最小生成树中,只要它们不产生循环。我们用。来跟踪图的连通分量找到联盟的方法的disjoint-set数据结构,就像前面的实现一样。

要使用此实现,您需要创建一个图形对象,添加边使用add_edge方法,然后调用克鲁斯卡尔找到最小生成树的方法。


下一个话题 在Python中模拟外部API





Youtube 视频加入我们的Youtube频道:现在加入

反馈


帮助别人,请分享

脸谱网 推特 pinterest

学习最新教程


准备


热门的技术


b .技术/马华






Baidu
map