我必须解决这样的问题:我得到的数字N代表我拥有的分数。每个点都有两个坐标:X和Y。
我可以通过以下公式找到两点之间的距离:abs(x2-x1)+ abs(y2-y1),(x1,y1)是第一点的坐标,(x2,y2)是第二点的坐标,abs()
是绝对值。
我必须找到最小的生成树,这意味着我必须将所有点连接在一起,并且边的总和必须最小。 Prim的算法很好,但是太慢了。我读到我可以使用heap使其更快,但是我没有找到任何文章解释该操作。
任何人都可以向我解释Prim的算法如何与堆一起使用(请提供一些示例代码,但并非必须)?
可以有效地(在O(n log n)
时间内解决此问题,但这不是那么容易。仅将Prim的算法与堆配合使用是没有帮助的(实际上会使它变得更慢),因为它的时间复杂度为O(E log V)
,在这种情况下为O(n^2 * log n)
。
摘自Prim's algorithm上的Wikipedia文章:
虽然有人指出,带有堆的Prim's是O(E log V),在最坏的情况下为O(n ^ 2 log n),但我可以提供在最坏情况之外的情况下使堆更快的原因,因为尚未得到答复。