Java:距离度量算法设计

时间:2012-06-11 13:09:04

标签: java algorithm measure

我试图在Java中解决以下问题(虽然它可以用几乎任何其他语言完成):

我得到两个整数值数组xsys,表示x轴上的dataPoints。它们的长度可能不相同,但两者都是> 0,他们不需要排序。我想要计算的是两个数据点之间的最小距离度量。我的意思是,对于每个x,我在y的集合中找到最接近的ys并计算距离,例如(x-y)^2。例如:

xs = [1,5]
ys = [10,4,2]

应返回(1-2)^ 2 +(5-4)^ 2 +(5-10)^ 2

距离测量并不重要,它是我感兴趣的算法。我正在考虑对这两个阵列中的数组和高级索引进行排序,以某种方式实现比bruteforce更好的东西(对于x中的每个元素,扫描所有元素)是找到min {} O(len1 * len2)

这是我自己的问题,而不是作业问题。您的所有提示都将受到高度赞赏。

3 个答案:

答案 0 :(得分:2)

我认为HighPerformanceMark(对你的问题的第一个评论)是正确的,你实际上采用较大的数组,为每个元素找到最小的数组,并在这些距离上总结一些f(dist)。

我建议你的方法:

Sort both arrays 
indexSmall=0 

// sum up
for all elements e in bigArray {
  // increase index as long as we get "closer"
  while (dist(e,smallArray(indexSmall)) > dist(e,smallArray(indexSmall+1)) {
    indexSmall++
  }
  sum += f(dist(e,smallArray(indexSmall)));
}

O(max(len1,len2)*log(max(len1,len2)))用于排序。其余部分与较大的阵列长度呈线性关系。现在dist(x,y)就像abs(x-y)f(d)=d^2或者你想要的任何东西。

答案 1 :(得分:1)

你提出的想法对我来说听起来不错。您可以在O(n logn)时间内对列表进行排序。然后,您可以使用另一个滑动索引对较长列表执行单次迭代以查找“对”。当您浏览更长的列表时,您将永远不必回溯另一个。所以现在你的整个算法都是O(n logn + n)= O(n logn)。

答案 2 :(得分:1)

您的方法非常好,时间复杂度O(n1*log(n1)+n2*log(n2))

如果数组的长度不同,另一种方法是:

  1. 对较短的数组进行排序;
  2. 从头到尾遍历较长的数组,使用二进制搜索找到已排序的短数组中最近的项目。
  3. 这有O((n1+n2)*log(n1))时间复杂度,其中n1是较短数组的长度。