我试图在Java中解决以下问题(虽然它可以用几乎任何其他语言完成):
我得到两个整数值数组xs
和ys
,表示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)
。
这是我自己的问题,而不是作业问题。您的所有提示都将受到高度赞赏。
答案 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))
。
如果数组的长度不同,另一种方法是:
这有O((n1+n2)*log(n1))
时间复杂度,其中n1
是较短数组的长度。