我有一个长度为N的数千个点的列表,每个点都有纬度和经度。
我想将这些点分组为N / 2组,每组包含2个点(如果N为奇数,则一个将有3个点)。
此分组的目的是最小化2点之间的距离。我们可以考虑每个组的误差作为点之间的距离平方。并且所有组的错误总误差总和。
考虑到算法应该相对较快的约束(这将在API上部署并运行以响应用户请求),实现此目的的最佳算法是什么?
分组并不一定是最好的'可能,但最好是确定性的。
答案 0 :(得分:1)
计算中心。
按距离中心的距离对点进行排序。
按降序排列,选择下一个不匹配的点并将其与最近的不匹配的邻居配对。你可以使用三角不等式来保持候选人的小。
对于索引,此贪心方法为O(n log n),否则为O(n ^ 2)。这可能不是最好的结果,但对于这个运行时间应该相当不错。预先排序避免了真正的坏情况(只要中心不太平衡)。
答案 1 :(得分:0)
首先,我们可以定义一个象限函数:
int quadrant(point a){
if(a.latitude > 0)
if(a.longitude > 0) return 1;
else return 2;
else
if(a.longitude < 0) return 3;
else return 4;
}
然后我们可以像这样对点进行排序:
bool comparison(point a, point b){
if (quadrant(a) == quadrant(b)){
if(a.longitude > b.longitude) return true;
else return a.longitude > b.longitude;
else
return quadrant(a) < quadrant(b);
}
象限功能就像笛卡尔平面一样,可以帮助你将点放在一起。
基于比较的排序将帮助您将近点组合在一起,这样您就可以成对(a1,a2),(a3,a4),...,(an-1,an)和它将花费O(N lg(N))时间。
如果您更好地对待相邻象限或做更多逻辑,您可以优化一点,但这是一个良好的开端。