Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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_Geometry - Fatal编程技术网

Algorithm 点阵列中两点之间的最小欧氏距离

Algorithm 点阵列中两点之间的最小欧氏距离,algorithm,geometry,Algorithm,Geometry,明显的O(N^2)是计算每对点之间的欧氏距离。我已经用Python实现了(省略了calc_euclidean_dist()实现): def closestPointPair(对): 最小距离=系统最大尺寸 对于范围内的i(len(对)): 对于范围内的j(i+1,len(对)): dist=计算欧几里得距离(成对[i],成对[j]) 如果距离小于最小距离: 最小距离=距离 返回最小距离 有更好的解决办法吗?也许对点进行排序?最近点对问题有一个众所周知的解决方案(正如@dxiv所指出的) 在最坏

明显的O(N^2)是计算每对点之间的欧氏距离。我已经用Python实现了(省略了calc_euclidean_dist()实现):

def closestPointPair(对):
最小距离=系统最大尺寸
对于范围内的i(len(对)):
对于范围内的j(i+1,len(对)):
dist=计算欧几里得距离(成对[i],成对[j])
如果距离小于最小距离:
最小距离=距离
返回最小距离

有更好的解决办法吗?也许对点进行排序?

最近点对问题有一个众所周知的解决方案(正如@dxiv所指出的)


在最坏的情况下,它的时间复杂度为O(N logn),实现起来并不太困难。

因为点a和点b之间的距离与点b和点a之间的距离相同-不要计算相同的值两次。它将把您带到
O(n Log n)
。在@PM77-1处的一些指针实际上是dist(a,b)=dist(b,a),内部循环只需要在列表索引i+1和n-1之间迭代。我已经用这个改进更新了问题中的代码。尽管如此,该算法仍然是O(N^2),因为比较的数量将是N-1+N-2+…+1=和(1,N-1)=(N^2-N)/2,也就是O(N^2)。是的,你是对的。
def closestPointPair(pairs):

    min_dist = sys.maxsize

    for i in range(len(pairs)):
        for j in range(i+1, len(pairs)):
            dist = calc_euclidean_dist(pairs[i], pairs[j])
            if dist < min_dist:
                min_dist = dist

    return min_dist