我现在这是一个多次问的问题。但是,我无法找到解决我特定问题的方法。
我在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
标志。
主要的一点是,我可以保证,几周前完全相同的实施返回了预期的结果。
请问有人对此有所了解吗?
谢谢!
答案 0 :(得分:1)
实际上我找到了答案,不需要代码:
有两个不同的问题: - 1:这取决于CPU。相同的Ubuntu发行版,相同的编译器,相同的代码在同一台计算机中提供不同的结果。 - 2:网格尺寸不够大。为了获得Dary版本的时间比斐波那契版本更长,我必须达到4000x4000。在其他计算的I测试中(均为64位),使用2000x2000网格就足够了,以获得预期的结果。
此外,它取决于计算距离图的原点,以及依赖于堆理论和快速行进方法的其他小点。