我感兴趣的是实现一个优先级队列来启用一个相对简单的高效Astar实现(我的意思是优先级队列很简单)。
似乎因为Skip List提供了一个简单的O(1)extract-Min操作和一个O(Log N)的插入操作,它可能与更难实现的具有O(log N)的Fibonacci Heap竞争)extract-Min和O(1)插入。我认为Skip-List对于具有稀疏节点的图更好,而Fibonacci堆对于具有更密集连接的节点的环境更好。
这可能会使斐波那契堆通常更好,但我认为Big-Oh明智的这些会是相似的吗?
答案 0 :(得分:6)
Fibonacci堆的存在理由是O(1)减少键操作,使得Dijkstra算法能够在时间O(| V | log | V | + | E |)中运行。但实际上,如果我需要一个有效的减少键操作,我会使用一个配对堆,因为Fibonacci堆有很糟糕的常量。如果你的键是小整数,那么使用垃圾箱可能更好。
答案 1 :(得分:4)
Fibonacci堆非常非常非常慢,除非非常非常非常大且密集的图(大约数亿个边缘)。众所周知,它们也很难正确实施。
另一方面,跳过列表是非常好的数据结构,并且实现起来相对简单。
但是我想知道为什么你不考虑使用简单的二进制堆。我认为基于二进制堆的优先级队列甚至比基于跳过列表的优先级队列更快。跳过列表主要用于利用并发性。