Введение
Структуры данных, используемые в пространственной индексации, – деревья R – это структуры данных, применяемые для пространственных методов доступа, то есть для индексации многомерной информации, такой как географические координаты, прямоугольники или многоугольники. Дерево R было предложено Антонином Гаттманом в 1984 году и получило широкое применение как в теоретических, так и в практических задачах. Типичным примером использования дерева R в реальном мире является хранение пространственных объектов, таких как местоположения ресторанов или полигоны, составляющие обычные карты: улицы, здания, контуры озер, береговые линии и т.п., а также быстрый поиск ответов на запросы, например: "Найти все музеи в радиусе 2 км от моего текущего местоположения", "получить все сегменты дорог в радиусе 2 км от моего местоположения" (для отображения в навигационной системе) или "найти ближайшую заправку" (не учитывая дорожную сеть). Дерево R также может ускорить поиск ближайших соседей, используя различные метрики расстояния, включая расстояние по дуге большого круга.
the data structure
R trees are tree data structures used for spatial access methods, i. e., for indexing multi dimensional information such as geographical coordinates, rectangles or polygons. The R tree was proposed by Antonin Guttman in 1984 and has found significant use in both theoretical and applied contexts. A common real world usage for an R tree might be to store spatial objects such as restaurant locations or the polygons that typical maps are made of: streets, buildings, outlines of lakes, coastlines, etc. and then find answers quickly to queries such as "Find all museums within 2 km of my current location", "retrieve all road segments within 2 km of my location" (to display them in a navigation system) or "find the nearest gas station" (although not taking roads into account). The R tree can also accelerate nearest neighbor search for various distance metrics, including great circle distance.
Идея R-дерева
Ключевая идея структуры данных состоит в том, чтобы группировать близлежащие объекты и представлять их минимальным ограничивающим прямоугольником на следующем, более высоком уровне дерева; "R" в R-дереве означает rectangle (прямоугольник). Поскольку все объекты находятся внутри этого ограничивающего прямоугольника, запрос, не пересекающий ограничивающий прямоугольник, также не может пересечь ни один из содержащихся в нем объектов. На уровне листьев каждый прямоугольник описывает один объект; на более высоких уровнях агрегация включает в себя все большее количество объектов. Это также можно рассматривать как все более грубое приближение набора данных. Подобно B-дереву, R-дерево также является сбалансированным деревом поиска (так что все листовые узлы находятся на одинаковой глубине), организует данные на страницах и предназначено для хранения на диске (как это делается в базах данных). Каждая страница может содержать максимальное количество записей, часто обозначаемое как *M*. Оно также гарантирует минимальную заполненность (за исключением корневого узла), однако наилучшая производительность достигается при минимальной заполненности 30–40% от максимального количества записей (B-деревья гарантируют 50% заполненности страницы, а B*-деревья – даже 66%). Это связано с более сложным балансированием, необходимым для пространственных данных по сравнению с линейными данными, хранящимися в B-деревьях. Как и в случае с большинством деревьев, алгоритмы поиска (например, пересечение, включение, поиск ближайшего соседа) относительно просты. Ключевая идея заключается в использовании ограничивающих прямоугольников для определения, следует ли выполнять поиск внутри поддерева. Таким образом, большинство узлов в дереве не считываются во время поиска. Как и B-деревья, R-деревья подходят для больших наборов данных и баз данных, где узлы могут быть подгружены в память по мере необходимости, и все дерево не может быть помещено в основную память. Даже если данные помещаются в память (или кэшируются), R-деревья в большинстве практических приложений обычно обеспечивают преимущества в производительности по сравнению с наивной проверкой всех объектов, когда их количество превышает несколько сотен. Однако для приложений, работающих в памяти, существуют аналогичные альтернативы, которые могут обеспечить немного лучшую производительность или быть проще в реализации. Для поддержки вычислений в памяти для R-дерева в компьютерном кластере, где вычислительные узлы соединены сетью, исследователи использовали RDMA (Remote Direct Memory Access) для реализации ресурсоемких приложений на основе R-дерева в распределенной среде. Этот подход масштабируется для все более крупных приложений и обеспечивает высокую пропускную способность и низкую задержку для R-дерева. Ключевая сложность R-дерева заключается в построении эффективного дерева, которое, с одной стороны, является сбалансированным (так что листовые узлы находятся на одной высоте), а с другой стороны, прямоугольники не покрывают слишком много пустого пространства и не перекрываются слишком сильно (чтобы во время поиска требовалось обрабатывать меньше поддеревьев). Например, первоначальная идея вставки элементов для получения эффективного дерева заключается в том, чтобы всегда вставлять в поддерево, которое требует наименьшего увеличения его ограничивающего прямоугольника. Когда страница заполнена, данные разделяются на два набора, каждый из которых должен покрывать минимальную площадь. Большинство исследований и улучшений для R-деревьев направлены на улучшение способа построения дерева и могут быть сгруппированы в две цели: построение эффективного дерева с нуля (известное как массовая загрузка) и внесение изменений в существующее дерево (вставка и удаление). R-деревья не гарантируют хорошую производительность в худшем случае, но обычно хорошо работают с реальными данными. Вариант R-дерева Priority R (с массовой загрузкой), хотя и является оптимальным в худшем случае, из-за повышенной сложности пока не получил широкого распространения в практических приложениях. Когда данные организованы в R-дереве, соседи в пределах заданного расстояния *r* и *k* ближайших соседей (для любой Lp-нормы) всех точек могут быть эффективно вычислены с помощью пространственного соединения. Это полезно для многих алгоритмов, основанных на таких запросах, например, для Local Outlier Factor (фактора локальных выбросов). DeLi Clu, Density Link Clustering (кластеризация на основе связей плотности) – это алгоритм анализа кластеров, который использует структуру R-дерева для аналогичного пространственного соединения для эффективного вычисления кластеризации OPTICS.
Схема расположения данных
Данные в R-деревьях организованы на страницах, которые могут содержать переменное количество записей (до заранее определенного максимума и, как правило, больше минимального заполнения). Каждая запись во внутреннем узле хранит два элемента данных: способ идентификации дочернего узла и ограничивающий прямоугольник для всех записей в этом дочернем узле. В листовых узлах хранятся данные, необходимые для каждого элемента, часто точка или ограничивающий прямоугольник, представляющие элемент, и внешний идентификатор этого элемента. Для точечных данных записи в листовых узлах могут содержать непосредственно сами точки. Для данных о многоугольниках (которые часто требуют хранения больших многоугольников) обычно хранят только MBR (минимальный ограничивающий прямоугольник) многоугольника вместе с уникальным идентификатором в дереве.