- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试实现 Prim 算法,为此我需要为优先级队列设置一个 decreaseKey 方法(以更新优先级队列中的键值)。我可以在 STL 优先级队列中实现它吗?
如果有帮助,这是我正在遵循的算法:
最佳答案
我不认为你可以在 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/
在大多数伪代码中,我通常会发现以下内容: DeleteMin (Return the element with the smallest key and delete it from the set.
我正在尝试实现 Prim 算法,为此我需要为优先级队列设置一个 decreaseKey 方法(以更新优先级队列中的键值)。我可以在 STL 优先级队列中实现它吗? 如果有帮助,这是我正在遵循的算法:
我现在按照原来的Paper实现斐波那契堆弗雷德曼和塔里安。如果我理解正确,根据论文,要执行节点 x 的 DecreseKey 操作,我们只需将其从其父节点中删除即可。但是,如果减小后的键仍然大于其父级
对于更新部分, for all neighbors w of u: if dist[w] > dist[u] + l(u,w) dist[w] = dist[u] + l(u,
我是一名优秀的程序员,十分优秀!