我已经以这种方式实现了kruskal算法。我的问题是,此实现的复杂性是什么?
要实现该算法,我首先将所有节点初始化为-1,即所有节点都被分离,甚至 他们没有团体。从这里开始,我考虑了可能发生的4种情况:
1:如果要分析的两个节点分别为-1和-1,则意味着它们是分开的,因此我们将必须将它们加入并创建一个新的 组,在开始时初始化的组变量中加1。
2:两个节点具有相同的组号。在这种情况下,我们无法加入他们,因为它们会形成一个循环。
3:在这种情况下,两个节点之一不具有组(-1),因此,分配了不具有组(A或B)的节点 另一个加入您组的节点的组。
4在这最后一种情况下,两个节点的组是不同的,只需更改两个组之一 另一组。示例:如果我们有一组节点4和另一个组6,则组4的所有节点将变为 属于第6组。您也可以更改其他组的那些。
import heapq
def kruskal(G):
for iniciarNode in G.nodes():
nodes[iniciarNode] = -1
for i in aristasLista:
heapq.heappush(aristasOrden,(G.edges[i]['weight'],i))
while (len(aristasOrden) != 0):
arestaSeguent = heapq.heappop(aristasOrden)[1]
nodeA = arestaSeguent[0]
nodeB = arestaSeguent[1]
if ((nodes[nodeA] == -1) and (nodes[nodeB] == -1)):
nodes[nodeA] = grup
nodes[nodeB] = grup
grup = grup + 1
treeG.add_edge(arestaSeguent[0],arestaSeguent[1],weight=arestaSeguent[0])
total_weight = total_weight + arestaSeguent[0]
elif (nodes[nodeA] == nodes[nodeB]): continue
elif ((nodes[nodeA] == -1) or (nodes[nodeB] == -1) ):
if (nodes[nodeA] == -1):
nodes[nodeA] = nodes[nodeB]
treeG.add_edge(arestaSeguent[0],weight=arestaSeguent[0])
total_weight = total_weight + arestaSeguent[0]
else:
nodes[nodeB] = nodes[nodeA]
treeG.add_edge(arestaSeguent[0],weight=arestaSeguent[0])
total_weight = total_weight + arestaSeguent[0]
treeG.add_edge(arestaSeguent[0],weight=arestaSeguent[0])
total_weight = total_weight + arestaSeguent[0]