Dijkstra 算法的一种标准实现使用堆来存储从起始节点 S 到所有未探索节点的距离。使用堆的理由是我们可以有效地弹出与它的最小距离,in O(log n)
。但是,为了保持算法的不变性,还需要更新堆中的一些距离。这涉及:
- 从堆中弹出非最小元素
- 计算更新的距离
- 将它们重新插入堆中
O(log n)
我知道如果知道堆中该元素的位置,则可以从堆中弹出非最小元素。但是,我不明白在 Dijkstra 算法的情况下如何知道这个位置。听起来二叉搜索树会更合适。
更一般地说,我的理解是,堆比平衡二叉搜索树做得更好的唯一一件事就是访问(不删除)最小元素。我的理解正确吗?