Сразу картинка: http://savepic.su/3080903.jpg
Задача: найти все, которых «зацепил» зелёный диапазон. По вертикали разнесены для наглядности, вертикальной системы координат нет, система координат 1-мерная.
Другими словами: Есть 1-мерная система координат. На ней валяется множество отрезков разной длины, которые могут пересекаться, содержать друг друга, лежать без пересечений. Минимальная длина отрезка - 0 (точка), хотя если это упростит алгоритм, пускай будет 1. Правда, начинаться в одной точке они не могут, но это наверное не так важно.
Спасибо. Можно советовать в виде C++ - библиотек.
P.S. Напишу, какие возникали мысли. Мысли дошли до R-подобных деревьев, но пока не сформировались во что-то интересное.
Допустим, наш зелёный отрезок - это [G1, G2]. В данный момент у меня все отрезки хранятся в двусвязном списке, упорядоченном по началу этих отрезков. Ну, типа std::list, только своя боянная реализация. Ну, чтобы быстро вставлять в середину и не надо было двигать ничего в памяти. Казалось бы, можно найти в списке первый отрезок, начинающийся после G1 и дальше до G2 нам будут встречаться отрезки, интересные нам. После G2 интересные нам отрезки гарантированно заканчиваются. Ну, для ускорения поиска первого отрезка после G1, можно ещё какое-нибудь двоичное дерево посадить неподалёку.
А что делать с отрезками, которые успели начаться до G1, но закончились после? То есть, мы видим их хвост и нам они тоже интересны. Можно зафигачить какую-нибудь структуру, в которой хранить ещё хвосты. И в этой структуре быстро находить все хвосты после G1.