基于距离的大小为2的组

时间:2016-09-05 21:19:30

标签: algorithm cluster-analysis k-means

我有一个长度为N的数千个点的列表,每个点都有纬度和经度。

我想将这些点分组为N / 2组,每组包含2个点(如果N为奇数,则一个将有3个点)。

此分组的目的是最小化2点之间的距离。我们可以考虑每个组的误差作为点之间的距离平方。并且所有组的错误总误差总和。

考虑到算法应该相对较快的约束(这将在API上部署并运行以响应用户请求),实现此目的的最佳算法是什么?

分组并不一定是最好的'可能,但最好是确定性的。

2 个答案:

答案 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))时间。

如果您更好地对待相邻象限或做更多逻辑,您可以优化一点,但这是一个良好的开端。