Java按距离排序

时间:2010-11-22 20:53:47

标签: java algorithm

我有一个像这样的二维数组:

{1,3,5,6,2,2}

{6,2,4,7,2,1}

{17,28,32,1,35,45}

...

我有一个可以计算任意两个数组之间的欧氏距离的函数。假设距离函数正确运行,那么对二维数组进行排序的最佳方法是什么,以便交换二维数组中的数组,使得彼此最接近的数据(距离方向)将彼此接近。二维数组?

修改

这会再次降低旅行商的问题吗?

6 个答案:

答案 0 :(得分:1)

我使用TreeSet和比较器。

public class EuclidComparator implements Comparator<int[]> {

    @Override
    public int compare(int[] o1, int[] o2) {

        return euclid_distance(o1, o2);

    }

}

排序:

    TreeSet<int[]> sort = new TreeSet<int[]>(new EuclidComparator());
    sort.addAll(Arrays.asList(arrays));

甚至更容易:

    Arrays.sort(arrays, new EuclidComparator());

答案 1 :(得分:0)

我首先计算数组之间的所有距离并将它们存储在TreeMap中,然后创建一个与此映射相反的映射,然后继续排序值以对数组进行排序。

答案 2 :(得分:0)

当我思考这个问题时,我认为你需要计算从每个点到每个其他点的距离,以便知道哪个点最接近哪个点。所以你必须为N点有效地建立一个NxN网格,不是吗?

然后,一旦你有了从Nsubn到其他Nsubn的距离,你需要一个排序方法来减少得到的矩阵a-la线性代数,不是吗?

我认为它缩小为这样的矩阵:

A {1,1,1}

B {3,3,3}

C {5,5,5}

由于每个之间的距离希望是12的平方根,那么你将得到一个像这样的矩阵:

         A         B         C
A        0  sqrt(12)  sqrt(48)
B sqrt(12)         0  sqrt(12)
C sqrt(48)  sqrt(12)         0

由于这是上下对角线,你可以消除一半的网格并解决另一半...此时它应该是一个可解决的问题,不是吗?

作为参考,这是一个不同的样本:

另见:http://www.wolframalpha.com/input/?i=distance+between+(5,1,3)+and+(3,5,1

A {1,3,5}

B {5,1,3}

C {3,5,1}

然后你会有一个像这样的矩阵:

         A         B         C
A        0  sqrt(24)  sqrt(24)
B sqrt(24)         0  sqrt(24)
C sqrt(24)  sqrt(24)         0

这告诉我们所有的点都是彼此等距的。


或者我是否已经离开了这个?我错过了什么?

答案 3 :(得分:0)

你必须看到没有“完美”的解决方案,其中完美意味着“如果条目A和B在我的数组中是相邻的,那么没有一个点比A更接近A,并且没有一点更靠近B比A是“。

这根本不可能。

答案 4 :(得分:0)

您正在寻找的“后排序”数据结构可能是每个点到其两个最近邻居的 map ,而不是二维数组?除非我遗漏了您的问题域的某些属性,否则您无法将linear order应用于问题空间中的点。

答案 5 :(得分:-1)

编写快速排序,并在必须比较两个元素时使用距离函数。维基百科为您提供了算法。