找到数组中差异最小的一对的有效方法

时间:2017-09-24 07:26:13

标签: arrays algorithm performance sorting computational-geometry

我试图解决一个问题,要求我找到一对数组差异最小的一对。

例如,如果数组是

6,7,1,3,9

输出

(6,7)

差异为1,这是最小的。

我能想到的最快的解决方案是对数组进行排序并遍历排序的数组以找到最小差异[O(nlogn)]。有没有办法在O(n)或O(logn)中优化它或更好地解决它?

编辑:数组的所有元素都是不同的。

3 个答案:

答案 0 :(得分:1)

假设所有数字都是不同的并且是分泌的,则可以在差值为1时停止搜索。

此处还有关于此问题的维基百科文章:https://en.wikipedia.org/wiki/Closest_pair_of_points_problem

此处还有另一个问题:Finding out the minimum difference between elements in an arrays

我的改进:

int[] a = new int[] {4, 9, 1, 32, 13};
Arrays.sort(a);
int minDiff = a[1]-a[0];
for (int i = 2 ; i != a.length ; i++) {
    minDiff = Math.min(minDiff, a[i]-a[i-1]);
    if (minDif == 1)
        break;
}
System.out.println(minDiff);

答案 1 :(得分:1)

我不希望你能找到O(log n)解决方案,因为至少需要迭代整个数组才能看到它的元素。对我来说,排序方法似乎是最优的,但是如果你的数字来自一个之前已知的不那么大的集合,那么有可能提高O(n log n)复杂度(例如,[0; N]范围内的整数非常小N)。在这种情况下,您可以使用最坏情况复杂度为O(n + N)的计数排序算法。但请注意,空间使用情况也是O(n + N)。计数排序有很多来源,这个就足够了:https://en.wikipedia.org/wiki/Counting_sort

答案 2 :(得分:1)

您正在尝试解决Closest Pair问题,在该问题中,您搜索数据集中彼此距离最小的两个点。将尺寸设置为1会缩小到您的情况(一个点只是一个数字)。

有效解决这个问题的算法的时间复杂度是:

  

O(nlogn)

请注意,Divide and Conquer技术可以在此上下文中使用。例如,在这些slides

提示:如果您认为数据点是 distinct ,那么当您找到距离1(因为它不能小于1)时,您可以停止算法,但这可能永远不会适用于您的数据。