Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

Типы деревьев [ править ]

Дерево двоичного поиска
Дерево двоичного поиска

Дерево двоичного поиска [ править ]

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

Наихудшая временная сложность поиска в двоичном дереве поиска - это высота дерева , которая может быть всего лишь O (log n) для дерева с n элементами.

B-дерево [ править ]

B-деревья являются обобщением деревьев двоичного поиска в том смысле, что они могут иметь переменное количество поддеревьев в каждом узле. Хотя дочерние узлы имеют заранее определенный диапазон, они не обязательно будут заполнены данными, а это означает, что B-деревья потенциально могут тратить некоторое пространство. Преимущество состоит в том, что B-деревья не нужно повторно балансировать так часто, как другие самобалансирующиеся деревья .

Из-за переменного диапазона длины их узлов B-деревья оптимизированы для систем, которые читают большие блоки данных, они также обычно используются в базах данных.

Временная сложность поиска B-дерева составляет O (log n).

(a, b) -дерево [ править ]

(A, b) -дерево - это дерево поиска, все листья которого имеют одинаковую глубину. Каждый узел имеет не менее a и не более b детей, в то время как корень имеет не менее 2 детей и не более b детей.

a и b можно определить по следующей формуле: [2]

Временная сложность поиска (a, b) -дерева равна O (log n).

Тернарное дерево поиска [ править ]

Тернарное дерево поиска - это тип дерева, которое может иметь 3 узла: младший дочерний элемент, равный дочерний элемент и высокий дочерний элемент. Каждый узел хранит один символ, а само дерево упорядочено так же, как и двоичное дерево поиска, за исключением возможного третьего узла.

Поиск в троичном дереве поиска включает передачу строки, чтобы проверить, содержит ли ее какой-либо путь.

Временная сложность поиска сбалансированного троичного дерева поиска составляет O (log n).

Алгоритмы поиска [ править ]

Поиск определенного ключа [ править ]

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

Рекурсивный [ править ]

поиск-рекурсивный (ключ, узел), если узел равен NULL,  вернуть  EMPTY_TREE,  если ключ <node.key возврат поиск-рекурсивный (ключ, node.left) иначе, если ключ> node.key возврат поиск-рекурсивный (ключ, node.right) иначе  вернуть узел

Итеративный [ править ]

searchIterative (ключ, узел) currentNode: = узел в то время как currentNode не равен NULL,  если currentNode.key = key возвращает currentNode иначе, если currentNode.key> key currentNode: = currentNode.left еще currentNode: = currentNode.right

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

В отсортированном дереве минимум расположен в крайнем левом узле, а максимум - в крайнем правом узле. [3]

Минимум [ править ]

findMinimum (узел), если узел равен NULL,  вернуть  EMPTY_TREE мин: = узел в то время как min.left не NULL мин: = мин. слева возврат мин. ключ

Максимум [ править ]

findMaximum (узел), если узел равен NULL,  вернуть  EMPTY_TREE макс: = узел в то время как max.right не NULL макс: = макс. справа возврат макс. ключ

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

  • Trie
  • Двоичное дерево
  • Поиск в глубину

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

  1. ^ Black, Пол и Питерс, Vreda (2005). «дерево поиска» . Словарь алгоритмов и структур данных
  2. ^ Toal, Рэй. "(а, б) Деревья"
  3. ^ Gildea, Дан (2004). «Дерево двоичного поиска»