克鲁斯卡尔复杂性

我已经以这种方式实现了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]




colandking 回答:克鲁斯卡尔复杂性

对于V顶点和E边,我们具有时间复杂度BrowserWindow。边缘排序需要O(ElogE) or O(ElogV)时间。排序后,您将遍历所有边缘并应用find-union算法(分组技术)。查找和联合操作最多需要O(ELogE)时间。因此,总体复杂度为O(LogV)时间。 E的值最多为O(ELogE + ELogV),因此O(V^2)O(LogV)相同。因此,整体时间复杂度为O(LogE)O(ElogE)

本文链接:https://www.f2er.com/3058013.html

大家都在问