Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.217.163] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток всем!
Такая проблема: в качестве input'a получаю пары дат. Поступают они конечно не по порядку. Некоторые из них пересекаются, некоторые - "соприкасаются", остальные - нет. Необходимо все пересекающиеся и прилежащие связать воедино, т.е. максимально уплотнить список. Например: (01.01.2018, 02.01.2018), (15.02.2018, 21.03.2018), (10.01.2018, 10.01.2018), (03.01.2018, 09.01.2018) Желаемый итог: (01.01.2018, 10.01.2018), (15.02.2018, 21.03.2018) Нет ли более-менее подходящего готового решения? |
Сообщ.
#2
,
|
|
|
|
Сообщ.
#3
,
|
|
|
Profi, имо, твое решение для етой задачи не подходит. Ты решаешь задачу со для статическим набором данных. В задаче - поток данных.
|
Сообщ.
#4
,
|
|
|
>В задаче - поток данных.
Откуда это следует? Создать для всех начал и концов пары (время, признак +/-1 для начала или конца соответственно), причём концы увеличиваем на 1 для обеспечения сцепления. Отсортировать список пар по времени. Если время совпадает, то признак - вторичный ключ, +1 идёт раньше -1 (опять же для обеспечения сцепления) Завести счётчик активных интервалов. Пройти по результату, изменяя счётчик на величину признака Если счётчик переходит из 0 в 1 - начать новый интервал для результата. Если счётчик переходит из 1 в 0 - закончить интервал, добавить его к результату. |
Сообщ.
#5
,
|
|
|
Цитата MBo @ Откуда это следует? Цитата firelex @ в качестве input'a получаю пары дат. Поступают они конечно не по порядку |
Сообщ.
#6
,
|
|
|
MIF
Может, в этом и есть резон (я бы воспринял это как просто несортированный набор данных) В таком случае структура данных понадобится динамическая типа дерева интервалов. |
Сообщ.
#7
,
|
|
|
спасибо всем за комменты.
Я, в принципе, вручную так все и делал. До вот этого Цитата сам долго доходил (плюс еще начала уменьшаю на 1 - все для той же сцепки). Теперь всегда делаю только так - самый надежный вариант. причём концы увеличиваем на 1 для обеспечения сцепления. Данные поступают из БД. Иногда готовым массивом, иногда - частями. Просто очень уж модуль удобный получается - применим в разных случаях. Жаль что готового класса нет. |
Сообщ.
#8
,
|
|
|
>плюс еще начала уменьшаю на 1
Это лишнее, если нет специальных условий сцепки - в таком случае интервалы 1-3 + 5-7 превратятся в 0-4 и 4-8 и объединятся. |