Jump to content

PH-дерево

PH-дерево
Тип дерево, карта
Изобретенный 2014
Временная сложность в обозначении большого О
Операция Средний Худший случай
Поиск О( вход ) О( вход )
Вставлять О( вход ) О( вход )
Удалить О( вход ) О( вход )
Пространственная сложность
Космос На ) На )

PH -дерево [1] — это древовидная структура данных, используемая для пространственной индексации многомерных данных (ключей), таких как географические координаты, точки, векторы объектов , прямоугольники или ограничивающие рамки . PH-дерево — это индекс разделения пространства. [2] со структурой, аналогичной структуре квадродерева или октодерева . [3] Однако, в отличие от квадродеревьев, он использует политику разделения, основанную на попытках и аналогичную битовым деревьям критического значения , которая основана на битовом представлении ключей. Политика побитового разделения в сочетании с использованием различных внутренних представлений узлов обеспечивает масштабируемость при работе с многомерными данными. Политика разделения битового представления также устанавливает максимальную глубину, что позволяет избежать вырожденных деревьев и необходимости повторной балансировки. [1]

Обзор [ править ]

Базовое PH-дерево представляет собой пространственный индекс, который сопоставляет ключи, представляющие собой d -мерные векторы с целыми числами, в определенные пользователем значения. PH-дерево является многомерным обобщением битового дерева Crit в том смысле, что битовое дерево Crit эквивалентно PH-дереву с -мерные ключи. Как и битовое дерево Crit, и в отличие от большинства других пространственных индексов, PH-дерево представляет собой карту, а не мультикарту . [1] [4]

d - мерное PH-дерево — это дерево узлов, в котором каждый узел разделяет пространство, разделяя его на квадранты (см . ниже , как масштабируются потенциально большие узлы с многомерными данными). Каждый квадрант содержит не более одной записи : либо пару ключ-значение (листовой квадрант), либо пару ключ-подузел. Для пары ключ-подузел ключ представляет центр подузла. Ключ также является общим префиксом (битовым представлением) всех ключей в подузле и его дочерних подузлах. Каждый узел имеет как минимум две записи, в противном случае он объединяется с родительским узлом. [1]

Некоторые другие структурные свойства PH-деревьев: [1]

  • Они есть - и деревья.
  • Они по своей сути несбалансированы , но дисбаланс ограничен, поскольку их глубина ограничена разрядностью ключей, например 32 для -мерный ключ с 32-битными целыми числами.
  • Операции вставки или удаления приводят к изменению ровно одного узла и, возможно, к добавлению или удалению второго узла. Это может быть полезно для параллельных реализаций. Это также означает небольшое изменение стоимости модификации.
  • Их структура не зависит от порядка вставки/удаления.

Стратегия разделения [ править ]

Подобно большинству квадродеревьев , PH-дерево представляет собой иерархию узлов, в которой каждый узел разбивает пространство во всех d измерениях. [1] Таким образом, узел может иметь до подузлы, по одному на каждый квадрант.

Адресация гиперкуба с помощью битовых строк

Нумерация квадрантов [ править ]

PH-дерево использует биты многомерных ключей для определения их положения в дереве. Все ключи, имеющие одинаковые ведущие биты, хранятся в одной и той же ветви дерева. [1]

Например, в узле на уровне L , чтобы определить квадрант, куда следует вставить ключ (или удалить его, или найти), он смотрит на бит L каждого измерения ключа. Для трехмерного узла с 8 квадрантами (формирующими куб) бит L первого измерения ключа определяет, находится ли целевой квадрант слева или справа от куба, бит L второго измерения определяет находится ли он спереди или сзади, и . бит третьего измерения L определяет низ или верх, см. рисунок

Пример PH-дерева с добавленными тремя ключами, в результате чего образуются два узла. Корневой узел (красный) и подузел (синий).

1D пример [ править ]

Пример с тремя одномерными ключами с 8-битными значениями: , и . Добавление и в пустое дерево приводит к одному узлу. Два ключа сначала отличаются своим 6-м битом, поэтому узел имеет уровень (начиная с 0). Узел имеет 5-битный префикс, представляющий общие 5 битов обоих ключей. Узел имеет два квадранта, каждый ключ хранится в одном квадранте. Добавление третьего ключа приводит к появлению одного дополнительного узла в с одним квадрантом, содержащим исходный узел в качестве подузла, а другой квадрантом, содержащим новый ключ . [ нужна ссылка ]

