嗨,我正在寻求改进这个非常慢的算法。它应该只返回一个点,该点是两个数据集中两个最接近的点之一。
我使用的方法只是蛮力,清楚地测试每组点之间的距离。肯定有更好的办法。
SELECT LPAD(col_name, 6,'00000') FROM your_table
请有人指出我以正确的方式加速这段代码,希望按照数量级的顺序。示例代码会很棒。
答案 0 :(得分:1)
我已经解决了类似的问题,我设法获得了100倍的加速,但这取决于数据。
如果您可以将一组点预先排序为图块网格,则可以使用图块大小缩小需要测试的点数。给定点将具有到特定图块中任何点的最小和最大距离。您可以使用这些最小和最大距离来绑定您检查的区块,从而避免检查远处区块中的点。
将点划分为切片后,您可以查找新点落入哪个切片,然后从那里开始。根据您的数据,磁贴可能没有预先排序的点。最初你只想检查第一个瓷砖和周围的瓷砖,直到找到任何一点。这一点将为您提供最小距离的近似值。一旦知道所选点与找到的点之间的最小距离,就可以继续检查图块中的所有点,直到所选点与给定图块中任何点之间的最小距离大于找到的最小值。更远的瓷砖中的任何点都不能比您已找到的点更接近。如果您找到新的近点,那么最小距离当然会更新。
排序步骤为O(n),查找步骤在n和n ^ 2之间,因此预期时间应至多为O(n ^ 2),可能更好,可能接近线性你有一个合适的分配点。
对于图块大小,我发现选择图块,因此每个图块中的点数大致等于覆盖数据集的图块数量,从而产生最佳运行时间。你可以用瓷砖的层次结构做得更好,但我的解决方案从来没有这么复杂。
答案 1 :(得分:0)
这是一个很好的问题。通常的递归closest pair of points algorithm显然不起作用,因为两个点集可能聚集在空间的不同区域。
你仍然可以在O(nlogn)
时间解决这个问题。只需创建一组中所有点的kd树(k = 2),然后使用另一组中的所有点进行查询。