跟踪一组点中最大距离的最佳方法?

时间:2011-07-14 23:24:47

标签: c# .net algorithm math data-structures

假设我有一个2维点的集合,以及确定它们之间距离的方法。经常修改此集合,添加其他点并删除现有点。在任何给定的时间,我需要知道点之间的最大和最小距离,即最远的两个点之间的距离,以及最靠近在一起的两个点之间的距离。有没有一种数据结构或算法能够很好地完成这项任务?我希望每次点数改变时都不必重新计算整个距离。

3 个答案:

答案 0 :(得分:8)

理论上,你可以通过存储你拥有的convex hull点来有效地做到这一点。

每当您添加新点时,请测试它是否位于此polytope的内部。如果是,则保留最大距离。如果没有,那么它可能已经改变了。

同样,如果从内部删除一个点,则保留最大距离(直径),因此不进行任何更改。但是,如果删除边界点,则必须重新计算凸包。

如果您是2维,那么当您从边界添加或删除时,多边形的最多两侧都会受到影响。这些应该易于计算,具体取决于您存储信息的方式(例如,一系列线段)。

编码这可能有点痛苦,但最简单的方法是在边界上标记点,然后有一个函数来测试点是否位于标记点的凸包内。

答案 1 :(得分:5)

而不是使用凸包(如另一个答案所示)你可以使用Delaunay三角剖分吗?

最小距离:

要计算从节点到集合中任何其他节点的最小距离,您只需要检查节点的直接邻居,即通过三角测量中的边缘连接到节点的邻居。

因此,如果插入了新节点,请更新三角测量,找到新节点的邻居以及更新中“涉及”的任何其他节点,计算此本地“更新”集中所有节点的距离并检查是否找到新的最低要求。同样,如果删除现有节点,则再次更新三角测量并重新计算“涉及”的所有节点的距离。

有一类所谓的“增量”算法可用于构建Delaunay三角网,只需要在插入/删除新节点时对整体三角测量进行局部修改,所以这是我建议的方法类型经常插入/删除。

最大距离:

正如凸壳样式答案所示,如果在现有三角剖分之外添加了新节点或者删除了现有边界节点,则只需要重新计算边界节点之间的距离。

希望这有帮助。

答案 2 :(得分:3)

我不确定这是最好的,但这是我现在能想到的最好的。

将最大值与该距离处的一对点保存在一起。 (最大值不一定是唯一的。)

同样适用于分钟。

  • 添加点时,计算新点与所有其他点的距离,如果新点参与更好的最大值或最小值,则将保存的最大值和最小值与其对应的端点对集合替换,或者如果它与当前最佳匹配,则更新端点集。

  • 删除某个点时,请检查是否清除了整个记住的最小或最大设定值。如果没有,你什么都不做。但如果是的话,我认为你需要重新计算一切。

对于最大化计算,我相信PengOne的建议可以告诉你是否可以完全跳过计算。