当前位置: 首页 > 知识库问答 >
问题:

用Prim算法比较二项式堆和二进制堆的MST结果。

齐铭
2023-03-14

Prim的算法在Python 2.7中实现了选择优先级队列的可能性。在二项式堆和二进制堆之间进行选择。数据结构是图形(.txt文件)。如果图是连通的,我需要在整个图上正常运行Prim。如果图不连通,则必须对图的最大连通分量执行Prim算法。一切都设置得很好,连接组件工作得很好(用小图测试),但当二项式堆是优先级队列时,MST结果不同于二进制堆结果(非连接图)。当使用连通图时,结果是相同的。Prim算法是否可能在相同的非连通图改变优先级队列上返回不同的结果?这里是Prim算法的“核心”。

while not pq.isEmpty():
        inode = pq.findMin()
        # here the update of the weight 
        nodes[inode] = None #Nodes marked in the MST
        pq.deleteMin()

        curr = g.adj[inode].getFirstRecord()
        while curr != None:
            #and here Decrease_Key and then a function that compare weight edges

二项式堆中的减少键是调用重建函数来精确重建树。在二进制中,这是使用moveUp函数完成的。二项式也在进行findMinIndex。因此,我的问题是:Prim的算法是否可能在相同的非连通图改变优先级队列上返回不同的结果?

共有1个答案

鲁博雅
2023-03-14

如果您有多个相同权重的边缘,则生成的 MST 可能会有所不同。Prim 的算法不指定选择相等边的顺序。因此,如果两个堆实现以不同的方式处理相等的元素,则很可能最终得到不同的结果。但是,如果两种解决方案中边缘的总长度不同,您应该开始担心。

 类似资料:
  • 我正在编写dijkstra算法的代码,对于我们应该找到与当前使用的节点之间距离最小的节点的部分,我使用了一个数组,并完全遍历它来找出节点。 这部分可以用二进制堆代替,我们可以在O(1)时间内计算出节点,但是我们也在进一步的迭代中更新节点的距离,我将如何合并那个堆? 对于数组,我所要做的就是转到(ith-1)索引并更新该节点的值,但在二进制堆中不能做同样的事情,我必须进行完整的搜索以确定节点的位置,

  • 我不熟悉堆,二进制堆,我试图理解为什么我们需要使用二进制堆实现优先级队列。我还了解到二进制堆的底层数据结构也是一个数组。 所以我的问题是,为什么我们不能使用一个数组,按降序(对于最大堆)或升序(对于最小堆)排序来表示优先级队列?这里我可能错了,但我认为,如果以这种方式实现,findMax、findMin、insert和delete等操作的时间复杂度将几乎保持不变。那么,我们是否可以不使用排序数组来

  • 我读了一些关于二进制堆/优先级队列的内容,并决定尝试自己实现一个。我不是最有经验的程序员,如果你们能看看我的堆类并告诉我它是否是一个好的实现,我将不胜感激。 我可以在这里改进什么?欢迎任何反馈。

  • 可以将数字1、2、3、4、5插入到二进制堆中,以使生成的二进制堆为最小堆的方式有多少? 答案 = 8 ========================================================================== 我的观点是——因为这是一个Min堆,所以最小值将是根。 这将是最小堆 - - 共-1*4C3*1*2*1=8。这种方法正确吗?

  • 我正在寻找一种将 作为映射值的方法,我发现了这个堆栈溢出问题。我尝试使用 类型来解决我的问题,但出现错误 二进制' 这是我的代码:

  • 堆属性说: 如果A是B的父节点,则节点A的键相对于节点B的键进行排序,并在堆中应用相同的排序。要么父节点的键总是大于或等于子节点的键,最高键在根节点(这种堆称为最大堆),要么父节点的键小于或等于子节点的键,最低键在根节点(最小堆)。 但是为什么在这个wiki中,二进制堆必须是一个完整的二叉树呢?在我的印象中,堆属性并不意味着这一点。