在 Cormen 等人的《算法简介》一书中解释 Dijkstra 算法的部分中。等,在分析算法的复杂性时,他们说
如果图足够稀疏......我们可以通过使用二进制最小堆实现最小优先级队列来改进算法
所以我想知道,这样的声明有什么必要?将堆用于优先级队列不是更明智吗?
在 Cormen 等人的《算法简介》一书中解释 Dijkstra 算法的部分中。等,在分析算法的复杂性时,他们说
如果图足够稀疏......我们可以通过使用二进制最小堆实现最小优先级队列来改进算法
所以我想知道,这样的声明有什么必要?将堆用于优先级队列不是更明智吗?
见https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
它说:
- Dijkstra 的原始算法不使用最小优先级队列并且在 O(|V|^2) 中运行。
所以书里的说法只是说可以优化原算法。
- 基于由斐波那契堆实现并在 O(|E|+|V|log|V|) 中运行(其中 |E| 是边数)的最小优先级队列的实现是由于(Fredman & Tarjan 1984 )。
二叉堆只是堆的一种。还有其他类型更适合特定场景。