加快算法以找到两个2D点数据集中最接近的项目

时间:2015-09-18 09:24:31

标签: c++ algorithm

嗨,我正在寻求改进这个非常慢的算法。它应该只返回一个点,该点是两个数据集中两个最接近的点之一。

我使用的方法只是蛮力,清楚地测试每组点之间的距离。肯定有更好的办法。

SELECT LPAD(col_name, 6,'00000') FROM your_table

请有人指出我以正确的方式加速这段代码,希望按照数量级的顺序。示例代码会很棒。

2 个答案:

答案 0 :(得分:1)

我已经解决了类似的问题,我设法获得了100倍的加速,但这取决于数据。

如果您可以将一组点预先排序为图块网格,则可以使用图块大小缩小需要测试的点数。给定点将具有到特定图块中任何点的最小和最大距离。您可以使用这些最小和最大距离来绑定您检查的区块,从而避免检查远处区块中的点。

将点划分为切片后,您可以查找新点落入哪个切片,然后从那里开始。根据您的数据,磁贴可能没有预先排序的点。最初你只想检查第一个瓷砖和周围的瓷砖,直到找到任何一点。这一点将为您提供最小距离的近似值。一旦知道所选点与找到的点之间的最小距离,就可以继续检查图块中的所有点,直到所选点与给定图块中任何点之间的最小距离大于找到的最小值。更远的瓷砖中的任何点都不能比您已找到的点更接近。如果您找到新的近点,那么最小距离当然会更新。

排序步骤为O(n),查找步骤在n和n ^ 2之间,因此预期时间应至多为O(n ^ 2),可能更好,可能接近线性你有一个合适的分配点。

对于图块大小,我发现选择图块,因此每个图块中的点数大致等于覆盖数据集的图块数量,从而产生最佳运行时间。你可以用瓷砖的层次结构做得更好,但我的解决方案从来没有这么复杂。

答案 1 :(得分:0)

这是一个很好的问题。通常的递归closest pair of points algorithm显然不起作用,因为两个点集可能聚集在空间的不同区域。

你仍然可以在O(nlogn)时间解决这个问题。只需创建一组中所有点的kd树(k = 2),然后使用另一组中的所有点进行查询。