【问题标题】:Fibonacci Vs. Binary Boost heap performance in the Fast Marching Method斐波那契VS。快速行进方法中的 Binary Boost 堆性能
【发布时间】:2014-04-08 12:34:07
【问题描述】:

我现在这是一个被问过很多次的问题。但是,我找不到针对我的具体问题的解决方案。

我已经在 C++11 和两个不同的变体中实现了快速行进方法(非常类似于 Dijkstra):斐波那契堆和二进制堆。为此,我使用了 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 标志。

重点是我可以保证几周前完全相同的实现返回了预期的结果。

有人可以帮我解释一下吗?

谢谢!

【问题讨论】:

  • 你想要任何特定的部分吗?代码有点长。
  • 好吧,我只是不确定是否有人可以回答您的问题,没有代码,但声称“几周前完全相同的实现返回了预期的结果”。你希望我们做什么?
  • 也许有人有类似的问题。也许 G++ 优化标志可以比斐波那契堆更优化 D_ary 堆......只是为了知道这样的事情。我知道这个问题有点奇怪,特别是你提到的说法。这就是我问的原因。
  • 好吧,谢谢你的反对。实际上我找到了答案,并且问题中给出的信息足以解决它,因为它与计算问题有关,而不是与代码有关。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-11-29
    • 2012-12-29
    • 2012-12-16
    • 1970-01-01
    • 2016-11-18
    • 2013-11-13
    • 2010-11-24
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多