斐波那契与快速行进方法中的二进制增强堆性能

时间:2014-04-08 12:34:08

标签: performance c++11 boost binary-heap fibonacci-heap

我现在这是一个多次问的问题。但是,我无法找到解决我特定问题的方法。

我在C ++ 11中实现了Fast Marching Method(非常类似于Dijkstra)和两种不同的变体:Fibonacci heap和Binary Heap。为此,我使用了Boost 1.55堆实现(Fibonacci和D_ary,D = 2)。

预计二进制堆在小网格中更快,斐波那契在大网格中更快。但是,二进制堆总是更快(并且存在"巨大的差异)。例如:

200x200 grid: 
 Binary: 16 ms
 Fibonacci: 24 ms

300x300 grid: 
 Binary: 38 ms
 Fibonacci: 50 ms

500x500 grid: 
 Binary: 113 ms
 Fibonacci: 148 ms

1000x1000 grid: 
 Binary: 504 ms
 Fibonacci: 642 ms

我在G ++ 4.8中使用-Ofast -fno-finite-math-only标志。

主要的一点是,我可以保证,几周前完全相同的实施返回了预期的结果。

请问有人对此有所了解吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

实际上我找到了答案,不需要代码:

有两个不同的问题: - 1:这取决于CPU。相同的Ubuntu发行版,相同的编译器,相同的代码在同一台计算机中提供不同的结果。 - 2:网格尺寸不够大。为了获得Dary版本的时间比斐波那契版本更长,我必须达到4000x4000。在其他计算的I测试中(均为64位),使用2000x2000网格就足够了,以获得预期的结果。

此外,它取决于计算距离图的原点,以及依赖于堆理论和快速行进方法的其他小点。