Если диапазоны перекрываются, и кто-то хочет извлечь все диапазоны, которые перекрывают (или содержат) заданный целевой диапазон, большинство из приведенных выше решений не работают.
Как указали некоторые, если (наихудший случай) все диапазоны пересекают целевой диапазон (например, если целевой диапазон равен {0..MAXINT} или подобному), то из Конечно, требуется O (n), чтобы вернуть n диапазонов.
Но разве не интересный и типичный / средний случай, когда только очень маленький% от n общих диапазонов пересекают целевой диапазон? Позвоните по номеру, который do пересекает «m» - в этом случае вы, вероятно, сможете сделать так же, как O (m). А если n = 10 ^ 9 и m = 10, это разница «сделай или сломай».
Рассмотрим простой случай текстового документа, в котором различные области размечены для их «типа» - возможно, вы хотите найти все размеченные единицы, которые содержат или пересекают данный непрерывный диапазон текста (например, параграф). В HTML, XML или подобных им могут быть только предки текстовых узлов, содержащих хотя бы несколько символов целевого диапазона. В типичных представлениях с родительскими указателями в каждом узле это O (m) - намного лучше, чем O (n), особенно потому, что m (для коротких или синхронных целевых диапазонов) просто глубина вложения дерева, которая имеет тенденцию быть даже ниже, чем ln (n), потому что большие XML-документы на практике становятся глубже, а не глубже.
Интересный случай сложнее: что если ваши «элементы» не образуют дерево, как в XML, но могут перекрываться, как в MECS, CLIX, LMNL и некоторых других системах? Вы все еще хотите найти все регионы / "элементы", которые перекрывают вашу цель, но их не так легко организовать.
С другой стороны, у вас должно получиться очень хорошо, потому что диапазоны разметки во многих приложениях чаще всего малы - в книге гораздо больше слов, предложений и параграфов, чем глав. Поэтому, хотя может быть огромное количество диапазонов, которые начинаются до цели, и огромное количество, которые заканчиваются после нее, пересечение будет в среднем очень маленьким.
Я думаю, что это то, к чему стремился первоначальный спрашивающий, и я боюсь, что не увидел ответа, который решает эту проблему. Если это не то, о чем был первоначальный вопрос, то я бы хотел сформулировать его как новый вопрос.