Вы можете использовать дерево интервалов, которое Википедия описывает как «древовидную структуру данных», которая «позволяет эффективно находить все интервалы, которые перекрываются с любым заданным интервалом или точкой» в O (log n + m ) время, где n - количество интервалов в дереве, а m - количество интервалов, найденных запросом.См. Подробности о том, как его реализовать.
Обратите внимание, что "интервалы" в дереве интервалов соответствуют тому, что вы описали как "события": a , b и т. Д. «Интервалы времени», на которые вы ссылаетесь (0–1 и т. Д.), Не нужны в подходе с интервальным деревом.
Однако все алгоритмы дерева имеют O (logn) поисков, так что я думаю, они не будут так эффективны при запросах?
log n меньше, чем вы думаете.Например, если n ≤ 10 9 (имеется в виду, до одного миллиарда интервалов), то log n <30. Так что для большинства реальных проблем,Алгоритм O (log <em>n ) можно рассматривать как алгоритм O (1).
(Кроме того, если говорить о производительности, мы говорим «эффективный», а не «эффективный».)