[英]24 hour ranges intersection logic
我的时间表可以从21:00到04:00。
通常,这些时间表可能会超过00:00小时。
现在我还必须添加从00:00到23:59的正常时间表。
我想为它计算一个交集。
目前我正在使用
if(((mytime1.start_time <= mytime2.end_time) && (mytime2.start_time <= mytime1.end_time))).
当考虑到跨日行程时,我仍然没有有效的防错逻辑,请帮忙。
bool DoIntervalsOverlap(int s0, int e0, int s1, int e1)
{
return s0 - e0 <= (unsigned int) s0 - e1 || s1 - e1 <= (unsigned int) s1 - e0;
}
首先,请注意,实质上,所有算术都是无符号的。 在s0 - e0 <= (unsigned int) s0 - e1
,将e1
转换为unsigned int
以匹配s0
,将s0 - e0
转换为unsigned int
以匹配(unsigned int) s0 - e1
。 下面,我假设所有算术都是无符号的。
回想起来,我希望我以相反的顺序写这些术语。 让我们现在修复它。 s0 - e0 <= s0 - e1
等效于e0 - s0 >= e1 - s0
。 (即使在无符号算术中也是如此。)现在我们可以将e0 - s0
和e1 - s0
视为将e0和e1转换为以s0为原点的参考帧的时间。 在此框架中,每天中比原始s0早的任何时间都被包装为大正数。 因此,午夜时分的包裹不见了。 从s0开始只有非负时间。 然后我们看到e0 - s0 >= e1 - s0
在问“从s0测得的e1是否小于或等于e0 ?”的问题等同于“在[ s0 , e0 ]内的e1是吗?”
因此,这两个条件询问“[S0,E0]内E1或为[S1,E1]内的e0?”如果任一间隔在另一个之内结束,则间隔重叠。 如果两端都在另一端,则它们不会重叠。
按顺序考虑第一个时间间隔中的每个时刻。 如果这些时刻都与第二个间隔的开始不重合,则这两个间隔不会相交,除非这些间隔已经与开始相交,在这种情况下,第一个间隔中的第一个瞬时将沿着第二个间隔以类似的方式发生间隔。 因此,如果第一个间隔的开始和结束是(l1,r1),第二个间隔的开始和结束是(l2,r2),我们可以通过查看是否在范围[l2,r2]中包括l1以及是否包括l2来进行检查在[l1,r1]范围内。 如果lx在数值上不大于rx,则这是简单的检查,看是否(l1> = l2)&&(l1 <= r2)。 如果lx大于rx,则它是一个环绕间隔,您可以检查(l2> = l1)|| (l2 <= r1)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.