【问题标题】:Select pairs of numbers with the minimum overall difference选择总体差异最小的数字对
【发布时间】:2016-09-30 12:31:22
【问题描述】:

给定 n 对数字,选择 k 对,使最小值和最大值之间的差值最小。请注意,1 对中的 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 = 1,则输出为索引 3,差值为 1??
  • @User_Targaryen 是的。如果有多个解决方案,任何解决方案都可以。
  • 能否提供问题的根源?
  • @Tempux 是全国高中生编程锦标赛的一个问题。

标签: algorithm combinations difference


【解决方案1】:

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

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

当我们往回走时,已经访问过的元素的最小值必然等于或高于当前元素。根据访问对中的最大个数将访问对存储在一个最大堆中。如果堆大小小于k-1,则继续添加到堆中。

一旦堆大小等于k-1,就开始记录和比较目前为止的最佳间隔。如果堆大小超过k-1,则弹出最大元素。堆保证包含第一个k-1 对,其中最小值大于或等于当前最小值并且最大值最小(因为当堆大小超过k-1 时,我们会不断弹出最大元素)。

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)

【讨论】:

  • 这样的答案,在我看来应该得到更多的支持。
  • 如果你有 k=1 和对 [(0,4),(5,6)] 你的算法不会返回 [0,4] 吗?
  • @AriHietanen 感谢您的评论。请描述您如何看待这个过程。
  • @גלעדברקן 是的,你是对的,它是正确的。我只是没有仔细阅读它。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多