【问题标题】:finding the kth shortest interval containing an integer找到包含整数的第 k 个最短区间
【发布时间】:2021-08-24 20:50:20
【问题描述】:

我面临以下问题的挑战:我需要编写一个程序,将n 间隔[a,b]m(k,d) 作为输入。对于每个(k,d) 对,程序应输出第k 个最短区间的长度(其中区间的长度定义为b - a + 1),其中a <= d <= b。如果d 不在任何区间内,或者d 在小于k 区间内,则程序应输出-1

输入/输出示例:

第一个整数 (5) 代表n。接下来的n 行包含间隔(如 [2..4]、[2..6] 等)。下面是整数m (3),后面是m 成对行(k,d)

我正在寻找一种能尽快解决这个问题的算法。

【问题讨论】:

  • 您谈论的是n 间隔和m 对,但没有描述输入的组织方式。例如,n 是文件中的第一个数字吗?这后面是n 间隔[我们每个读到两个数字]?然后,我们会读取数字m 然后m 对[每个两个数字]?或者,是nm 文件中的前两个数字[分别]。所需输出的描述是什么。您显示了输出,但没有描述(例如)318-1 代表[确切] 基于文件数据,我 @987654356 @ 是 5m3?
  • @EugeneSh。对不起,我忘了提。我正在寻找一种算法来在尽可能小的时间复杂度内解决这个问题。
  • @CraigEstey 我确实不清楚输入和关于,谢谢你提到它。我已经更新了这个问题。您对输入的假设是正确的。输出是包含 d 的第 k 个最小区间的长度。
  • 欢迎来到 Stack Overflow。请阅读AboutHow to Ask 页面。我们将通过诚实尝试解决任务来帮助您解决问题,但我们通常不会为您编写代码。请注意,您应该展示您尝试过的代码并解释您遇到的问题。它应该是 MCVE(Minimal, Complete, Verifiable Example — 或 MRE 或 SO 现在使用的任何名称)或 SSCCE(Short, Self-Contained, Correct Example) — 相同的想法但名称不同。
  • 你说:“最短间隔”。但是,对于 [2,8] 对,它匹配间隔 [8,16]2,19] 第一个长度为 9,第二个长度为 19(您使用的是 (b - a) + 1 [包括在内])。因此,在您的示例输出中, 18 是“一对一” [来自 19]。 最短匹配间隔是[8,16],长度为9。因此,除非我遗漏了什么,否则所需的输出无法与输入匹配。

标签: c algorithm data-structures intervals


【解决方案1】:

这可以通过sweep line algorithm 在 O((n + m) log n) 时间内解决。

扫描线算法设置一个定时事件列表,然后按排序顺序对其进行处理。对于这个问题,每个区间 [a, b] 在时间 a 产生一个开始事件,在时间 产生一个停止事件b。每个查询 (k, d) 在时间 d 产生一个查询事件。由于间隔是完全闭合的,因此我们每次处理开始事件,然后查询事件,然后停止事件。

我们维护一个由扫描点刺入的间隔长度的排序列表。要处理开始事件,请将间隔的长度添加到列表中。要处理停止事件,请从列表中删除间隔的长度。要处理查询事件,请检索列表的 kth 元素。在 O(log n) 时间内支持所有这些操作的排序列表数据结构是一棵红黑树,其中每个节点都包含其左子树中的节点数。这几乎是树增强的典型示例,因此 CLRS 和许多其他来源应该有详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-22
    • 2015-08-05
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多