R-дерево¶
R-дерево (R-tree) — это древовидная структура данных, предназначенная для эффективной организации и доступа к многомерным пространственным объектам (точкам, линиям, полигонам). Относится к классу сбалансированных деревьев, обобщающих B-деревья на многомерное пространство. R-деревья обеспечивают быстрый поиск, вставку и удаление объектов, хранящихся в виде минимальных ограничивающих прямоугольников (MBB — Minimum Bounding Box), которые вложены друг в друга по иерархическому принципу.
¶История
R-дерево было предложено в 1984 году Антонином Гуттманом (Antonin Guttman) в статье «R-Trees: A Dynamic Index Structure for Spatial Searching» (опубликована в журнале ACM SIGMOD). Разработка была мотивирована необходимостью эффективного индексирования пространственных данных в базах данных и геоинформационных системах (ГИС). До появления R-деревьев для многомерных запросов использовались такие структуры, как kd-деревья и квадродеревья, однако они не обеспечивали сбалансированности и динамического обновления в условиях частых вставок и удалений.
В 1990-х годах были предложены многочисленные модификации R-дерева: R*-дерево (1990, Норберт Бекманн и др.), R+-дерево (1987, Тимос Селлес и др.), Hilbert R-tree (1994, И. Камель и К. Фалаутос). Эти варианты улучшали производительность при различных типах запросов — пространственных соединениях, поиске ближайших соседей, обработке динамических данных. К началу 2000-х годов R-деревья стали стандартом де-факто для индексации пространственных данных в реляционных СУБД (PostgreSQL, Oracle Spatial, SQL Server) и ГИС-платформах (QGIS, ArcGIS).
¶Принцип построения и структура
R-дерево представляет собой иерархическую структуру, в которой каждый узел соответствует прямоугольной области в пространстве. Листовые узлы содержат ссылки на реальные объекты и их минимальные ограничивающие прямоугольники. Внутренние узлы содержат записи, каждая из которых состоит из MBB дочернего узла и указателя на него. MBB дочернего узла полностью охватывает все MBB его потомков.
¶Основные параметры
- M — максимальное количество записей в узле (обычно от 4 до 100, в зависимости от реализации и размера страницы памяти).
- m — минимальное количество записей в узле (обычно M/2). Это обеспечивает сбалансированность дерева и предотвращает чрезмерное ветвление.
¶Свойства
- Высота дерева для N объектов составляет O(log N) при условии сбалансированности.
- Все листовые узлы находятся на одном уровне (глубине).
- MBB узлов могут перекрываться, что является отличительной чертой R-деревьев (в отличие от R+-деревьев, где перекрытие запрещено).
¶Операции
¶Вставка
Алгоритм вставки выбирает подходящий листовой узел, минимизируя увеличение площади MBB. Используется эвристика выбора поддерева с наименьшим приростом площади. Если узел переполняется (количество записей превышает M), он разделяется на два узла с помощью алгоритма разделения (например, линейного или квадратичного). Разделение может вызвать каскадное разделение вверх по дереву.
¶Удаление
Удаление объекта сначала находит его в листовом узле, затем удаляет запись. Если после удаления количество записей в узле становится меньше m, узел «сжимается»: его записи перераспределяются между соседними узлами, а сам узел удаляется. Это может привести к перестройке части дерева.
¶Поиск
Поиск выполняется рекурсивно: начиная с корня, проверяются все дочерние узлы, MBB которых пересекается с областью запроса (например, прямоугольником или точкой). Для поиска всех объектов, попадающих в заданную область, требуется обход всех поддеревьев, MBB которых пересекаются с запросом. В худшем случае (при сильном перекрытии MBB) может потребоваться обход значительной части дерева.
¶Модификации и варианты
¶R*-дерево
R*-дерево (R-star tree) — наиболее распространённая модификация, предложенная в 1990 году. Отличается от классического R-дерева улучшенными эвристиками при вставке:
- Минимизация не только площади, но и перекрытия MBB.
- Принудительное перераспределение записей при переполнении (forced reinsert).
- Выбор поддерева по критерию минимального перекрытия с соседними узлами.
R*-дерево обеспечивает лучшее качество построения (меньшее перекрытие MBB) и более высокую производительность запросов, особенно при большом количестве объектов.
¶R+-дерево
R+-дерево (R-plus tree) запрещает перекрытие MBB на одном уровне. Для этого объекты могут дублироваться в нескольких узлах, если их MBB пересекают границы. Это упрощает поиск (не нужно проверять несколько узлов) и улучшает производительность для точечных запросов, но увеличивает объём хранимых данных и усложняет вставку.
¶Hilbert R-tree
Hilbert R-tree использует кривую Гильберта для сортировки объектов перед построением дерева. Это позволяет получить детерминированное и компактное дерево с минимальным перекрытием MBB. Hilbert R-tree особенно эффективен для запросов на поиск ближайших соседей и пространственных соединений.
¶Другие варианты
- R-tree с сортировкой по страницам (Sort-Tile-Recursive, STR) — метод построения дерева снизу вверх, обеспечивающий высокую производительность для статических данных.
- R-tree с динамическим разделением (Dynamic R-tree) — адаптивные алгоритмы для потоковых данных.
- R-tree для временных рядов (Spatio-temporal R-tree) — расширение для объектов, изменяющихся во времени.
¶Применение
R-деревья широко используются в системах, где требуется быстрый пространственный поиск:
- Геоинформационные системы (ГИС) — индексация картографических данных (дороги, здания, участки), поиск объектов в заданном радиусе или прямоугольнике.
- Базы данных пространственных данных — PostgreSQL (расширение PostGIS), Oracle Spatial, SQL Server (пространственные индексы), MongoDB (2dsphere-индекс).
- Компьютерная графика — ускорение трассировки лучей (ray tracing), обнаружение коллизий, отбор видимых объектов.
- Робототехника и навигация — планирование маршрутов, поиск препятствий, обработка данных с лидаров.
- Биоинформатика — поиск пространственных конфигураций молекул, анализ структур белков.
- Системы управления версиями — индексация изменений в файловых системах (например, Git).
¶Производительность и ограничения
¶Достоинства
- Сбалансированность и предсказуемая высота (O(log N)).
- Динамическое обновление (вставка/удаление без перестроения всего дерева).
- Эффективность для запросов с небольшими областями (например, поиск в радиусе 1 км).
¶Недостатки
- Перекрытие MBB может приводить к деградации производительности при большом количестве объектов или неравномерном распределении.
- Трудоёмкость разделения узлов (алгоритмы разделения имеют сложность O(M²) в худшем случае).
- Неэффективность для высокоразмерных данных (более 10–20 измерений) из-за «проклятия размерности» — перекрытие MBB становится почти полным, и поиск вырождается в полный перебор.
- Сложность реализации (особенно для R*-дерева с принудительной перевставкой).
¶Примеры реализации
- PostgreSQL / PostGIS — реализация R-дерева (GIST-индекс) с поддержкой R*-дерева.
- SQLite — модуль RTree для пространственных индексов.
- Boost.Geometry — библиотека C++ с реализацией R-дерева.
- Python — библиотека
rtree(обёртка над libspatialindex),pyqgis(для QGIS). - Java — библиотека JSI (Java Spatial Index).
¶Интересные факты
- R-дерево — одна из немногих структур данных, названных в честь буквы (R — от «Rectangle» или «Region»), а не фамилии автора.
- В 2010-х годах R-деревья были вытеснены из некоторых областей (например, трассировки лучей) более эффективными структурами, такими как BVH (Bounding Volume Hierarchy), но остаются стандартом для баз данных.
- В России R-деревья активно используются в ГИС-системах для управления земельными ресурсами и кадастрового учёта (например, в программном комплексе «ГеоПоиск»).
¶Источники
- Guttman A. R-Trees: A Dynamic Index Structure for Spatial Searching. ACM SIGMOD, 1984.
- Beckmann N., Kriegel H.-P., Schneider R., Seeger B. The R-tree: An Efficient and Robust Access Method for Points and Rectangles*. ACM SIGMOD, 1990.
- Sellis T., Roussopoulos N., Faloutsos C. The R+-tree: A Dynamic Index for Multi-dimensional Objects. VLDB, 1987.
- Kamel I., Faloutsos C. Hilbert R-tree: An Improved R-tree using Fractals. VLDB, 1994.
- Samet H. Foundations of Multidimensional and Metric Data Structures. Morgan Kaufmann, 2006.
- PostGIS Documentation: Spatial Indexing.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →

