Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Программирование

Пересекаются ли отрезки времени без учета даты? : Программирование

23.04.2024 19:42


04.03.2015 18:03
OlegON
 
Итак, есть временные отрезки
beg-end
std-etd
на 24-часовом циферблате. Могут быть любой длины, в т.ч. нулевой и больше суток, даты нет, только часы.
Какой правильный и красивый алгоритм определения, что отрезки пересекаются?
Сделал просто
Код:
((beg>=std && beg<etd)||(end>=std && end<=etd))
все ли учел? Только, плз, не надо кучи ссылок, я уже себе мозг вырвал чтением разных вариантов, большинство из них с учетом календаря, а мне не надо это, либо совпадают с моим, но у меня нет в нем уверенности..
04.03.2015 18:15
KirillHome
 
Цитата:
OlegON Итак, есть временные отрезки
beg-end
std-etd
на 24-часовом циферблате. Могут быть любой длины, в т.ч. нулевой и больше суток, даты нет, только часы.
Какой правильный и красивый алгоритм определения, что отрезки пересекаются?
Сделал просто
Код:
((beg>=std && beg<etd)||(end>=std && end<=etd))
все ли учел? Только, плз, не надо кучи ссылок, я уже себе мозг вырвал чтением разных вариантов, большинство из них с учетом календаря, а мне не надо это, либо совпадают с моим, но у меня нет в нем уверенности..
Равняется не забыл?
Код:
((beg>=std && beg<=etd)||(end>=std && end<=etd))
04.03.2015 19:46
vdm
 
"Пересекаются" как. А то есть вариант когда второй отрезок меньше первого и полностью внутри него.
04.03.2015 21:57
OlegON
 
Равняется не забыл, специально исключил, да... т.е. beg может быть в момент std, это не пересечение...

Вот про второй меньше первого это ппц... Упустил... Только тогда как условия писать не понимаю, сравнивать

Код:
((beg>=std && beg<=etd)||(end>=std && end<=etd))||((std>=beg && std<=end)||(etd>=beg && etd<=end))
?
04.03.2015 22:32
Micle
 
в поставленной задаче можно выделить 4 случая пересечения. а именно:

Код:
1.
   --------
        ----------

2.
        ----------
   --------

3.
   ---------------
        -----

4.
        -----
   ---------------
всё остальное - частные случаи одного из перечисленных, попадающие под условия <= >=

равенство исключать нельзя на мой взгляд.

т.о. в последнем варианте уже что то похожее на правильную реализацию просматривается. Честно, не разглядывал подробно что именно с чем сравнивается.
04.03.2015 23:56
KirillHome
 
Цитата:
Micle в поставленной задаче можно выделить 4 случая пересечения. а именно:

Код:
1.
   A--------B
        C----------D

2.
        A----------B
   C--------D

3.
   A---------------B
        C-----D

4.
       A -----B
   C---------------D
....
На мой взгляд, случаев два
Код:
1.
   A--------B
        C----------D

2.
        A----------B
   C--------D

3.
   A---------------B
        C-----D

4.
       A -----B
   C---------------D
1. A <= C и B => C
2. C <= A и D => A
3. аналогично первому
4. аналогично второму.
05.03.2015 07:28
OlegON
 
Я без рисунков, просто исходя из определения, что если отрезки пересекаются наложением, то либо хвост одного принадлежит второму, либо начало. Соответственно, для случаев, когда один отрезок полностью включает второй, приходится проверять все четыре хвоста. Мне кажется, что из этого правила уже исключений не будет.
05.03.2015 09:30
vdm
 
А еще вопрос - возможна такая запись диапазона: 22:00-02:00?
05.03.2015 09:34
OlegON
 
Цитата:
vdm А еще вопрос - возможна такая запись диапазона: 22:00-02:00?
Именно, только про 22-02 речь. И 22-21 может быть.
05.03.2015 11:56
vdm
 
1. 22:00-21:00
2. 10:00-12:00

Пересечение есть, но в таком виде условия не сработают.
Часовой пояс GMT +3, время: 19:42.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.