Пример PH-дерева с двумя 2D-ключами в одном узле

2D-пример [ править ]

Благодаря 2D-ключам каждый узел имеет квадранты. Положение квадранта, в котором хранится ключ, извлекается из соответствующих битов ключей, по одному биту от каждого измерения. Четыре квадранта узла образуют двумерный гиперкуб (квадранты могут быть пустыми). Биты, извлеченные из ключей, образуют адрес гиперкуба. , для и для . фактически является положением квадранта в гиперкубе узла. [ нужна ссылка ]

Структура узла [ править ]

Порядок записей в узле всегда соответствует Z-порядку . Записи в узле могут, например, храниться в массивах фиксированного размера размером . h тогда фактически является индексом массива квадранта. Это позволяет искать, вставлять и удалять с помощью и нет необходимости хранить h . Однако космическая сложность на узел, поэтому он менее подходит для данных большой размерности. [1]

Другое решение — хранить записи в отсортированной коллекции, например в динамических массивах и/или B-деревьях . Это замедляет операции поиска до но снижает потребление памяти до . [1]

Исходная реализация была нацелена на минимальное потребление памяти за счет переключения между фиксированным и динамическим представлением массива в зависимости от того, какое из них использует меньше памяти. [1] Другие реализации [1] [2] не переключаются динамически, а используют фиксированные массивы для , динамические массивы для и B-деревья для данных большой размерности.

Операции [ править ]

Операции поиска , вставки и удаления работают очень похоже: найдите правильный узел, затем выполните операцию над ним. Оконные запросы и поиск k -ближайших соседей более сложны.

Поиск [ править ]

Операция поиска определяет, существует ли ключ в дереве. Он проходит по дереву и проверяет каждый узел, содержит ли он подузел-кандидат или пользовательское значение, соответствующее ключу. [1]

function lookup(key) is
    entry ← get_root_entry()    // if the tree is not empty the root entry contains a root node
    while entry != NIL && entry.is_subnode() do 
        node ← entry.get_node()
        entry ← node.get_entry(key)  
    repeat
return entry                    // entry can be NIL
function get_entry(key) is
    node ← current node
    h ← extract_bits_at_depth(key, node.get_depth()}
    entry ← node.get_entry_at(h)  
return entry                    // entry can be NIL

Вставить [ править ]

Операция Insert вставляет в дерево новую пару ключ-значение, если только ее ключ еще не существует. Эта операция проходит по дереву, как функция поиска , а затем вставляет ключ в узел. Есть несколько случаев, которые следует учитывать: [1]

  1. Квадрант пуст, и мы можем просто вставить в него новую запись и вернуться.
  2. Квадрант содержит запись пользователя с ключом, идентичным новой записи. Один из способов справиться с таким конфликтом — вернуть флаг, указывающий на неудачную вставку. Если дерево реализовано как мультикарта с коллекцией в качестве записи узла, новое значение добавляется к этой коллекции.
  3. Квадрант содержит запись (запись пользователя или запись подузла) с другим ключом. В этом случае требуется заменить существующую запись новым подузлом, содержащим старую и новую записи.
function insert(node, key, value)
    level ← node.get_level()            // Level is 0 for root
    h ← extract_bits_at_level(key, level)
    entry ← node.get_entry(h)
    if entry == NIL then
        // Case 1.
        entry_new ← create_entry(key, value)
        node.set_entry(h, entry_new)       
    else if !entry.is_subnode() && entry.get_key() == key then
       // Case 2. Collision, there is already an entry
       return ← failed_insertion        
    else
        // Case 3.
        level_diff ← get_level_of_difference(key, entry.get_key()) 
        entry_new ← create_entry(key, value)
        // new subnode with existing entry and new entry
        subnode_new ← create_node(level_diff, entry, entry_new) 
        node.set_entry(h, subnode_new)     
    end if
return

Удалить [ править ]

Удаление работает обратно по отношению к вставке, с дополнительным ограничением, заключающимся в том, что любой подузел должен быть удален, если осталось менее двух записей. Оставшаяся запись перемещается в родительский узел. [1]

