2015-11-12 2 views
3

Учитывая следующий пример:Определить, если два заданных диапазонов времени перекрытия

 0 2 4 6 8 10 12 14 16 18 20 22 24 
Hour: |--|--|--|--|--|--|--|--|--|--|--|--| 

A: ------|     |--------- 
B:  |-----------| 
C: ---|     |------------ 
D: |--------| 
E:         |-----| 

A(from 18:00 to 04:00) 
B(from 02:00 to 10:00) 
C(from 16:00 to 02:00) 
D(from 00:00 to 06:00) 
E(from 20:00 to 00:00) 

Что является наиболее эффективным способом, чтобы определить, если два заданных диапазонов времени пересекаются?

Обратите внимание, что если период времени находится между 02:00 и 10:00 (B), он будет перекрывать временной диапазон с 18:00 до 04:00 (A) в период с 02:00 до 04:00 ,

Я пытаюсь вычислить это с помощью TimeRange.getSecondOfDay(), которые возвращают 0, если час 00:00:00 и 86400, если час 23:59:59. Каждый день начинаются с 0.

ответ

1

Прежде всего вам необходимо нормализовать интервалы: если интервал завершается на следующий день, то есть время окончания до начала, добавьте 24 часа до конца.

Теперь ваши интервалы будут выглядеть следующим образом:

A(from 18:00 to 28:00) 
B(from 02:00 to 10:00) 
C(from 16:00 to 26:00) 
D(from 00:00 to 06:00) 
E(from 20:00 to 00:00) 

Если вы работаете с TimeRange.getSecondOfDay(), вам необходимо добавить соответствующее количество секунд, т.е. 24*60*60*60

После того, как интервалы нормализуются, вы можете использовать обычная формула для определения перекрытия:

int overlap = MIN(a.end, b.end) - MAX(a.begin, b.begin); 
if (overlap > 0) { 
    ... 
} 
2

В общем случае для данного А имеются три области оценки es of B, так или иначе, вы должны проверить их все. Относительно простой способ - «сдвинуть» один диапазон, чтобы он начинался в 00:00, например:

bool Overlap(Range a, Range b){ 
    time b_from = (b.from-a.from+86400)%86400; 
    time b_to = (b.to-a.from+86400)%86400; 
    time a_to = (a.to-a.from+86400)%86400; 

    return !(b_from<=b_to && b_from>=a_to); 
} 
Смежные вопросы