Jump to content

Бинарное дерево поиска

Это хорошая статья. Нажмите здесь для получения дополнительной информации.
(Перенаправлено из двоичных деревьев поиска )

Бинарное дерево поиска
Тип дерево
Изобретенный 1960
Изобретён П.Ф. Уиндли, А.Д. Бут , Эй.Дж.Т. Колин и Т.Н. Хиббард
Временная сложность в обозначении большого О
Операция Средний Худший случай
Поиск О( вход ) На )
Вставлять О( вход ) На )
Удалить О( вход ) На )
Пространственная сложность
Космос На ) На )
Рис. 1: Бинарное дерево поиска размером 9 и глубиной 3 с 8 в корне.

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

Деревья двоичного поиска позволяют осуществлять двоичный поиск для быстрого поиска, добавления и удаления элементов данных. Поскольку узлы в BST расположены так, что каждое сравнение пропускает около половины оставшегося дерева, производительность поиска пропорциональна производительности двоичного логарифма . BST были разработаны в 1960-х годах для решения проблемы эффективного хранения размеченных данных и приписываются Конвею Бернерсу-Ли и Дэвиду Уиллеру .

Производительность двоичного дерева поиска зависит от порядка вставки узлов в дерево, поскольку произвольные вставки могут привести к вырождению; можно построить несколько вариантов двоичного дерева поиска с гарантированной производительностью в худшем случае. К основным операциям относятся: поиск, обход, вставка и удаление. BST с гарантированной сложностью наихудшего случая работают лучше, чем несортированный массив, для которого потребуется линейное время поиска .

Анализ сложности BST показывает, что в среднем вставка, удаление и поиск занимают для узлы. В худшем случае они деградируют до односвязного списка: . Чтобы решить проблему безграничного увеличения высоты дерева с помощью произвольных вставок и удалений, самобалансирующиеся вводятся варианты BST, которые связывают наихудшую сложность поиска со сложностью двоичного логарифма. Деревья AVL были первыми самобалансирующими двоичными деревьями поиска, изобретенными в 1962 году Георгием Адельсоном-Вельским и Евгением Ландисом .

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

Алгоритм бинарного дерева поиска был открыт независимо несколькими исследователями, в том числе П. Ф. Уиндли, Эндрю Дональдом Бутом , Эндрю Колином , Томасом Н. Хиббардом . [ 1 ] [ 2 ] Алгоритм приписывается Конвею Бернерсу-Ли и Дэвиду Уилеру , которые использовали его для хранения помеченных данных на магнитных лентах в 1960 году. [ 3 ] Одним из самых ранних и популярных алгоритмов двоичного дерева поиска является алгоритм Хиббарда. [ 1 ]

Временная сложность двоичного дерева поиска неограниченно увеличивается с высотой дерева, если узлы вставлены в произвольном порядке, поэтому были введены самобалансирующиеся деревья двоичного поиска, чтобы ограничить высоту дерева до . [ 4 ] различные сбалансированные по высоте Для ограничения высоты дерева были введены бинарные деревья поиска, такие как деревья AVL , Treaps и красно-черные деревья . [ 5 ]

Дерево AVL было изобретено Георгием Адельсоном-Вельским и Евгением Ландисом в 1962 году для эффективной организации информации. [ 6 ] [ 7 ] Это было первое самобалансирующееся двоичное дерево поиска. [ 8 ]

Бинарное дерево поиска — это корневое двоичное дерево, в котором узлы расположены в строгом общем порядке , в котором узлы с ключами, большими, чем любой конкретный узел A, хранятся в правых поддеревьях по отношению к этому узлу A , а узлы с ключами, равными или меньше, чем A, хранятся в левых поддеревьях от A, удовлетворяя свойству двоичного поиска . [ 9 ] : 298  [ 10 ] : 287 

Двоичные деревья поиска также эффективны при сортировке и алгоритмах поиска . Однако сложность поиска BST зависит от порядка, в котором узлы вставляются и удаляются; поскольку в худшем случае последовательные операции в двоичном дереве поиска могут привести к вырождению и формированию структуры, подобной односвязному списку (или «несбалансированному дереву»), поэтому в наихудшем случае он имеет ту же сложность, что и связанный список . [ 11 ] [ 9 ] : 299-302 

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

Операции

[ редактировать ]

Идет поиск

[ редактировать ]

Поиск в бинарном дереве поиска по определенному ключу можно запрограммировать рекурсивно или итеративно .

