algorithm - 将二项式堆和二叉堆的结果与 Prim 算法的 MST 进行比较。

标签 algorithm python-2.7 graph priority-queue minimum-spanning-tree

Prim 算法在 Python 2.7 中实现,可以选择优先级队列。在二项堆和二叉堆之间进行选择。数据结构是Graph(.txt文件)。如果连接了 Graph,我需要在整个 Graph 上正常运行 Prim。如果 Graph 未连接,则必须在 Graph 的 Max Connected Component 上完成 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

Decrease Key in Binomial Heap是调用rebuild函数精确重建树。在二进制中,这是使用 moveUp 函数完成的。 Binomial 也在执行 findMinIndex。所以我的问题又是:Prim 的算法是否可能在同一个非连接图更改优先级队列上返回不同的结果?

最佳答案

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

关于algorithm - 将二项式堆和二叉堆的结果与 Prim 算法的 MST 进行比较。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32245076/

相关文章:

c++ - Boost:如何删除顶点的所有出边

algorithm - 有向图的数据结构,允许快速删除节点?

algorithm - 分组集算法

algorithm - 旋转没有孙子的二叉树

javascript - 在树中查找元素并更改其父项的属性值

python - 在python中的点后将 float 舍入为2位数字

python - 创建 3D 圆锥体或圆盘并使用 matplotlib 不断更新其对称轴

python - 如何存储执行函数的结果并在以后重新使用?

Python 3.6 - Altair 图表打印对象,而不是图表

R:收集列表中与选定节点相邻的 igraph 节点