Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 选择靠得很近的点的算法_Algorithm_Computational Geometry_Spatial - Fatal编程技术网

Algorithm 选择靠得很近的点的算法

Algorithm 选择靠得很近的点的算法,algorithm,computational-geometry,spatial,Algorithm,Computational Geometry,Spatial,我有一个n个点集的集合,其中每个点集最多包含m个点 我想从每个点集中选择一个点,这样产生的点选择就尽可能靠近。其中,贴近度有一个合理的定义,如距离选定点集质心的平方距离之和 例如,输入集合可以是: Point Set A: [(2, 1), (1, 2), (6, 5)] Point Set B: [(1, 1), (7, 3)] Point Set C: [(3, 7), (5, 3)] 我想选择三个点,每个点集中一个,这些点最接近。在本例中,左下角的三个点距离最近,但它们不包括来自C的点。

我有一个n个点集的集合,其中每个点集最多包含m个点

我想从每个点集中选择一个点,这样产生的点选择就尽可能靠近。其中,贴近度有一个合理的定义,如距离选定点集质心的平方距离之和

例如,输入集合可以是:

Point Set A: [(2, 1), (1, 2), (6, 5)]
Point Set B: [(1, 1), (7, 3)]
Point Set C: [(3, 7), (5, 3)]
我想选择三个点,每个点集中一个,这些点最接近。在本例中,左下角的三个点距离最近,但它们不包括来自C的点。此处的解决方案是右侧的点:6、5、7、3和5、3。它们聚集在其质心6,3处⅔.

蛮力算法尝试集合中所有可能的点组合,并跟踪贴近度函数的最小值,即Om^n算法,但我想知道是否有一种更有效的方法可以缩放n和m的大值-如果不是在最坏的情况下,那么至少对于大多数输入


更新:点将具有实际值作为坐标;使用整数来简化例子。

首先我们可以考虑对蛮力算法的改进。

Om^n是一个巨大的数字!我们如何加强这一搜索? 您没有搜索保证最小值的集合的全局覆盖范围。 此外,解决方案中需要每个集合的一个点。 新的暴力算法将如下所示:

对于S0中的每个点p,找到S1…Sn-1中距离p最近的点

该算法的计算复杂度为Omnm

我们能进一步改进算法吗?对

我们可以采用一种新的方法来加速邻居搜索。基本上,您需要在Omlogm中构建n Kd树,并使用它们将平均情况下的复杂性降低到Omn*logm

这个算法总是找到最小值吗?没有

看看这个例子:


正如您所看到的,使用前面的算法获得的簇间距离不是最优的,它只是一个最近邻启发式算法。好消息是,您将接近解决方案。您可以采用来查找全局最小值

您可以使用点的Delaunay三角剖分。该三角剖分图对邻近信息进行编码:每个顶点通过Delaunay三角剖分的一条边连接到其最近的邻居。您可以使用Delaunay三角剖分和联合查找来创建点集。

这可以看作是一个问题。解决此问题的一种方法是构建一棵树,并通过保持当前最佳点集,对其调用的树的每个分支进行DFS检查。下面是您的示例的示例:

沿着最左边的分支走,找到第一个结果。然后每次你沿着一条树枝往下走,如果在某个点上你计算的距离比你的实际结果要好,你可以停止对树枝的探索——你往下走不会得到更好的结果

这可能与几个点无关,但如果你有10组10个点,这是一个好方法。加速该过程的一个简单方法是将最小的集合放在树的顶部(无节点和分支)

显然,在最坏的情况下,最右边的分支是最好的分支。但不太可能每个后续分支都会比前一个好,因此您仍然应该获得一些时间


注意:在计算两点之间的距离时,不要忘记存储它,这样以后就不必重新计算了。

谢谢你的建议。这就是我所想的方向——计算每个点集的Voronoi网格并将其叠加。仍在研究细节。我忘了提到点不一定有整数坐标,所以union find可能不适用。据我所知,union find不依赖于任何方式来表示对象。例如,看看算法的描述:+1,因为这是一个相对于我的启发式解决方案较慢的解决方案,但如果m和n的值合理较小,则始终会给出最小值。