【问题标题】:How to build a Minimum Spanning Tree given a list of 200 000 nodes?给定 200 000 个节点的列表,如何构建最小生成树?
【发布时间】:2022-11-23 06:27:17
【问题描述】:

问题

我有一个大约 200000 个节点的列表,这些节点代表一个城市中的纬度/经度位置,我必须计算最小生成树。我知道我需要使用 Prim 算法,但首先我需要一个连通图。 (我们可以假设这些节点在欧几里德计划中)

要构建这个连通图,我首先想到要计算完整的图,但是 (205000*(205000-1)/2 大约有 190 亿条边,我无法处理。

选项

然后我遇到了 Delaunay 三角剖分:事实上,如果我构建这个“Delauney 图”,它包含一个子图,即最小生成树,根据 Wikipedia,我总共有大约 600000 条边[..]它最多有 3n-6 条边。所以它可能是最小生成树算法的一个很好的起点。

另一种选择是在某种程度上构建一个近似连通图,但这样我可能会错过影响我的最小生成树的重要边。

我的问题

在这种情况下,Delaunay 是可靠的解决方案吗?如果是这样,除了这个问题的 delaunay 三角剖分之外,还有其他可靠的解决方案吗?

更多信息:这个问题必须在 C 中解决。

【问题讨论】:

  • 边缘成本只是欧氏距离吗?
  • @EdwardPeters 我们可以假设是的。
  • 作为一项规则,虽然维基百科并不完全准确,但它通常比 StackOverflow 的答案更可靠 - 所以如果维基百科说它,你可能只是相信它而不是问我们。不过,我认为这并不容易实施。如果你有一个图书馆可以为你做这件事,那就太好了。
  • 拜托,德朗一个y。

标签: algorithm graph graph-theory minimum-spanning-tree


【解决方案1】:

点集的 Delaunay 三角剖分始终是这些点的 EMST 的超集。所以绝对“靠谱”。并推荐,因为它的大小与点数呈线性关系并且可以高效构建。

【讨论】:

  • 它在图书馆中是否普遍可用,如果没有,实施起来有多容易?我开始阅读维基百科文章并感到害怕。
  • @EdwardPeters:我最喜欢的版本是 Guibas & Stolfi 的版本,它是防弹的。不幸的是,他们的文章关注的是一个非常强大的数据结构,难以下咽。实际上,较轻的版本,即四边形,就足够了。应该存在一些现成的实现。
【解决方案2】:

这比“答案”更像是“想法”,但它不适合发表评论哦。

这里有一个很大的问题,即您可以访问哪些库以及您对自己作为编码员的信任程度。 (我假设你是 SO 的新手这一事实不应该被视为衡量你作为程序员的整体经验的标准 - 如果是,那么,RIP。)

如果我们假设您无权访问 Delaunay 并且不能自己实现它,那么预先假设图形的最小生成树算法不一定对您不利。你可以得到完整的图表概念上但不是实际上.例如,Kruskal 的算法假设您有一个包含图中所有边的排序列表;你的大部分边缘不会接近最小值,你不必比较所有 n^2 来找到最小值。

您可以通过为您提供缩减集的估计然后细化来快速找到最小边缘。例如,如果将图形划分为 100/100 网格,对于图形中的任何点 p,与 p 位于同一网格正方形中的点保证比距离三个或更多正方形的点更近。这提供了一组更小的点,您必须比较这些点才能安全地知道您找到了最接近的点。

这仍然不容易,但这可能比 Delaunay 更容易。

【讨论】:

  • 检查周围的八个方块可能是不够的。
  • “如果是,那就安息吧”。从我这里拿了一条腰带。但是您通过不假设相同的方式正确地做到了这一点
  • @YvesDaoust 不错,已更新。
  • @EdwardPeters 我可以访问 0 个库
  • 除了网格化,kD 树也可以作为加速设备。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2019-05-13
相关资源
最近更新 更多