【发布时间】:2026-01-15 15:05:01
【问题描述】:
我想将一个数组中的点与另一个数组中的点进行比较,并找到最接近的对。到目前为止,我遇到的只是一个数组。我不想比较来自同一个数组的点。 蛮力算法有效,但速度太慢。 有没有使用分治法的算法或实现?
编辑 1:一个点被定义为地球表面上的一对(纬度,经度)。
【问题讨论】:
-
这里的
point是什么? (x,y) 二维空间中点的坐标还是? -
@PhamTrung 一个点被定义为地球表面上的一对(纬度,经度)。
-
其他人已经为您指出了如何有效地找到最近邻居的好方法。将经度/纬度对转换为空间点可能是个好主意,例如Earth-centred, Earth-fixed 坐标系,因为经度与距离的比率在所有纬度上并不是恒定的。 (您可以在最近邻搜索之前进行一次转换。)
-
@MOehm 非常感谢。我将实现它并让你知道它是如何工作的。
-
如果您的搜索域被限制在一个相对较小的区域内,那么 lat/lng 值的失真可以忽略不计,您不必使用笛卡尔坐标。但是巴黎大约在 49°N,这意味着一个单位的经度只覆盖了大约 cos(49°) ~ 0.66 倍的同一纬度单位的距离。因此,我建议在您的距离计算中引入一个常数因子:
d² = (a*lng)² + lat²,其中a = 1/cos(lat_m)和lat_m是您搜索域的平均纬度。
标签: java arrays algorithm divide-and-conquer closest-points