Поиск начинается с изучения корневого узла . Если дерево равно nil , искомый ключ не существует в дереве. В противном случае, если ключ равен ключу корня, поиск успешен и узел возвращается. Если ключ меньше, чем у корня, поиск продолжается путем проверки левого поддерева. Аналогично, если ключ больше, чем ключ корня, поиск продолжается путем проверки правого поддерева. Этот процесс повторяется до тех пор, пока не будет найден ключ или пока не будет найдено оставшееся поддерево. . Если искомый ключ не найден после поддерево достигнуто, то ключ отсутствует в дереве. [ 10 ] : 290–291 

[ редактировать ]

Следующий псевдокод реализует процедуру поиска BST посредством рекурсии . [ 10 ] : 290 

Recursive-Tree-Search(x, key)
    if x = NIL or key = x.key then
        return x
    if key < x.key then
        return Recursive-Tree-Search(x.left, key)
    else
        return Recursive-Tree-Search(x.right, key)
    end if

Рекурсивная процедура продолжается до тех пор, пока или встречаются искомые.

[ редактировать ]

Рекурсивную версию поиска можно «развернуть» в цикл while . На большинстве машин итеративная версия оказывается более эффективной . [ 10 ] : 291 

Iterative-Tree-Search(x, key)
    while x ≠ NIL and key ≠ x.key do
        if key < x.key then
            x := x.left
        else
            x := x.right
        end if
    repeat
    return x

Поскольку поиск может продолжаться до некоторого листового узла , сложность времени выполнения поиска BST равна где это высота дерева . Однако худшим случаем для поиска BST является где — общее количество узлов в BST, поскольку несбалансированный BST может выродиться в связанный список. Однако, если BST сбалансирован по высоте, высота будет . [ 10 ] : 290 

Преемник и предшественник

[ редактировать ]

Для определенных операций задан узел , нахождение преемника или предшественника имеет решающее значение. Предполагая, что все ключи BST различны, преемник узла в BST — это узел с наименьшим ключом, превышающим ключ. С другой стороны, предшественник узла в BST — это узел с наибольшим ключом, меньшим, чем ключ. Следующий псевдокод находит преемника и предшественника узла. в БСТ. [ 12 ] [ 13 ] [ 10 ] : 292–293 

 BST-Successor(x)
     if x.right ≠ NIL then
         return BST-Minimum(x.right)
     end if
     y := x.parent
     while y ≠ NIL and x = y.right do
         x := y
         y := y.parent
     repeat
     return y
 BST-Predecessor(x)
     if x.left ≠ NIL then
         return BST-Maximum(x.left)
     end if
     y := x.parent
     while y ≠ NIL and x = y.left do
         x := y
         y := y.parent
     repeat
     return y

Такие операции, как поиск узла в BST, ключ которого является максимальным или минимальным, имеют решающее значение в определенных операциях, таких как определение преемника и предшественника узлов. Ниже приведен псевдокод операций. [ 10 ] : 291–292 

 BST-Maximum(x)
     while x.right ≠ NIL do
         x := x.right
     repeat
     return x
 BST-Minimum(x)
     while x.left ≠ NIL do
         x := x.left
     repeat
     return x

Такие операции, как вставка и удаление, приводят к динамическому изменению представления BST. Структура данных должна быть изменена таким образом, чтобы свойства BST сохранялись. Новые узлы вставляются как конечные узлы в BST. [ 10 ] : 294–295  Ниже приведена итеративная реализация операции вставки. [ 10 ] : 294 

1    BST-Insert(T, z)
2      y := NIL
3      x := T.root
4      while x ≠ NIL do
5        y := x
6        if z.key < x.key then
7          x := x.left
8        else
9          x := x.right
10       end if
11     repeat
12     z.parent := y
13     if y = NIL then
14       T.root := z
15     else if z.key < y.key then
16       y.left := z
17     else
18       y.right := z
19     end if

Процедура поддерживает «конечный указатель» как родитель . После инициализации в строке 2 цикл while в строках 4–11 вызывает обновление указателей. Если является , BST пуст, поэтому вставляется как корневой узел двоичного дерева поиска , если это не так , вставка продолжается путем сравнения ключей с ключами в строках 15-19 и узел вставляется соответственно. [ 10 ] : 295 

Удаление

[ редактировать ]
У удаляемого узла '"`UNIQ --postMath-0000001D-QINU`"' есть 2 дочерних элемента.
The node to be deleted has 2 children

