我有一个像这样的二维数组:
{1,3,5,6,2,2}
{6,2,4,7,2,1}
{17,28,32,1,35,45}
...
我有一个可以计算任意两个数组之间的欧氏距离的函数。假设距离函数正确运行,那么对二维数组进行排序的最佳方法是什么,以便交换二维数组中的数组,使得彼此最接近的数据(距离方向)将彼此接近。二维数组?
修改
这会再次降低旅行商的问题吗?
答案 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)
编写快速排序,并在必须比较两个元素时使用距离函数。维基百科为您提供了算法。