如何快速的在多个时间段中获取是否跟指定时间段有交集?

把一堆时间段存起来,然后传入一个时间段,快速比对出是否有相交叉的时间段?

突然看到了一个思路:假如时间都是半个小时一截的,一天24小时,可以分成48个半个小时,那么可以用长度为48的数组表示这半个小时是否被占用,0未占用 1占用,例如a = [1,1,0,...] 就表示00:00 ~ 00:30、00:30 ~ 01:00是占用的。如果你是一个内存吝啬型的人,那么可以考虑用位运算来表示时间占用情况。
这样以来,遍历到每一个元素直接查数组看是不是被占用了就行,时间复杂度是O(n)。
可以将a存入redis,key为a对应的日期,这样我们只需要查询条件中的日期中是否有被占用的就行了。

但是redis如果崩了我还没相到兜底的方案。如有更优的方案,请多多指教

阅读 3.8k
1 个回答

可以使用线段树,先把现存的时间段添加到线段树中,每一个添加一个时间段就把该时间段对应的区间全体累加1,等查询的时候只需要看要查询区间的sum是否大于0就知道是否有相交了,这样的话查询和添加时间段,删除时间段的时间复杂度都是O(log(N)),其中N为区间的个数,比如按分钟分割的话N就为60 * 24

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题