Удаление узла, скажем , из двоичного дерева поиска имеет три случая: [ 10 ] : 295-297 

  1. Если является конечным узлом, родительским узлом заменяется на и, следовательно, удаляется из , как показано в (а).
  2. Если имеет только одного дочернего узла, дочерний узел получает повышение путем изменения родительского узла чтобы указать на дочерний узел, следовательно, принимая положение в дереве, как показано на рисунках (b) и (c).
  3. Если имеет как левых, так и правых детей, наследник , сказать , вытесняет следуя двум случаям:
    1. Если является правый дочерний элемент, как показано на (d), вытесняет и Право ребенка остаются неизменными.
    2. Если лежит внутри правое поддерево, но это не так правый дочерний элемент, как показано на (e), сначала заменяется своим собственным потомком, а затем вытесняет позиция в дереве.

Следующий псевдокод реализует операцию удаления в двоичном дереве поиска. [ 10 ] : 296-298 

1    BST-Delete(BST, D)
2      if D.left = NIL then
3        Shift-Nodes(BST, D, D.right)
4      else if D.right = NIL then
5        Shift-Nodes(BST, D, D.left)
6      else
7        E := BST-Successor(D)
8        if E.parent ≠ D then
9          Shift-Nodes(BST, E, E.right)
10         E.right := D.right
11         E.right.parent := E
12       end if
13       Shift-Nodes(BST, D, E)
14       E.left := D.left
15       E.left.parent := E
16     end if
1    Shift-Nodes(BST, u, v)
2      if u.parent = NIL then
3        BST.root := v
4      else if u = u.parent.left then
5        u.parent.left := v
5      else
6        u.parent.right := v
7      end if
8      if v ≠ NIL then
9        v.parent := u.parent
10     end if

The Процедура касается трех особых случаев, упомянутых выше. Строки 2–3 относятся к случаю 1; строки 4–5 относятся к случаю 2, а строки 6–16 — к случаю 3. Вспомогательная функция используется в алгоритме удаления с целью замены узла с в бинарном дереве поиска . [ 10 ] : 298  Эта процедура обрабатывает удаление (и замену) от .

BST может быть пройден с помощью трех основных алгоритмов: обход дерева в порядке , предзаказ и обход дерева в последующем порядке . [ 10 ] : 287 

  • Обход дерева по порядку : сначала посещаются узлы левого поддерева, затем корневой узел и правое поддерево. Такой обход посещает все узлы в порядке неубывающей последовательности ключей.
  • Обход дерева по предварительному заказу : сначала посещается корневой узел, а затем левое и правое поддеревья.
  • Обход дерева в постпорядке : сначала посещаются узлы левого поддерева, затем правое поддерево и, наконец, корень.

Ниже приведена рекурсивная реализация обхода дерева. [ 10 ] : 287–289 

 Inorder-Tree-Walk(x)
   if x ≠ NIL then
     Inorder-Tree-Walk(x.left)
     visit node
     Inorder-Tree-Walk(x.right)
   end if
 Preorder-Tree-Walk(x)
   if x ≠ NIL then
     visit node
     Preorder-Tree-Walk(x.left)
     Preorder-Tree-Walk(x.right)
   end if
 Postorder-Tree-Walk(x)
   if x ≠ NIL then
     Postorder-Tree-Walk(x.left)
     Postorder-Tree-Walk(x.right)
     visit node
   end if

Сбалансированные деревья двоичного поиска

[ редактировать ]

Без перебалансировки вставки или удаления в двоичном дереве поиска могут привести к вырождению, что приведет к увеличению высоты. дерева (где — количество элементов в дереве), так что производительность поиска снижается до уровня линейного поиска. [ 14 ] Сохранение сбалансированности дерева поиска и ограничения высоты является ключом к полезности двоичного дерева поиска. Этого можно достичь с помощью механизмов «самобалансировки» во время операций обновления дерева, предназначенных для поддержания высоты дерева на уровне двоично-логарифмической сложности. [ 4 ] [ 15 ] : 50 

Деревья со сбалансированной высотой

[ редактировать ]

Дерево является сбалансированным по высоте, если высоты левого и правого поддерева гарантированно связаны постоянным коэффициентом. Это свойство было введено деревом AVL и продолжено красно-черным деревом . [ 15 ] : 50–51  Высоты всех узлов на пути от корня до измененного листового узла необходимо наблюдать и, возможно, корректировать при каждой операции вставки и удаления в дереве. [ 15 ] : 52 

Деревья со сбалансированным весом

[ редактировать ]

