如何正确找到其他间隔之间的间隔

How to correctly find intervals between other intervals

我需要想出一个可以在时间轴上找到空闲间隔的算法。

有一个时间尺度。从 00:00 到 24:00。最初,当没有空缺时,所有时间都是免费的,免费间隔为(0...1440)(以分钟为单位)。

比如我们加一个空缺,我是说我们把工作时间比如从08:00设置到21:00。

现在我们已经有 2 个免费间隔了。从 00:00 到 08:00。从 21:00 到 24:00.

我将在下面附上图片以明确我的意思。

*默认变体

*职位空缺间隔(工作时间)可能会重叠

*空缺的间隔可以设置,不限制数量,与任何东西相交,最重要的是24小时内(1天)

我期望的结果:最初,我们有一个从 0 到 1440(以分钟为单位)有 1 个自由间隔的数组,我们调用该函数并将工作时间传递给它,在输出中我们得到一个更新的数组的间隔,其中已经有 2 个间隔。然后我们可以再增加 1 个工作时间,输出函数将始终为我们提供具有正确间隔数的实际数组以及间隔本身的空闲时间

为了编写代码我使用swift,但我会理解Python或类似

中的解决方案

非常希望得到您的帮助!我希望至少社区能帮助我走上正确的道路,目前,我不知道该走哪条路。 :(

一种可能的方法是使用大小为 1440(分钟数)的数组。您可以将所有初始化为 0 表示所有都是免费分钟。

对于您需要添加的每个空缺间隔,翻转该间隔中 0 -> 1 的值,其中 1 表示工作分钟。

只要您需要数组,就可以遍历数组并找到 free-time 和空位的 0 和 1 的“集合”。

但是,这是一种非常粗略的方法,每个查询(更新和 select)都需要线性时间。如果将整个事情实现为线段树(读取 RMQ - 范围最小查询),您可以在性能方面做得更好,其中更新的时间复杂度和 selects 将是对数的。根据更新次数和 selects 以及您希望代码的性能如何做出此决定。例如。如果查询总数约为 10k,则无需使用线段树。如果它们是 ~10^5 或更多,那么你应该。

将间隔转换为成对的 start/end 事件,按时间对事件进行排序,然后 运行 遍历列表并计算开始比结束多多少。

两者相等的任何时间段都会成为您答案中的间隔。


这是一个解释性的例子。假设我们有以下间隔:

04:00 - 09:00
15:00 - 20:00
08:00 - 12:00

我们从他们那里得到了以下事件列表。

04:00 start
09:00 end
15:00 start
20:00 end
08:00 start
12:00 end

再添加 2 个来结束这一天

00:00 analysis_start
24:00 analysis_end

排序为:

00:00 analysis_start
04:00 start
08:00 start
09:00 end
12:00 end
15:00 start
20:00 end
24:00 analysis_end

现在我们对它们进行处理,得出以下开区间数:

00:00 - 04:00 0
04:00 - 08:00 1
08:00 - 09:00 2
09:00 - 12:00 1
12:00 - 15:00 0
15:00 - 20:00 1
20:00 - 24:00 0

现在答案是我们的计数是 0:

00:00 - 04:00
12:00 - 15:00
20:00 - 24:00