Boost.Icl может быть полезно для вас.
Библиотека предлагает несколько шаблонов, которые вы можете использовать в вашей ситуации:
- interval_set - Реализует набор как набор интервалов - объединяет смежные интервалы.
- Отдельный_интервал_сет - реализует набор как набор интервалов, оставляя соседние интервалы отдельными
- split_interval_set - реализует набор как набор интервалов - при вставке интервалы перекрытия делятся
Существует пример для слияния интервалов с библиотекой:
interval<Time>::type night_and_day(Time(monday, 20,00), Time(tuesday, 20,00));
interval<Time>::type day_and_night(Time(tuesday, 7,00), Time(wednesday, 7,00));
interval<Time>::type next_morning(Time(wednesday, 7,00), Time(wednesday,10,00));
interval<Time>::type next_evening(Time(wednesday,18,00), Time(wednesday,21,00));
// An interval set of type interval_set joins intervals that that overlap or touch each other.
interval_set<Time> joinedTimes;
joinedTimes.insert(night_and_day);
joinedTimes.insert(day_and_night); //overlapping in 'day' [07:00, 20.00)
joinedTimes.insert(next_morning); //touching
joinedTimes.insert(next_evening); //disjoint
cout << "Joined times :" << joinedTimes << endl;
и вывод этого алгоритма:
Joined times :[mon:20:00,wed:10:00)[wed:18:00,wed:21:00)
А вот о сложности их алгоритмов:
Сложность времени сложения