Оконные запросы [ править ]

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

function query(node, min, max, result_list) is
    foreach entry ← node.get_entries() do
        if entry.is_subnode() then
            if entry.get_prefix() >= min and entry.get_prefix() <= max then
                query(entry.get_subnode(), min, max, result_list)
            end if
        else
            if entry.get_key() >= min and entry.get_key() <= max then
                result_list.add(entry)
            end if
        end if
    repeat
return

Чтобы точно оценить сложность времени запроса, анализ должен включать размерность . Обходя и сравнивая все записи в узле имеют временную сложность потому что каждое сравнение -мерный ключ с берет время. Поскольку узлы могут иметь до записи, это плохо масштабируется с увеличением размерности . Существуют различные способы улучшения этого подхода, используя адрес гиперкуба h . [4]

Мин. ч и макс. ч [ править ]

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

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

и затем представьте самое низкое и самое высокое в узле, который необходимо пройти. Квадранты с или не пересекаются с полем запроса. Доказательство доступно в. [4] Благодаря этому приведенную выше функцию запроса можно улучшить до:

function query(node, min, max, result_list) is
    h_min ← calculate h_min
    h_max ← calculate h_max
    for each entry ← node.get_entries_range(h_min, h_max) do
        [ ... ]
    repeat
return

Расчет и является . В зависимости от распределения занятых квадрантов в узле этот подход позволит избежать от «нет» до почти всех ключевых сравнений. Это уменьшает среднее время обхода, но результирующая сложность по-прежнему остается низкой. . [4]

Проверьте квадранты на совпадение с полем запроса [ править ]

Между и все еще могут быть квадранты, которые не перекрываются с полем запроса. Идея: и каждый имеет один бит для каждого измерения, который указывает, перекрывается ли поле запроса с нижней/верхней половиной узла в этом измерении. Это можно использовать для быстрой проверки того, является ли квадрант перекрывается с полем запроса без необходимости сравнения -пространственные ключи: квадрант перекрывается с полем запроса, если для каждого ` ` немного вошел есть соответствующий ` ` немного вошел и для каждого ` ` немного вошел есть соответствующий ` ` немного вошел . Таким образом, на ЦП с 64-битными регистрами можно проверить перекрытие до -мерные ключи в . [4]

function is_overlap(h, h_min, h_max) is
return (h | h_min) & h_max == h            // evaluates to 'true' if quadrant and query overlap.
function query(node, min, max, result_list) is
    h_min ← calculate h_min
    h_max ← calculate h_max
    for each entry ← node.get_entries_range(h_min, h_max) do
        h ← entry.get_h();
        if (h | h_min) & h_max == h then   // evaluates to 'true' if quadrant and query overlap.
           [ ... ]
        end if
    repeat
return

Результирующая временная сложность равна по сравнению с полной итерации. [4]

Обход квадрантов, пересекающихся с полем запроса [ править ]

Для более высоких измерений с более крупными узлами также можно избежать повторения всех и вместо этого напрямую рассчитать следующую более высокую который перекрывается с полем запроса. Первый шаг ставит ` `-биты в заданное для всех квадрантов, которые не пересекаются с полем запроса. Второй шаг увеличивает адаптированный и добавленный ` `-биты вызывают переполнение, так что непересекающиеся квадранты пропускаются. Последний шаг удаляет все нежелательные биты, используемые для запуска переполнения. Логика подробно описана в . [4] Расчет работает следующим образом:

function increment_h(h_input, h_min, h_max) is
    h_out = h_input | (~ h_max )        // pre - mask
    h_out += 1                          // increment
    h_out = ( h_out & h_max ) | h_min   // post - mask
return h_out

Опять же, для это можно сделать на большинстве процессоров в . Результирующая временная сложность прохождения узла равна . [4] Это работает лучше всего, если большая часть квадрантов, пересекающихся с полем запроса, занята записью.

k- ближайшие соседи [ править ]

Поиск k ближайших соседей может быть реализован с использованием стандартных алгоритмов. [5]

Клавиши с плавающей запятой [ править ]

PH-дерево может хранить только целочисленные значения. Значения с плавающей запятой можно легко сохранить как целые числа, приведя их к целым числам. Однако авторы также предлагают подход без потери точности. [1] [4]