В дереве со сбалансированным весом критерием сбалансированного дерева является количество листьев поддеревьев. Веса левого и правого поддеревьев отличаются не более чем на . [ 16 ] [ 15 ] : 61  Однако разница ограничена соотношением гирь, поскольку условие сильного баланса не может поддерживаться с ребалансировка работы во время операций вставки и удаления. Деревья со сбалансированным весом дают целое семейство условий баланса, где каждое левое и правое поддерево имеет по крайней мере часть от общего веса поддерева. [ 15 ] : 62 

Существует несколько самобалансированных бинарных деревьев поиска, включая T-tree , [ 17 ] треп , [ 18 ] красно-черное дерево , [ 19 ] B-дерево , [ 20 ] 2–3 дерева , [ 21 ] и дерево воспроизведения . [ 22 ]

Примеры приложений

[ редактировать ]

Сортировать

[ редактировать ]

Двоичные деревья поиска используются в алгоритмах сортировки, таких как сортировка по дереву , где все элементы вставляются одновременно, а дерево просматривается в заданном порядке. [ 23 ] BST также используются в быстрой сортировке . [ 24 ]

Приоритетные операции с очередью

[ редактировать ]

Двоичные деревья поиска используются при реализации очередей приоритетов , используя ключ узла в качестве приоритетов. Добавление новых элементов в очередь повторяет обычную операцию вставки BST, но операция удаления зависит от типа приоритетной очереди: [ 25 ]

  • Если это очередь с возрастающим приоритетом, удаление элемента с наименьшим приоритетом выполняется путем обхода BST влево.
  • Если это очередь с приоритетом по убыванию, удаление элемента с наивысшим приоритетом выполняется путем обхода BST вправо.

См. также

