我将在一般情况下解释我的问题(因为我对一般算法感兴趣),然后将其归结为我的特殊情况。
假设我们有两个有限集A和B,它们都是X的子集,还有一个距离函数d,它指定X的任意两个点之间的距离。 找到两个函数的算法是什么:从A到B的f1和从B到A的f2,使得f1(a)是B中最接近a的元素,并且对于f2而言反之亦然。
我的特殊情况是R语言,在地球上我有两组点(纬度,经度),我需要根据它们的距离将它们配对(从A到B,反之亦然)。 作为参考,我使用的是Haversine距地球距离软件包。
谢谢。
答案 0 :(得分:0)
只需提及,这是一个算法问题的算法解决方案。
让我们从解决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)
。