Преобразование без потерь [ править ]

Преобразование значения с плавающей запятой без потерь в целое значение (и обратно) без потерь, если точность может быть достигнута путем простой интерпретации 32 или 64 бит значения с плавающей запятой как целое число (с 32 или 64 битами). Благодаря тому, как IEEE 754 кодирует значения с плавающей запятой, результирующие целочисленные значения имеют тот же порядок, что и исходные значения с плавающей запятой, по крайней мере, для положительных значений. Упорядочение отрицательных значений может быть достигнуто путем инвертирования беззнаковых битов. [1] [4]

Пример реализации на Java :

long encode(double value) {
    long r = Double.doubleToRawLongBits(value);
    return (r >= 0) ? r : r ^ 0x7FFFFFFFFFFFFFFFL;
}

Пример реализации на C++ :

std::int64_t encode(double value) {
    std::int64_t r;
    memcpy(&r, &value, sizeof(r));
    return r >= 0 ? r : r ^ 0x7FFFFFFFFFFFFFFFL;
}

Кодирование (и обратное декодирование) осуществляется без потерь для всех значений с плавающей запятой. Порядок хорошо работает на практике, в том числе и . Однако целочисленное представление также превращается в нормальное сравнимое значение (меньше бесконечности), бесконечности сравнимы друг с другом и больше, чем . [6] Это означает, что, например, диапазон запроса будет не соответствовать значению . Чтобы соответствовать диапазон запроса должен быть . [ нужна ссылка ]

Клавиши гипербокса [ править ]

Чтобы хранить объемы (гиперблоки, выровненные по осям) в качестве ключей, реализации обычно используют угловое представление. [7] который преобразует два -размерные минимальные и максимальные углы коробки в единый ключ с размеры, например, путем их чередования: .

Это тривиально работает для операций поиска, вставки и удаления. Оконные запросы необходимо преобразовать из -мерные векторы в -мерные векторы. Например, для запроса окна, который соответствует всем полям, полностью находящимся внутри поля запроса, ключи запроса: [7] [8]

Для операции запроса окна, которая соответствует всем полям, пересекающимся с полем запроса, ключи запроса: [8]

Масштабируемость [ править ]

В больших размерах с менее чем записей, PH-дерево может иметь только один узел, эффективно «вырождаясь» в B-дерево с кривой Z-порядка . Операции добавления/удаления/поиска остаются и оконные запросы могут использовать фильтры квадрантов . Однако это не может избежать проклятия размерности для данных большой размерности с или PH-дерево лишь незначительно лучше полного сканирования. [9]

Использует [ править ]

Исследования сообщили о быстрых операциях добавления/удаления/точного сопоставления с большими и быстро меняющимися наборами данных. [10] Было показано, что оконные запросы работают хорошо, особенно для небольших окон. [11] или большой набор данных [12]

PH-дерево в основном подходит для использования в памяти. [10] [13] [14] Размер узлов (количество записей) фиксирован, в то время как постоянное хранилище имеет тенденцию использовать индексы с настраиваемым размером узла, чтобы согласовать размер узла с размером страницы на диске. Это проще сделать с другими пространственными индексами, такими как R-Trees .

Реализации [ править ]

См. также [ править ]

Внешние ссылки [ править ]

