我将在一般设置中解释我的问题(因为我对一般算法感兴趣),然后拒绝它到我的特定情况。
假设我们有两个有限集合,A 和 B,都是 X 的子集和一个距离函数 d,它分配 X 的任何两点之间的距离。 什么是找到两个函数的算法:从 A 到 B 的 f1 和从 B 到 A 的 f2,使得 f1(a) 是 B 中最接近 a 的元素,并且对于 f2 具有相同的 viceversa。
我的特殊情况是在R语言中,我在地球上有两组点(纬度,纬度),我需要根据它们的距离将它们配对(从A到B,反之亦然)。 作为参考,我使用的是与地圈包的哈弗辛距离。
提前谢谢。
只是提到,这是算法问题的算法解决方案。
让我们从时间和内存复杂性O(n^2)
解决方案开始。对于A
中的每个元素,请记住与B
中每个元素的距离。然后遍历这个二维数组,并为每一行找到它的最小值 - 这些元素是f1
的图像,f2
总是与f1
相反的函数。
现在我们可以在O(n log n)
时间复杂度和O(n)
内存复杂度方面创建类似的解决方案。使用二叉搜索。
让我们对A
中的元素进行排序,我们可以说出最接近O(log n)
集合中的某个项目的项目。对于数字,只需对它们进行排序即可完成,使用lon & lat
,您只需要先按lon
而不是按lat
对它们进行排序。
现在,对于A
中的每个元素,使用二叉搜索搜索B
中最接近的项目是什么。每个问题需要O(log n)
。现在对于每个元素,我们知道哪个是最接近的。O(n log n)
.