【发布时间】:2014-12-29 19:23:25
【问题描述】:
我必须解决一个类似这样的问题:
我得到一个数字 N,它代表我拥有的点数。每个点都有两个坐标:X 和 Y。
我可以通过以下公式找到两点之间的距离:
abs(x2-x1)+abs(y2-y1),
(x1,y1) 是第一个点的坐标,(x2,y2) 是第二个点的坐标,abs() 是绝对值。
我必须找到最小生成树,这意味着我必须将所有点与最小的边的总和连接起来。 Prim 的算法不错,但是太慢了。我读到我可以使用heap 使其更快,但我没有找到任何解释如何做到这一点的文章。
谁能解释一下 Prim 的算法如何与堆一起工作(一些示例代码会很好,但不是必须的),好吗?
【问题讨论】:
-
@kiss-o-matic 真的吗?
-
所有点对之间是否有边?如果是这样,堆就没用了。
-
是的,有。那为什么堆没用呢?
-
@ArifOzturk 因为时间复杂度是 O(E lg V)。如果E是O(V^2),那么就是O(V^2 lg V),比邻接矩阵的O(V^2)差。
-
如果你真的希望这个速度很快,你应该在 L1 Delaunay 三角剖分上运行 Prim。
标签: algorithm graph-theory minimum-spanning-tree