Я работаю над личным проектом, связанным с вычислительной геометрией. Вопрос в заголовке - это абстракция одной из небольших подзадач, которую я пытаюсь, но изо всех сил пытаюсь решить эффективно. Надеюсь, он достаточно общий, чтобы быть полезным не только мне!
Проблема
Представьте, что у нас есть набор S прямоугольников на плоскости, все из которых имеют края, параллельные осям координат (без поворотов). В моей проблеме мы предполагаем, что пересечения прямоугольников очень распространены. Но они также очень хороши: если два прямоугольника пересекаются, мы можем предположить, что один из них всегда полностью содержит другой. Так что нет «частичного» перекрытия.
Я хочу сохранить эти прямоугольники таким образом, чтобы:
- Мы можем эффективно добавлять новые прямоугольники.
- Учитывая точку запроса (x, y), мы можем эффективно сообщить о прямоугольнике наименьшей области, которая содержит точку.
Иллюстрация дает мотивацию для последнего. Мы всегда хотим найти прямоугольник с наиболее глубокой вложенностью, содержащий точку запроса, так что это всегда одна из самых маленьких областей.
Мои мысли
Итак, я знаю, что и R-Trees, и Quad-Trees часто используются для задач пространственного индексирования, и действительно, в некоторых случаях оба могут хорошо работать. Проблема с R-Trees заключается в том, что в худшем случае они могут ухудшиться до линейной производительности.
Я думал о построении набора сбалансированных бинарных деревьев на основе вложенности. Левое поддерево узла r содержит все прямоугольники, находящиеся внутри прямоугольника r. Правое поддерево содержит все прямоугольники, внутри которых находится r. В проиллюстрированном примере будет три дерева.
Но что, если ни один из прямоугольников не вложен? Затем вам нужно O (n) деревьев из 1 элемента, и снова у нас есть что-то, что работает так же плохо, как линейное сканирование по ящикам.
Как я могу решить эту проблему таким образом, чтобы в худшем случае у нас было асимптотически сублинейное время? Даже если это означает потерю производительности в лучшем случае или требований к хранилищу. (Я предполагаю, что для такой проблемы может потребоваться поддерживать две структуры данных, и это круто)
Я уверен, что конкретный способ пересечения прямоугольников должен помочь решить эту проблему. На самом деле, мне это кажется кандидатом на логарифмическую производительность, но я просто никуда не денусь.
Заранее благодарим за любые идеи!