标签: fibonacci-heap

斐波那契堆的STL?

STL中的Fibonacci Heap在哪里?如果STL没有实现Fibonacci Heap在STL中使用现有算法和容器实现它的最佳实践是什么?

c++ stl data-structures fibonacci-heap

6
推荐指数
1
解决办法
9018
查看次数

Java上的Dijkstra:使用Fibonacci堆与PriorityQueue获得有趣的结果

我最近使用两种数据结构初步比较了Dijkstra算法的运行时间,基于Java的PriorityQueue(基于二进制堆,如果我没有弄错的话)和Fibonacci堆.我使用Java的currentTimeMillis()来进行计算.我最终得到的结果非常有趣.这是我的一个测试用例的输出:

Running Dijkstra's with 8 nodes and 27 links
- Execution time with binary heap: 1 miliseconds
- Execution time with Fibonacci heap: 4 miliseconds
Run Code Online (Sandbox Code Playgroud)

不可否认,我目前在数据集方面很缺乏,上面的图表是我最大的(我计划尽快制作).但这有什么意义吗?我一直认为Fibonacci堆比其他数据结构更快,因为与其他数据结构相比,它们的运行时间分摊了.我不确定这个3毫秒差异来自哪里.(我在Intel Core Ivy Bridge i7-3630M处理器上运行它,如果有帮助的话.)

注意:我偶然发现了这个可能解释这个问题的线程,尽管我仍然不清楚为什么Fibonacci堆版本需要更长的时间.根据该线程,可能是因为我的图形不够密集,因此reduce-Key操作的数量不足以使Fibonacci堆的性能真正发光.这是唯一合理的结论,还是我还缺少其他的东西?

java heap dijkstra data-structures fibonacci-heap

5
推荐指数
1
解决办法
867
查看次数

在boost中定义fibonacci堆的比较函数

我需要在我的项目中使用Fibonacci堆,我试图从boost库中使用它.但我无法弄清楚如何为任意数据类型设置用户定义的比较函数.我需要为struct node构造一个min heap,如下所示:

struct node
{
    int id;
    int weight;
    struct node* next;
                 /* dist is a global array of integers */
    bool operator > (struct node b)                                 //Boost generates a Max-heap. What I need is a min-heap.
            {return dist[id]   < dist[b.id] ? 1:0  ;}               //That's why "<" is used for "operator >".
    bool operator < (struct node b)
            {return dist[id]   > dist[b.id] ? 1:0 ;}
    bool operator >=(struct node b)
            {return dist[id]   <= dist[b.id] ? 1:0 ;}
    bool operator …
Run Code Online (Sandbox Code Playgroud)

c++ templates boost fibonacci-heap

5
推荐指数
1
解决办法
5010
查看次数

如何通过句柄从 boost::fibonacci_heap 获取元素?

我正在使用boost::fibonacci_heapBoost 1.53.0 中的类来维护可更新的优先级队列。

当我想要更新一个元素时,我需要将堆中的元素与我想要替换它的新元素进行比较。我只想用“较小”版本替换堆中的元素,因此我想在更新之前对它们进行比较。

当我插入元素时,我存储它们的句柄(boost::fibonacci_heap::handle_type)。我在文档fibonacci_heap中看到的所有采用句柄类型的函数仅提供某种写访问权限(update()decrease()increase()),并且不允许我在更新句柄之前检查句柄标识的元素。

fibonacci_heap有没有什么方法可以仅使用句柄来查看 a 中的元素?

c++ boost fibonacci-heap

3
推荐指数
1
解决办法
3097
查看次数

在Fibonacci Heap中查找操作

在教自己的Fibonacci Heap时我有这个问题,现在我知道这是一种有效的数据结构,可以O(1)在降低堆中元素的优先级时实现具有分摊时间复杂度的优先级队列.然而,根据CLRS教科书,优先级降低操作假定节点保持目标元素是预先知道的.我很好奇如果不是最小节点,我怎么能有效地获得所需的节点.一个简单的实现和分析会产生O(n)最坏情况下的时间复杂度,以便在Fibonacci堆上执行查找操作,与其他操作相比效率较低.所以我的问题是在Fibonacci Heap中有一个有效的查找操作,还是有必要的?

algorithm heapsort fibonacci-heap

2
推荐指数
1
解决办法
1210
查看次数

斐波那契堆上每个操作的最坏情况时间界限是多少?

斐波那契堆在摊销意义上是有效的,但在最坏的情况下它们的效率如何?具体来说,在 n 节点斐波那契堆上,这些操作中的每一个的最坏情况时间复杂度是多少?

  • 找到最小值
  • 删除分钟
  • 插入
  • 减键
  • 合并

algorithm big-o time-complexity data-structures fibonacci-heap

2
推荐指数
1
解决办法
3001
查看次数

标记Fibonacci堆中的某些节点的目的是什么?

图片来自维基百科的文章有蓝色标记的斐波那契堆的三个节点.在此数据结构中标记某些节点的目的是什么?

heap priority-queue data-structures fibonacci-heap

1
推荐指数
2
解决办法
2880
查看次数

如何提高 Boost Fibonacci Heap 性能

我正在实现 Fast Marching 算法,它是某种连续 Dijkstra 算法。正如我在许多论文中读到的那样,斐波那契堆是最适合此目的的堆。

然而,当使用 callgrind 分析我的代码时,我发现以下函数占用了 58% 的执行时间:

int popMinIdx () {
    const int idx = heap_.top()->getIndex();
    heap_.pop();
    return idx; 
}
Run Code Online (Sandbox Code Playgroud)

具体来说,它pop()占用了整个执行时间的 57.67%。

heap_定义如下:

boost::heap::fibonacci_heap<const FMCell *, boost::heap::compare<compare_cells>> heap_;
Run Code Online (Sandbox Code Playgroud)

花费“那么多”时间是否正常,或者我可以做些什么来提高性能?

抱歉,如果没有提供足够的信息。我尝试尽可能简短。如果需要,我会添加更多信息。

谢谢你!

c++ boost fibonacci-heap

1
推荐指数
1
解决办法
1821
查看次数

如何显示具有n个节点的Fibonacci堆可以具有高度n?

我想证明具有n个节点的Fibonacci堆可以具有高度n.

我用例子尝试了这个,但我不知道如何在一般情况下显示这个.

algorithm data-structures fibonacci-heap

0
推荐指数
1
解决办法
5369
查看次数