Я бы предложил структуру в памяти, которая имеет время начала, время окончания, # события ... (Это упрощается как время (часы), но использование времени unix дает вторую точность)
Для каждого события вы вставляете новое событие как есть, если нет перекрытия, в противном случае найдите перекрытие и разделите событие на (до 3) частей, которые могут перекрываться, например, данные вашего примера, начиная первое событие:
Событие 1 начинается в 3 часа ночи и заканчивается в 10 часов утра. Просто добавьте событие, так как нет совпадений:
3,10,1
Событие 2 начинается в 5:00 и заканчивается в 9:00: перекрытия, поэтому разделите оригинал и добавьте новый с дополнительным «#events»
3,5,1
5,9,2
9,10,1
Событие 3 начинается в 7:00 и заканчивается в 9:00: также перекрывается, проделайте то же самое со всеми периодами:
3,5,1
5,7,2
7,9,3
9,10,1
Итак, вычисляем часы перекрытия на # события:
1 event= (5-3)+(10-9)=3 hours
2 events = 7-5 = 2 hours
3 events = 9-7 = 2 hours
Имеет смысл запустить это как фоновый процесс, если есть много событий для сравнения.