Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Пример несбалансированного дерева; следование пути от корня к узлу занимает в среднем 3,27 обращений к узлу
То же дерево после уравновешивания по высоте; среднее усилие на пути уменьшилось до 3,00 обращений к узлам

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

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

Красно-черное дерево , которое является типом самобалансирующегося бинарного дерева поиска, было названо симметричным бинарное B-дерево [2] и было переименовано , но все - таки можно спутать с родовым понятием самобалансирующегося бинарного дерева поиска , так как из инициалы.

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

Вращения деревьев - это очень распространенные внутренние операции самобалансирующихся двоичных деревьев для поддержания идеального или почти идеального баланса.

Большинство операций с двоичным деревом поиска (BST) занимают время, прямо пропорциональное высоте дерева, поэтому желательно, чтобы высота оставалась небольшой. Бинарное дерево с высотой h может содержать не более 2 0 +2 1 + ··· + 2 h  = 2 h +1 −1 узлов. Отсюда следует, что для любого дерева с n узлами и высотой h :

А это подразумевает:

.

Другими словами, минимальная высота двоичного дерева с n узлами равна log 2 ( n ) с округлением в меньшую сторону ; то есть . [1]

Однако простейшие алгоритмы вставки элементов BST могут дать дерево с высотой n в довольно распространенных ситуациях. Например, когда элементы вставляются в отсортированном ключевом порядке, дерево вырождается в связанный список с n узлами. Разница в производительности между двумя ситуациями может быть огромной: например, при n  = 1 000 000 минимальная высота равна .

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

Самобалансирующиеся двоичные деревья решают эту проблему, выполняя преобразования дерева (например, вращения дерева ) во время вставки ключей, чтобы сохранить высоту, пропорциональную log 2 ( n ). Хотя это связано с определенными накладными расходами , в конечном итоге это может быть оправдано за счет обеспечения быстрого выполнения последующих операций.

Хотя возможно поддерживать BST с минимальной высотой с ожидаемыми временными операциями (поиск / вставка / удаление), дополнительные требования к пространству, необходимые для поддержания такой структуры, как правило, перевешивают уменьшение времени поиска. Для сравнения: дерево AVL гарантированно находится в пределах 1,44 раз от оптимальной высоты, при этом в наивной реализации требуется только два дополнительных бита памяти. [1] Следовательно, большинство самобалансирующихся алгоритмов BST поддерживают высоту в пределах постоянного коэффициента этой нижней границы.

В асимптотическом смысле (« Big-O ») самобалансирующаяся структура BST, содержащая n элементов, позволяет выполнять поиск, вставку и удаление элемента за время O (log n ) в худшем случае и упорядоченное перечисление всех элементов в O ( n ) раз. Для некоторых реализаций это временные границы для каждой операции, в то время как для других это амортизированные границы для последовательности операций. Это время является асимптотически оптимальным среди всех структур данных, которые управляют ключом только посредством сравнений.

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

Структуры данных, реализующие этот тип дерева, включают:

  • 2–3 дерева
  • Дерево AA
  • AVL дерево
  • B-дерево
  • Красно-черное дерево
  • Козел отпущения
  • Splay tree
  • Танго дерево
  • Treap
  • Балансированное дерево

Приложения [ править ]

Самобалансирующиеся деревья двоичного поиска можно естественным образом использовать для создания и поддержки упорядоченных списков, таких как очереди приоритетов . Их также можно использовать для ассоциативных массивов ; Пары ключ-значение просто вставляются в порядке, основанном только на ключах. В этом качестве самобалансирующиеся BST имеют ряд преимуществ и недостатков по сравнению с их основным конкурентом, хеш-таблицами . Одним из преимуществ самобалансирующихся BST является то, что они позволяют быстро (действительно, асимптотически оптимально) перечислять элементы в ключевом порядке., которые не предоставляются в хеш-таблицах. Одним из недостатков является то, что их алгоритмы поиска усложняются, когда может быть несколько элементов с одним и тем же ключом. Самобалансирующиеся BST имеют лучшую производительность поиска в худшем случае, чем хэш-таблицы (O (log n) по сравнению с O (n)), но имеют худшую производительность в среднем случае (O (log n) по сравнению с O (1)).

Самобалансирующиеся BST могут использоваться для реализации любого алгоритма, требующего изменяемых упорядоченных списков, для достижения оптимальной асимптотической производительности в худшем случае. Например, если сортировка двоичного дерева реализована с помощью самоуравновешенного BST, у нас есть очень простой для описания, но асимптотически оптимальный алгоритм сортировки O ( n log n ). Точно так же многие алгоритмы вычислительной геометрии используют вариации самобалансирующихся BST для решения таких проблем, как проблема пересечения отрезков линии и определение местоположения точки.проблема эффективно. (Для среднего случая производительность, однако, самоуравновешенная BSTs может быть менее эффективной , чем другие решения. Бинарное дерево рода, в частности, скорее всего, будут медленнее , чем сортировка слияния , быстрая сортировки или пирамидальная сортировки , из - за дерево балансировки накладных расходов , как а также шаблоны доступа к кешу .)

Самобалансирующиеся BST - это гибкие структуры данных, которые легко расширять для эффективной записи дополнительной информации или выполнения новых операций. Например, можно записать количество узлов в каждом поддереве, обладающем определенным свойством, что позволяет подсчитать количество узлов в определенном диапазоне ключей с этим свойством за время O (log n ). Эти расширения можно использовать, например, для оптимизации запросов к базе данных или других алгоритмов обработки списков.

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

  • Структура данных поиска
  • Алгоритм Дэй – Стаута – Уоррена
  • Дерево слияния
  • Пропустить список
  • Сортировка

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

  1. ^ a b c Дональд Кнут . Искусство программирования , Том 3: Сортировка и поиск , второе издание. Аддисон-Уэсли, 1998. ISBN 0-201-89685-0 . Раздел 6.2.3: Сбалансированные деревья, стр. 458–481.  
  2. ^ Пол Э. Блэк , «красно-черное дерево», в Словаре алгоритмов и структур данных [онлайн], Вреда Питерс и Пол Э. Блэк, ред. 13 апреля 2015 г. (по состоянию на 3 октября 2016 г.) Доступно по адресу : https://xlinux.nist.gov/dads/HTML/redblack.html

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

  • Словарь алгоритмов и структур данных: сбалансированное по высоте двоичное дерево поиска
  • GNU libavl , библиотека реализаций двоичного дерева на C под лицензией LGPL, с документацией