Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

10.2.3. Сбалансированные деревья

Бинарные деревья поиска предназначены для быстрого поиска данных. Время поиска определяется глубиной дерева. Для деревьев, у которых из каждой вершины выходит ровно две ветви, глубина дерева h = log2n-1, где n количество вершин дерева. Однако некоторые последовательности операций включения или исключения вершин могут привести к двоичным деревьям поиска, структура которых будет вырожденной: состоять из одного поддерева из n элементов. Например, для последовательности загружаемых в дерево поиска данных: 8,10, 14, 13 дерево поиска вырождается в линейный список. Максимальное количество сравнений для поиска вершины в таком дереве равно количеству элементов в дереве (n). Для того чтобы дерево использовалось для быстрого поиска необходимо после каждой вставки или удаления вершины выполнять перестроение дерева, чтобы его высота оставалась минимальной, а само дерево оставалось полным (сбалансированным).

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

Рис. 2. Идеально сбалансированное дерево

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

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

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

Рис. 3. Сбалансированное дерево

Это дерево не сбалансировано идеально, но высоты всех поддеревьев отличаются не более чем на 1.

Сбалансированные деревья называют АВЛ-деревьями по первым буквам фамилий авторов: Адельсон-Вельский Г.М. и Ландис Е.М. Согласно теореме, которую доказали Адельсон-Вельский Г.М. и Ландис Е.М. [3, 4], высота сбалансированного дерева никогда не будет превышать высоту идеально сбалансированного дерева более чем на 45% независимо от количества вершин. Например, для 1000000 вершин высота идеально сбалансированного дерева поиска равна 20, а для АВЛ-дерева – 29. При использовании АВЛ-деревьев время на поддержку баланса вершин дерева меньше, чем для идеально сбалансированных деревьев: в среднем балансировка требуется в одном случае из трех включений. Сбалансированные деревья поиска следует использовать тогда, когда поиск информации происходит гораздо чаще, чем включение и исключение данных.

10.2.4. В-деревья

Еще один способ уменьшения времени поиска в больших массивах данных – использование сильно ветвящихся деревьев. Примером использования сильно ветвящегося дерева может служить файловая система. Высота сильно ветвящегося дерева и, следовательно, количество сравнений при поиске в нем меньше, чем для бинарного дерева. Для m-арного дерева поиска загруженного n данными среднее количество сравнений для поиска logmn. Однако проблема балансировки существует и для сильноветвящихся деревьев поиска. Они также могут вырождаться в линейные списки.

В-дерево является особым видом сбалансированного сильно ветвящегося дерева. Оно используется в качестве индексного файла в базах данных. В-дерево 2-го порядка1 приведено на рис. 4.

Рис. 4. B-дерево порядка 2

В-деревом n-порядка называется сильно ветвящееся дерево поиска, обладающее следующими свойствами:

  1. Листья дерева хранят либо настоящие записи файла данных, либо ключи и адреса записей файла данных. В первом случае В-дерево называется кластерным индексом, а во втором – некластерным индексом.

  2. Все пути от корня дерева до любого листа имеют одинаковую длину: В-дерево сбалансировано по высоте. Сбалансированность В-дерева поддерживается при его эксплуатации.

  3. Каждая внутренняя вершина содержит ключи данных и указатели на поддеревья. Ключи упорядочены по возрастанию. Каждый ключ имеет двух сыновей. В поддереве слева от ключа находятся вершины с меньшими значениями ключа, а в поддереве справа – с большими или равными значениями. Каждая вершина дерева n-порядка (кроме корня) содержит от n до 2n ключей. Количество указателей в вершине на 1 больше, чем количество ключей. Корень может содержать от 1 до 2n ключей. Для первой записи в любой внутренней вершине ключ не указывается. Это делается для экономии памяти и удобства включения.

Поиск в B-дереве – это прохождение от корня к листу в соответствии с заданным значением ключа. Так как дерево сбалансировано по высоте, то для выполнения поиска по любому значению ключа потребуется одно и то же (и обычно небольшое) число обменов с внешней памятью.