[ редактировать ]
  1. ^ Jump up to: а б Калберсон, Дж.; Манро, JI (1 января 1989 г.). «Объяснение поведения двоичных деревьев поиска при длительных обновлениях: модель и моделирование» . Компьютерный журнал . 32 (1): 68–69. дои : 10.1093/comjnl/32.1.68 .
  2. ^ Калберсон, Дж.; Манро, JI (28 июля 1986 г.). «Анализ стандартных алгоритмов удаления в бинарных деревьях поиска с точной подгонкой домена» . Алгоритмика . 5 (1–4). Springer Publishing , Университет Ватерлоо : 297. doi : 10.1007/BF01840390 . S2CID   971813 .
  3. ^ П. Ф. Виндли (1 января 1960 г.). «Деревья, леса и переустройство» . Компьютерный журнал . 3 (2): 84. дои : 10.1093/comjnl/3.2.84 .
  4. ^ Jump up to: а б Кнут, Дональд (1998). «Раздел 6.2.3: Сбалансированные деревья». Искусство компьютерного программирования (PDF) . Том. 3 (2-е изд.). Аддисон-Уэсли . стр. 458–481. ISBN  978-0201896855 . Архивировано (PDF) из оригинала 9 октября 2022 г.
  5. ^ Пол Э. Блэк, «красно-черное дерево», в Словаре алгоритмов и структур данных [онлайн], Пол Э. Блэк, изд. 12 ноября 2019 г. (по состоянию на 19 мая 2022 г.) с сайта: https://www.nist.gov/dads/HTML/redblack.html.
  6. ^ Майерс, Эндрю. «Лекция CS 312: Деревья AVL» . Корнелльский университет , факультет компьютерных наук. Архивировано из оригинала 27 апреля 2021 года . Проверено 19 мая 2022 г.
  7. ^ Адельсон-Вельский, Георгий; Лэндис, Евгений (1962). «Алгоритм организации информации». Известия Академии наук СССР (на русском языке). 146 : 263–266. Английский перевод Майрона Дж. Риччи в «Советской математике» - Доклады , 3:1259–1263, 1962.
  8. ^ Питасси, Тонианн (2015). «CSC263: Сбалансированные BST, дерево AVL» (PDF) . Университет Торонто , факультет компьютерных наук. п. 6. Архивировано (PDF) из оригинала 14 февраля 2019 г. Проверено 19 мая 2022 г.
  9. ^ Jump up to: а б Тареджа, Рима (13 октября 2018 г.). «Хеширование и столкновение». Структуры данных с использованием C (2-е изд.). Издательство Оксфордского университета . ISBN  9780198099307 .
  10. ^ Jump up to: а б с д и ж г час я дж к л м н тот Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л .; Стоун, Клиффорд (2001). Введение в алгоритмы (2-е изд.). МТИ Пресс . ISBN  0-262-03293-7 .
  11. ^ Р.А. Мороз; М.М. Петерсон (1 февраля 1982 г.). «Краткая заметка о двоичных деревьях поиска» . Компьютерный журнал . 25 (1). Издательство Оксфордского университета : 158. doi : 10.1093/comjnl/25.1.158 .
  12. ^ Цзюньчжоу Хуан. «Проектирование и анализ алгоритмов» (PDF) . Техасский университет в Арлингтоне . п. 12. Архивировано (PDF) из оригинала 13 апреля 2021 г. Проверено 17 мая 2021 г.
  13. ^ Рэй, Рэй. «Двоичное дерево поиска» . Университет Лойолы Мэримаунт , факультет компьютерных наук . Проверено 17 мая 2022 г.
  14. ^ Торнтон, Алекс (2021). «ICS 46: Двоичные деревья поиска» . Калифорнийский университет в Ирвайне . Архивировано из оригинала 4 июля 2021 года . Проверено 21 октября 2021 г.
  15. ^ Jump up to: а б с д и Брасс, Питер (январь 2011 г.). Расширенная структура данных . Издательство Кембриджского университета . дои : 10.1017/CBO9780511800191 . ISBN  9780511800191 .
  16. ^ Блюм, Норберт; Мельхорн, Курт (1978). «О среднем количестве операций ребалансировки в деревьях со сбалансированным весом» (PDF) . Теоретическая информатика . 11 (3): 303–320. дои : 10.1016/0304-3975(80)90018-3 . Архивировано (PDF) из оригинала 9 октября 2022 г.
  17. ^ Леман, Тобин Дж.; Кэри, Майкл Дж. (25–28 августа 1986 г.). Исследование структур индексов для систем управления базами данных основной памяти . Двенадцатая Международная конференция по очень большим базам данных (VLDB, 1986). Киото. ISBN  0-934613-18-4 .
  18. ^ Арагон, Сесилия Р.; Зайдель, Раймунд (1989), «Рандомизированные деревья поиска» (PDF) , 30-й ежегодный симпозиум по основам информатики , Вашингтон, округ Колумбия: IEEE Computer Society Press, стр. 540–545, doi : 10.1109/SFCS.1989.63531 , ISBN  0-8186-1982-1 , заархивировано (PDF) из оригинала 9 октября 2022 г.
  19. ^ Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л .; Штейн, Клиффорд (2001). «Красно-черные деревья». Введение в алгоритмы (второе изд.). МТИ Пресс. стр. 273–301 . ISBN  978-0-262-03293-3 .
  20. ^ Комер, Дуглас (июнь 1979 г.), «Вездесущее B-дерево», Computing Surveys , 11 (2): 123–137, doi : 10.1145/356770.356776 , ISSN   0360-0300 , S2CID   101673
  21. ^ Кнут, Дональд М. (1998). «6.2.4». Искусство компьютерного программирования . Том. 3 (2-е изд.). Эддисон Уэсли. ISBN  9780201896855 . 2–3 дерева, определенные в конце раздела 6.2.3, эквивалентны B-деревьям порядка 3.
  22. ^ Слитор, Дэниел Д .; Тарьян, Роберт Э. (1985). «Самонастраивающиеся двоичные деревья поиска» (PDF) . Журнал АКМ . 32 (3): 652–686. дои : 10.1145/3828.3835 . S2CID   1165848 .
  23. ^ Нарайанан, Арвинд (2019). «COS226: Двоичные деревья поиска» . Школа инженерии и прикладных наук Принстонского университета . Архивировано из оригинала 22 марта 2021 года . Проверено 21 октября 2021 г. - через cs.princeton.edu.
  24. ^ Сюн, Ли. «Связь между двоичными деревьями поиска и быстрой сортировкой» . Оксфордский колледж Университета Эмори , факультет математики и информатики. Архивировано из оригинала 26 февраля 2021 года . Проверено 4 июня 2022 г.
  25. ^ Майерс, Эндрю. «CS 2112 Лекции и конспекты: приоритетные очереди и кучи» . Корнелльский университет , факультет компьютерных наук . Архивировано из оригинала 21 октября 2021 года . Проверено 21 октября 2021 г.

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c69043e9f72e55d8765e6874efac5b1b__1719514620
URL1:https://arc.ask3.ru/arc/aa/c6/1b/c69043e9f72e55d8765e6874efac5b1b.html
Заголовок, (Title) документа по адресу, URL1:
Binary search tree - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)