当前位置: 首页 > 知识库问答 >
问题:

给定一组时间间隔和时间t,找出其中一个包含该时间的时间间隔

田硕
2023-03-14

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

这是一个面试问题。我能够解决这个问题,方法是根据结束对间隔进行排序,根据开始对另一个时间进行排序,并取具有匹配开始和结束的间隔的交点。显然有更多优化的解决方案。

这里有一个例子:[1,5][2,10][3,6][2,9],目标是8。在这种情况下,[2,10]和[2,9]中的任何一个都是正确答案。

我想问题的关键是在区间上预计算一个数据结构,这样搜索的复杂度就比线性搜索好。

共有2个答案

吴兴国
2023-03-14

重复这些时间间隔,直到找到一个给定时间介于该时间间隔开始和结束之间的时间间隔。你可以在第一个找到的地方停下来。最坏的情况是O(n)。

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

预先计算答案迫使人们假设每个时间间隔的时间不变,时间间隔的集合不变。问题中没有说明这一点,但以下是基于这一假设。

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

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

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

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

柴博
2023-03-14

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

这个解决方案可以在很多参考资料中找到,但我发现上面提到的pdf非常简洁,切中要害。

以下是答案的相关部分:

 类似资料:
  • 我试图解决以下问题:给定N个时间间隔,每个时间间隔指定为(开始,结束),不重叠,根据开始排序——找到一个包含给定日期的时间间隔。例如: 3人进入第一节,15人进入第四节,以此类推。 到目前为止,我有以下基本想法: 我们可以使用二进制搜索来找到相应的间隔(logn) 由于可能只有少数时间间隔较大,其余时间间隔较小,因此根据时间长短对itervals进行排序可能是值得的。然后,在统计上,大多数情况下,

  • # interval(date) Alias for interval.floor(date). For example, d3.time.day(new Date()) returns midnight (12:00 AM) on the current day, in local time. # interval.floor(date) Rounds down the specified da

  • 问题内容: 我需要将表分组为15分钟间隔。我可以这样做: 但是要在图表中显示返回的数据,我还需要插入没有任何数据且当前未出现在我的select语句中的间隔。我该如何插入这些? 问题答案: 用15分钟的增量创建一个带有所有可能时间戳的表,然后从该表向上面的查询进行LEFT JOIN。 如果您知道图表始终涵盖24小时,则只需创建一个数字为0-95的表格,然后为每个条目将其添加到图表的开始时间。

  • 问题内容: 时间间隔后如何调用方法?例如,如果要在2秒钟后在屏幕上打印声明,其程序是什么? 问题答案: 答案是一起使用javax.swing.Timer和java.util.Timer: 显然,仅使用java.util.Timer可以达到2秒的打印间隔,但是如果要在一次打印后停止打印,那将很难。 另外,请勿在代码中混用线程,而无需线程即可! 希望这会有所帮助!

  • 问题内容: 我有一列称为“ s_timestamp”。 如何返回时间戳中具有当天的所有记录? 例如, 我想要以下输出: 让我知道是否不清楚。 问题答案: 只是使用。例如 日期() CURDATE()

  • 时间间隔:一条链上相邻区块的时间差。时间间隔越小,出块速度越快,TPS就越高。 本系统中,时间最小单位为1毫秒。 第一条链的时间间隔为1分钟,新链的时间间隔降为其父链的15/16,所以第二条链的时间间隔为56250毫秒。 新链有更小的时间间隔,出块速度更快。 区块的时间间隔可以根据需要调整,最大为1分钟。