Jump to content

PH-дерево

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

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]

 функции  (ключ) поиск     запись ← get_root_entry() // если дерево не пусто, корневая запись содержит корневой узел     в то время как  запись != NIL && вход.is_subnode()  сделать          узел ← вход.get_node()        запись ← node.get_entry(ключ)       повторите  возвращаемую  запись // запись может быть NIL 
функция  get_entry(key  )     узел ← текущий узел    h ← extract_bits_at_length(key, node.get_length()}    запись ← node.get_entry_at(h)   возвращаемая  запись // запись может быть NIL 

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

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

  1. Квадрант пуст, и мы можем просто вставить в него новую запись и вернуться.
  2. Квадрант содержит запись пользователя с ключом, идентичным новой записи. Один из способов справиться с таким конфликтом — вернуть флаг, указывающий на неудачную вставку. Если дерево реализовано как мультикарта с коллекцией в качестве записи узла, новое значение добавляется к этой коллекции.
  3. Квадрант содержит запись (запись пользователя или запись подузла) с другим ключом. В этом случае требуется заменить существующую запись новым подузлом, содержащим старую и новую записи.
функция  вставки (узел, ключ, значение)    level ← node.get_level() // Уровень для корня равен 0    h ← extract_bits_at_level(ключ, уровень)    запись ← node.get_entry(h)     если  запись == NIL,  то         // Случай 1.        enter_new ← create_entry(ключ, значение)        node.set_entry(h,Entry_new)            иначе, если  !entry.is_subnode() && enter.get_key() == ключ  , тогда        // Случай 2. Коллизия, запись уже есть        возврат  ← неудачная_вставка             еще         // Случай 3.        level_diff ← get_level_of_difference(key, вход.get_key())         enter_new ← create_entry(ключ, значение)        // новый подузел с существующей записью и новой записью        subnode_new ← create_node(level_diff, вход, вход_новый)         node.set_entry(h, subnode_new)          конец, если  вернуться 

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

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

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

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

запрос функции  (узел, мин, макс, список_результатов)  — это      foreach  запись  ← node.get_entries() делать          , если  вход.is_subnode()  , то              если  вход.get_prefix() >= мин и вход.get_prefix() <= макс  , тогда                 запрос (entry.get_subnode(), мин, максимум, result_list)             конец, если          еще              , если  вход.get_key() >= мин и вход.get_key() <= макс  , тогда                 result_list.add(запись)             конец, если          конец, если      повторить  возврат 

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

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

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

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

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

запрос функции  (узел, мин, максимум, список_результатов  )     h_min ← рассчитать h_min    h_max ← рассчитать h_max     для каждой  записи ← node.get_entries_range(h_min, h_max)  do         [ ... ]     повторный  возврат 

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

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

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

функция  is_overlap(h, h_min, h_max)  возвращает  (h | h_min )  & h_max == h // оценивается как «истина», если квадрант и запрос перекрываются. 
запрос функции  (узел, мин, максимум, список_результатов  )     h_min ← рассчитать h_min    h_max ← рассчитать h_max     для каждой  записи ← node.get_entries_range(h_min, h_max)  do         ч ← вход.get_h();         if  (h | h_min) & h_max == h  then  // оценивается как «истина», если квадрант и запрос перекрываются.           [ ... ]         закончить, если      повторить  возврат 

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

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

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

функция  приращения_h(h_input, h_min, h_max  )     h_out = h_input | (~ h_max) // предварительная маска    h_out += 1 // приращение    h_out = (h_out & h_max) | h_min // сообщение — маска вернуть  h_out 

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

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

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

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

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

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

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

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

длинное   кодирование  (  двойное   значение  )   {      long   r   =   Double  .  DoubleToRawLongBits  (  значение  );      возврат   (  р   ​​>=   0  )   ?   р   :   р   ^   0x7FFFFFFFFFFFFFFFL  ;  } 

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

std  ::  int64_t   кодировать  (  двойное   значение  )   {      std  ::  int64_t   r  ;      memcpy  (  &  r  ,   &  value  ,   sizeof  (  r  ));      вернуть   р   >=   0   ?   р   :   р   ^   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 дней с момента нарушения.)