Select 对数字总差最小

Select pairs of numbers with the minimum overall difference

给定n对数,selectk对使得最小值与最大值之差是最小的。请注意,一对中的 2 个数字不能分开。示例 (n=5, k=3):

INPUT        OUTPUT (return the index of the pairs)
5 4          1 2 4
1 5
9 8
1 0
2 7

在这种情况下,选择 (5,4) (1,5) (1,0) 将得到 5 (最大值为 5 , 最小值为 0)。我正在寻找一种有效的方法 (n log n) 来执行此操作,因为输入会非常大,我不想遍历所有可能的情况。

谢谢。

注意:不需要代码。解决方案的解释就足够了。

让我们继续排序数组:一个根据成对的最小数量排序,另一个根据最大数量排序。让我们遍历第一个数组并修复答案中的最小数字。我们可以将指针指向第二个数组中的第 k 个数字。当我们转到下一对时,如果需要,我们会从第二个数组和前向指针中删除所有最小值较小的对。要在第二个数组中找到 log n 时间的位置,我们可以在对和位置之间保留额外的映射。

这是一个时间复杂度为 O(n log n) 的方法:

首先根据对中较小的数字对数组进行排序。现在从排序数组中的最后一个元素(具有最高最小值的对)开始迭代。

随着我们向后移动,已经访问过的元素的最小值必然等于或高于当前元素。根据访问对中的maximal个数,将访问对存储在最大堆中。如果堆大小小于 k-1,则继续添加到堆中。

一旦堆大小等于k-1,开始记录和比较迄今为止的最佳间隔。如果堆大小超过 k-1,弹出最大元素。堆保证包含第一个 k-1 对,其中最小数大于或等于当前最小数,最大数最小(因为当堆大小超过 [=12 时我们不断弹出最大元素=]).

排序的总时间 O(n log n) + 迭代和维护堆的 O(n log n) = 总共 O(n log n)

示例:

5 4
1 5
9 8
1 0
2 7

k = 3

Sort pairs by the smaller number in each pair:
[(1,0),(1,5),(2,7),(5,4),(9,8)]

Iterate from end to start:
i = 4; Insert (9,8) into heap
i = 3; Insert (5,4) into heap
i = 2; Range = 2-9
i = 1; Pop (9,8) from heap; Range = 1-7
i = 0; Pop (2,7) from heap; Range = 0-5

Minimal interval [0,5] (find k matching indices in O(n) time)