Ссылки [ править ]

  1. ^ Jump up to: Перейти обратно: а б с д и ж г час я дж к л м н тот п Зешке, Тилманн; Циммерли, Кристоф; Норри, Мойра К. (июнь 2014 г.). «PH-дерево» . Материалы Международной конференции ACM SIGMOD 2014 по управлению данными . стр. 397–408. дои : 10.1145/2588555.2588564 . ISBN  9781450323765 . S2CID   6862850 . Проверено 10 февраля 2022 г.
  2. ^ Куахла, З.; Бенразек, А.-Э.; Ферраг, Массачусетс; Фару, Б.; Сериди, Х.; Курулай, М.; Анджум, А.; Ашералиева, А. (2022). «Обзор индексирования больших данных Интернета вещей: потенциальные решения, последние достижения и открытые проблемы» . Будущий Интернет . 14 (1): 19. дои : 10.3390/fi14010019 .
  3. ^ Махмуд, Арканзас; Пунни, С.; Ареф, РГ (2018). «Пространственно-временные методы доступа: опрос (2010 – 2017)». Геоинформатика . 23 (1): 1–36. дои : 10.1007/s10707-018-0329-2 . S2CID   106407322 .
  4. ^ Jump up to: Перейти обратно: а б с д и ж г час я дж Зешке, Тилманн; Норри, Мойра (2017). «Эффективный Z-упорядоченный обход индексов гиперкуба». Системы баз данных для бизнеса, технологий и Интернета (кстати, 2017) . Конспекты лекций по информатике. Том П-265. Бонн: Общество информатики. стр. 465–484. doi : 10.3929/ethz-a-010802003 . ISBN  9783885796596 .
  5. ^ Хьялтасон, Гисли Р.; Самет, Ханан (июнь 1999 г.). «Дистанционный просмотр в пространственных базах данных» . Транзакции ACM в системах баз данных . 24 (2): 265–318. дои : 10.1145/320248.320255 . S2CID   10881319 . Проверено 12 февраля 2022 г.
  6. ^ Ошибка IEEE 754 2019
  7. ^ Jump up to: Перейти обратно: а б Сигер, Б.; Кригель, HP (1988). «Методы проектирования и реализации эффективных методов пространственного доступа». Материалы конференции VLDB 1988 г.: 14-я Международная конференция по очень большим базам данных . 14 :360.
  8. ^ Jump up to: Перейти обратно: а б Самет, Ханан (2006). Основы многомерных и метрических структур данных . Сан-Франциско: Эльзевир/Морган-Кауфманн. стр. 440–441, 453–457. ISBN  0-12-369446-9 .
  9. ^ Ли, Ян; Ге, Тинцзянь; Чен, Синди (2020). «Онлайн-индексы для прогнозирования сущностей Top-k и агрегированных запросов к графам знаний». 36-я Международная конференция по инженерии данных (ICDE) , IEEE, 2020 г. стр. 1057–1068. дои : 10.1109/ICDE48307.2020.00096 . ISBN  978-1-7281-2903-7 . S2CID   218907333 .
  10. ^ Jump up to: Перейти обратно: а б Шпренгер, Стефан (2019). Эффективная обработка запросов диапазона в оперативной памяти (докторская диссертация). Берлинский университет имени Гумбольдта. дои : 10.18452/19786 .
  11. ^ Хатиби, А.; Порту, Ф.; Риттмайер, Дж.Г.; Огасавара, Э.; Вальдурье, П.; Шаша, Д. (август 2017 г.). «Методы предварительной обработки и индексирования групповых запросов в больших данных». Аналитика больших данных и обнаружение знаний (PDF) . Конспекты лекций по информатике. Том. 10440. стр. 164–172. дои : 10.1007/978-3-319-64283-3_12 . ISBN  978-3-319-64282-6 . S2CID   3857469 .
  12. ^ Зима, К.; Кипф, А.; Аннесер, К.; Захарату, ET; Нойманн, Т.; Кемпер, А. (2020). «Технология баз данных». GeoBlocks: структура данных с ускорением кэша запросов для пространственной агрегации по полигонам . Том. 23. OpenProceedings.org. стр. 169–180. дои : 10.5441/002/edbt.2021.16 .
  13. ^ Ван, С.; Майер, Д.; Оой, Б. (2016). «Быстрое и адаптивное индексирование многомерных данных наблюдений» . Труды Фонда VLDB . 9 (14): 1683. дои : 10.14778/3007328.3007334 .
  14. ^ Эррера, Стив; да Силва, Ларисса Мигес; РЕЙС, Пауло Рикардо; СИЛЬВА, Андерсон; ПОРТО, Фабио (2021). «Управление разреженными пространственно-временными данными в SAVIME: оценка индекса PH-дерева» . Труды XXXVI Бразильского симпозиума по базам данных : 337–342. дои : 10.5753/sbbd.2021.17895 . S2CID   245185935 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 615e67755bbf8a810506f3e92b29dea8__1712859360
URL1:https://arc.ask3.ru/arc/aa/61/a8/615e67755bbf8a810506f3e92b29dea8.html
Заголовок, (Title) документа по адресу, URL1:
PH-tree - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)