我自学Fibonacci Heap时遇到这个问题,现在我知道这是一种有效的数据结构,可以在降低堆中元素的优先级时实现具有摊销O(1)
时间复杂度的优先级队列。
然而,根据CLRS教科书,优先级降低操作假定节点保持目标元素是预先知道的。
我很好奇如果不是最小节点,我怎么能有效地获得所需的节点。
一个简单的实现和分析产生O(n)
最坏情况时间复杂度来执行Fibonacci堆上的查找操作,与其他操作相比效率较低。
所以我的问题是在Fibonacci Heap中有一个有效的查找操作,还是有必要的?
答案 0 :(得分:6)
首先,这个结构被设计成一个有效的优先级队列,而不是搜索结构,因此查找操作是O(n)
。通常,您知道要更改的确切节点。让我们看一个例子 - Dijkstra的算法。
在每个步骤中,您将图形顶点推送到堆或更改其优先级,以便在顶点中保存指向堆节点的指针。这样做很棒!
所以基本上你会将指针存储到某个节点(你可以将它们存储在一个hashmap或AVL树中)。
答案 1 :(得分:0)
通过HashMap可以解决此问题。整数将保存斐波那契堆的键值,而相应的Node将为其值。因此,删除前无需搜索节点。 Fibonacci堆比高度平衡的二进制搜索树更有效,因为Fibonacci堆需要O(1)的插入时间和O(logN)的删除时间。我希望Fibonacci将取代Linux内核中的Redblack树,甚至取代数据库中的AVL树。