Структура данных для определения пересечения прямоугольника с большим набором прямоугольников

Мой набор данных состоит из множества прямоугольников, лежащих в плоскости x, y (представленной набором четырех точек). В 99,9% случаев эти прямоугольники не перекрываются, но очень редко. Я пытаюсь найти оптимальную структуру данных для хранения прямоугольников, чтобы я мог найти случаи пересечения.

Кстати, прямоугольники содержат текст, поэтому я делаю это для того, чтобы найти совпадения одного и того же текста. Это потому, что такие вхождения следует рассматривать как один прямоугольник текста вместо двух.

Например: допустим, я ищу текст «123». Есть два прямоугольника. Первый прямоугольник содержит «ТЕСТ 123», а второй - «123». Если «123» перекрывается с «123» в первом прямоугольнике (в пределах заданного порогового значения), тогда мой результат поиска должен возвращать только одно вхождение текста «123».

До сих пор я вкратце рассмотрел квадродеревья, r-деревья, k-d деревья и деревья диапазонов. Я мало знаю об этих деревьях, и я не знаю, подойдет ли какое-либо из них для решения этой проблемы. Я чувствую, что r-дерево не было бы оптимальным в этом случае, потому что вероятность перекрытия очень мала.


person user2481095    schedule 24.08.2016    source источник
comment
Вы нашли какое-нибудь решение для этого?   -  person Akshay    schedule 13.02.2020


Ответы (1)


Я понимаю, что вы не хотите, чтобы индекс выполнял какое-либо распознавание текста, он действительно должен обнаруживать только перекрывающиеся (выровненные по оси) прямоугольники. Иногда это называют операцией «пространственного соединения».

Насколько мне известно, существует очень мало специализированных алгоритмов, за исключением, возможно, алгоритма TOUCH (оптимизированный R- Дерево, кажется). Поэтому я бы использовал метод грубой силы, выполняя для каждого прямоугольника один запрос окна в вашем наборе данных.

Есть много возможных алгоритмов, основанных на пространственных индексах. Это зависит от ваших требований (за исключением того, что kd-деревья обычно работают только для точек, а не для прямоугольников).

  1. Менее 100 прямоугольников или около того? Тогда любой индекс должен быть в порядке.
  2. Вам нужно обновить набор данных в какой-то момент? Или можно загрузить все сразу, а затем выполнить поиск?
  3. Вы хотите сохранить индекс на диске или он будет в памяти?

Для диска обычно рекомендуются варианты R-Tree, такие как R * tree или X-tree. Однако R-деревья, как правило, хуже работают с обновлениями, но обычно используются с начальной массовой загрузкой. Запросы Windows в R-Tree обычно лучше работают с большими наборами результатов, но это может зависеть от фактического набора данных.

Quadtrees должны подходить для вашего «разреженного» набора данных, они также просты в реализации, но требуют много памяти и не идеальны для использования на диске.

Если вы используете Java, взгляните на мое PH-Tree, оно немного похоже на дерево квадрантов, но гораздо более эффективно использует пространство и очень хорошо работает с большими наборами данных, поддерживает обновления и имеет очень быстрые оконные запросы, особенно если наборы результатов малы (0 или 1 результат). Это может быть именно то, что вам нужно, за исключением того, что его довольно сложно реализовать (моя версия лицензирована для Java и Apache v2), и в настоящее время нет эффективного способа сохранить его на диске.

person TilmannZ    schedule 25.08.2016