【问题标题】:Given a set of intervals and a time t, find one of the intervals containing that time给定一组区间和时间 t,找到包含该时间的区间之一
【发布时间】:2018-12-17 15:21:24
【问题描述】:

间隔有开始时间和结束时间。 间隔可以重叠。可能有几个包含时间 t 的区间。可以只退回其中一个。

这是一道面试题。我能够通过基于结束和另一个基于开始的时间排序间隔并获取具有匹配开始和结束的间隔的交集来解决它。显然有更优化的解决方案。

这是一个示例:[1, 5] [2, 10] [3, 6] [2, 9] 并且目标是 8。在这种情况下,[2, 10] 和 [2, 9] 中的一个是正确答案。

我想问题的重点是预先计算间隔上的数据结构,以便可以以比线性更好的复杂性运行搜索。

【问题讨论】:

  • 你为什么要对它们进行排序:O(nLog n) 单独排序,而不是迭代直到找到一个 - 最坏情况 O(n)?
  • 假设与间隔 start 和 end 对应的数字是恒定大小(可以适合整数),给定的实现可以使用基数排序,因此运行时间为 O(n),而不是我'我说这是一个很好的解决方案。
  • 我假设问题中有一个措辞错误:如果您只是对列表进行两次排序并按照您的描述进行交叉,您将得到与您开始时完全相同的列表,可能在不同的顺序。如果您将 sorting 一词更改为 filtering,那么它作为一种解决方案实际上是有意义的,尽管不是最佳的。
  • @Richardissimo 我不确定为什么我们得到相同的数组。该数组按开头排序一次,并在末尾排序。从每一个中我们找到满足标准的区间(即开始小于目标,结束大于目标),然后取这两者的交集。我知道这仍然表现不佳。只是澄清你提到的措辞。
  • @MarkMeyer 在问题中添加了更多信息以进一步澄清。这是因为可以预先计算数据,以回答随后的搜索。我必须澄清这一点。您的观点仅适用于一次运行。

标签: algorithm


【解决方案1】:

我找到了答案here,这个问题就像一棵区间树。

可以在许多资源中找到解决方案,但我发现上面提到的 pdf 非常简洁明了。

这是答案的相关部分:

【讨论】:

    【解决方案2】:

    遍历间隔,直到找到给定时间介于该间隔开始和结束之间的间隔。你可以停在你找到的第一个。最坏情况下的性能是 O(n)。

    编辑以添加 因为问题已被编辑以添加预先计算答案的建议

    预先计算答案会强制假设每个区间的时间不变,区间的集合也不变。问题中没有说明这一点,但以下内容基于该假设。

    如果您要预先计算结果,则需要检查每个可能的小时的集合。您可以在 all 24 小时内执行此操作,或者(对于少数间隔)可能的小时数列表是从开始小时的最小值到结束小时的最大值的范围(因为所有其他时间将没有间隔),花费 O(n) 来计算最小值和最大值。选择哪种方法取决于您有多少间隔。如果 n 足够大,那么您将忽略计算最小值和最大值,并在所有 24 小时内进行,

    对于每个可能的小时,您需要检查集合以匹配第一个间隔(最坏情况为 O(n),每个小时),并将其存储以供将来查找。

    它们可以存储为对间隔的引用数组,使用小时作为索引,产生最坏情况的 O(1) 查找成本。

    因此,如果您进行了足够多的查找,并假设间隔永远不会改变,这将比每次都计算要快。

    【讨论】:

    • 这是一个聪明的答案!!我承认它很漂亮!我认为问题的重点可能是您可以预先计算数据,因此对于任何未来的搜索,查找时间都可能比线性更好,例如 O(log(n))。
    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多