c++ - 在 STL 优先级队列 C++ 中实现 decreaseKey

标签 c++ stl priority-queue prims-algorithm decrease-key

我正在尝试实现 Prim 算法,为此我需要为优先级队列设置一个 decreaseKey 方法(以更新优先级队列中的键值)。我可以在 STL 优先级队列中实现它吗?

如果有帮助,这是我正在遵循的算法:

  • 对于图G中的每个顶点u
    • 将 u 的键设置为 INFINITY
    • 将你的父级设置为 NIL
  • 将源顶点的键设置为0
  • 使用上述键将图中所有顶点入队到优先级队列 Q
  • 当Q不为空时
    • 用Q中最低的键弹出顶点u
    • 对你的每个相邻顶点v做
      • 如果 (v 仍在 Q 中) 和 (key(u) + weight-function(u, v) < key(v)) then
        • 设置你为v的父级
        • 将 v 的键更新为相等的键(u) + 权重函数(u, v) //这部分给我带来了问题,因为我不知道如何在优先级队列中实现 decreaseKey<

最佳答案

我不认为你可以在 STL 容器中实现它。请记住,您始终可以基于 vector 编写自己的堆(优先级队列),但有一个解决方法:

保留你的距离数组,比方说d。在您的优先级队列中,您放置了成对的距离和该距离的顶点索引。当你需要从队列中删除一些值时,不要删除它,只需更新 d 数组中的值并将新对放入队列即可。

每次从队列中获取新值时,检查成对的距离是否真的那么好,就像在数组 d 中一样。如果不是忽略它。

时间是相同的 O(MlogM)。内存是 O(MlogM),其中 M 是边数。

还有另一种方法:使用RB-Tree,它可以在O(logN) 中插入和删除键并获得最小值。您可以在 std::set 容器中找到 RB-Tree 的 STL 实现。

但是,虽然时间复杂度相同,但 RB-Tree 运行速度较慢且隐藏常量较大,因此它可能会稍微慢一些,appx。慢了5倍。当然要看数据。

关于c++ - 在 STL 优先级队列 C++ 中实现 decreaseKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14412793/

相关文章:

c++ - 如何在Qt中的QTableview中定位我的按钮的行号

c++ - 将可变参数模板列表中的整数值分配给静态常量 std::array 成员

c++ cout和char-pointers,我缺少的指针

c++ - map operator[] 的返回值(和 "at"方法)

data-structures - 当我们有二叉搜索树时,为什么还需要二叉堆?

java - 空指针运行时异常

c++ - 有这种极端情况吗?

c++ - g++:用闭包类型初始化的 std::function 总是使用堆分配?

c++ - 在find_if中使用正向和反向迭代器有什么区别

c++ - 如何使用priority_queue的push()?