想象一下2D平面中的一组m
点,称为“候选者”。然后是两种情况之一:
还有一组n
点(“对象”) - 见图1
还有一组与X或Y轴(“对象”)共线的n
行 - 见图2
我想知道哪个候选对象对具有所有对中最短的笛卡尔距离。
拜托,有没有人知道这个问题在计算几何中是否有名称?是否有比O(m * n)快的算法?如果对象保持不变,只有候选者改变 - 通过一些聪明的预计算,它是否可能比O(m * n)更快?
图。 1
c o
c
o c o
o c
c
c o
c o
c
o c
c
图。 2
| c |
-------------+----------------------------------+------
| |
| c | c
c |
| |
-------------+----------------------------------+------
| c c |
-------------+----------------------------------+------
| c |
答案 0 :(得分:1)
这基本上是对所有候选人的最近邻搜索。您可以使用kd tree索引加快这些类型的问题。
答案 1 :(得分:0)
我不知道如何从对象创建线条。对于每个对象,您创建两条线:一条是垂直线,一条是水平线,是吗?
在任何情况下,假设您有垂直线v1,v2,..,va和水平线h1,h2,...,hb。
根据x轴偏移和水平线根据y轴偏移对垂直线进行排序。
对于候选集中的每个点,进行二分搜索以获得最近的垂直和水平线。现在,如何计算最接近的(候选者,线)对,这是微不足道的。
答案 2 :(得分:0)
您正在寻找的名称很可能是NNS(请参阅:http://en.wikipedia.org/wiki/Nearest_neighbor_search),如果为一组静态“对象”预先计算一些时间和空间,应该可以比O更快地执行搜索(N * M)。
即使使用最简单的构建二叉搜索树的方法,您也应该能够将单个查找的时间复杂度降低到O(log n),导致整个问题的O(m log n)。 / p>
答案 3 :(得分:0)
你有两个1d问题而不是一个2d。 在x和y轴上投射所有'condidates',然后将垂直'对象'放在x轴上,水平放在y上。
瞧!两个1d问题。
现在是1d。
将所有'condidates'放入已排序的数组中,因为每个'对象'都使用二进制搜索来查找该数组中包含的段(两个最接近的'condidates')。
结果为O(n log m + n log n)