Сильноветвящиеся деревья.ppt
- Количество слайдов: 36
Сильноветвящиеся деревья отличаются более плотной упаковкой информации в узлах и, как следствие, меньшей высотой. Их можно рассматривать как разновидность nарных деревьев с более плотной упаковкой узла ключами и требованиями по листьям, которые улучшают поиск, но операции редактирования и балансировки при этом усложняются. Имеющийся опыт показывает, что они уступают бинарным деревьям при поиске в оперативной памяти, но имеют значительные преимущества при поиске во внешней памяти. 1
Основные определения и терминология • Если считать, что степень некоторого узла упорядоченного дерева равна n>2, и он содержит n -1 ключей и n указателей, то деревья с такими узлами называются сильноветвящимися деревьями • В сильноветвящемся дереве все узлы имеют либо одинаковую степень n, либо она находится в строго определённых пределах. • Ключ в вышерасположенном узле сильноветвящегося дерева может совпадать с ключом (или частью ключа) в нижерасположенном узла (например, с наибольшим). • Листья находятся на одном уровне. 2
Схема узла сильноветвящегося дерева • Эту структуру можно рекомендовать только в тех случаях, когда степени узлов дерева или длины ключей сильно отличаются друг от друга. 3
Особенности применения сильноветвящихся деревьев • Имеется последовательность из N ключей. В случае бинарного дерева мы имеем 2 N указателей. В случае сильноветвящегося дерева мы имеем N/(n-1) узлов и N*n/(n -1) указателей, т. е. меньше число указателей и меньше высота дерева. • Однако анализ затрат (числа сравнений) на поиск по дереву, содержащему N ключей, показывает, что бинарное дерево оказывается более выгодным: – бинарное дерево: примерно log 2 N сравнений, – сильноветвящееся дерево: примерно (n+1)logn. N сравнений. • Сильноветвящиеся деревья оказались очень удобными для поиска во внешней памяти. Пожалуй, единственным исключением из этого правила является (2 -3)-деревья, и (2 -3 -4)-деревья, являющиеся частным случаем сильноветвящихся деревьев 4
Разновидности сильноветвящихся деревьев • (2 -3)-деревья • (2 -3 -4)-деревья • В-дерево: – В+-дерево – В++-дерево; – В*-деревья – (a-b)-дерево и другие 5
(2 -3)-деревья • Упорядоченное дерево, каждый промежуточный узел которого содержит 2 или 3 связи, а все листья расположены на одном уровне, называется (2— 3)-деревом. • Эти деревья применяют для словарей, сцепляемых очередей, очередей с приоритетами, прошитых словарей и очередей. Поскольку (2— 3)-деревья имеют большую свободу узлов, чем АВЛ-деревья, изменение структуры затрагивает меньшую часть дерева и расщепления узлов выполняются проще, чем 6 балансировка.
Вставка в (2— 3)-дерево ключа 5 Вставляемый ключ всегда помещается в лист. Если после вставки лист содержит три ключа, ключ со средним значением перемещается вверх, а оставшиеся ключи делятся на два узла. Если переданный снизу ключ попадет в узел уже содержащий два ключа, то ключ со средним значением опять перемещается вверх, а оставшийся узел делится пополам, образуя пару одноключевых узлов. Такой подъем по уровням может продолжаться вплоть до корня, и если окажется, что корень содержит два ключа, 7 то высота дерева увеличивается на единицу.
Удаление из (2— 3)-дерева • • • Если в результате удаления листа у исходного узла окажется всего один исходящий, и он содержит два ключа, то один из них перемещается в исходный, а ключ исходного может опускается на место удаленного листа. Если же по соседству с исходным, содержащим один ключ, имеется соседний узел с двумя ключами, то этот единственный ключ перемещается на место удаленного листа. При этом восстанавливаются свойства (2 -3)-дерева путем перемещения вверх и вниз нескольких ключей (рис. a) если по соседству с исходным узлом, содержащим один ключ, имеется только одноключевой узел (рис. б), то два ключа опускаются, и соседние узлы объединяются (рис. в). 8
Преобразование 2 -3 дерева в бинарное дерево 5 5, 9 3 1, 2 7 4 6 12 8 10, 11 3 13 1 2 9 7 4 6 12 8 10 11 13 9
другое представление (2 -3)-дерева. • • • Здесь все ключи располагаются в листьях. В каждый внутренний узел предыдущего уровня записываются ключ наибольшего элемента, являющегося потомком второго сына, и ключ наибольшего элемента — потомка третьего сына, если, конечно, есть третий сын. В каждый внутренний узел следующего уровня записываются ключ наименьшего элемента, являющегося потомком второго сына, и ключ наименьшего элемента — потомка третьего сына, если, конечно, есть третий сын. 10
(2 -3 -4)-деревья • Сбалансированное (2 -3 -4)-дерево поиска — это либо пустое дерево, либо дерево, содержащее три типа узлов: – 2 -узлы с одним ключом, левой связью к поддереву с меньшими ключами и правой связью к поддереву с большими ключами; – 3 -узлы с двумя ключами, с левой связью к дереву с меньшими ключами, средней связью к дереву, значения ключей которых лежат между значениями ключей данного узла, и правой связью к дереву с большими ключами; – 4 -узлы с тремя ключами и четырьмя связями к деревьям, значения ключей которых определены диапазонами, образованными ключами узла. • Все листья дерева расположены на одинаковом расстоянии от корня. 11
Пример (2 -3 -4)-дерева • На этой последовательности рисунков показан результат вставки элементов с ключами А S E R C H l N G X в первоначально пустое (2 -3 -4)-дерево. 12
Преобразование (2 -3 -4)-дерева • (2 -3 -4)-дерево представляется в виде бинарных деревьев с добавлением к каждому узлу дополнительного информационного разряда для кодирования 3 -узлов и 4 узлов. • Мы будем представлять связи двумя различными типами: красными (red) связями (R-связями), которые объединяют воедино небольшие бинарные деревья, образующие 3 узлы и 4 -узлы, и черными (black) связями (В-связями), которые объединяют воедино (2 -3 -4)-дерево. 13
Анализ • До сих пор специалистам не удавалось аналитически точно проанализировать производительность (2 -3 -4)деревьев, но из эмпирически полученных результатов становится очевидным, что для балансировки деревьев используется очень мало разделений. • Как и в случае расширенных деревьев, накладные расходы, связанные с манипулированием более сложными структурами узлов, могли бы сделать алгоритмы более медленными, чем стандартные. • К счастью, существует простое представление 2 -, 3 и 4 -узлов, которое позволяет выполнять преобразования единообразно при небольших дополнительных затратах по сравнению со стандартным поиском в бинарном дереве. 14
В-деревья • В-деревом порядка n называется сильноветвящееся дерево степени 2 n+1, обладающее следующими свойствами: – 1. Каждый узел, за исключением корня, содержит не менее n и не более 2 n ключей. – 2. Корень содержит не менее одного и не более 2 n ключей. – 3. Все листья расположены на одном уровне. – 4. Каждый не листовой узел содержит число указателей на единицу больше числа ключей. – 5. Каждый не листовой узел содержит два списка: упорядоченный по возрастанию значений список ключей и соответствующий ему список указателей (для листовых узлов список указателей отсутствует). 15
пример В-дерева порядка n=2 Здравый смысл и практические соображения подсказывают, что значения n следует выбирать исходя из того, чтобы узел целиком мог быть перемещен из внешней памяти во внутреннюю (и наоборот) за одну операцию ввода-вывода. 16
достоинства В-деревьев • • высота В-дерева невелика, поэтому и число обращений к внешней памяти при поиске также невелико; сравнительно просто может быть реализован последовательный доступ, поскольку листья расположены на одном уровне; при добавлении и удалении ключей изменения ограничиваются, как правило, одним узлом, а не затрагивают всю структуру дерева, поскольку во всех узлах есть свободные поля; область влияния изменений оказывается очень узкой даже в случае, когда изменения затрагивают всю структуру дерева, так как участок, на котором сказываются изменения, располагается между непосредственным исходным и его предком. 17
Алгоритмы поиска и вставки ключей Для выполнения операции вставки ключа в В-дерево необходимо: • Шаг 1. Убедиться в том, что ключ поиска отсутствует. • Шаг 2. Если лист заполнен не полностью, произвести вставку ключа в соответствующее место списка ключей и операцию вставки завершить. • Шаг 3. Если в этом листе нет свободного места (число ключей станет равным 2 n+1), возникнет ситуация переполнения. Тогда происходит расщепление узла на два, а средний ключ переносится в исходный узел. • Шаг 4. Если в результате вставки ключа внутренний узел окажется тоже переполненным, он также расщепляется. • Шаг 5. Если ключ переноса достигнет корня и он окажется переполненным, его тоже аналогично расщепляют, что приводит к увеличению высоты дерева на единицу и 18 созданию нового корня, куда и помещается ключ переноса.
Результат вставки ключей 2 и 24 в В-дерево 19
Результат вставки ключа 12 в В-дерево 20
Алгоритмы удаления ключей При операции удаления ключа выполняются следующие три шага: Шаг 1. Найти узел, содержащий удаляемый ключ. Шаг 2. Если удаляемый ключ находится в листе, то возможны три ситуации: • 1. Если найденный лист содержит не менее (n +1) ключей, то ключ просто удаляют и операцию заканчивают. • 2. Если в найденном листе содержится ровно n ключей, но имеется соседний лист, содержащий более n ключей, то выполняется перемещение ключей из соседнего листа. Для этого необходимо: - перенести ключ, разделяющий списки ключей соседних листьев, из узла предыдущего уровня в лист, содержащий ключей меньше n; - на место удаленного ключа поместить крайний (левый или правый) ключ из соседнего листа. • 3. Если найденный и соседний с ним лист содержат по n ключей, то производят их объединение - списки ключей соседних листьев объединяются и остается один лист, а другой уничтожается. При этом один из ключей предыдущего уровня, “разделявший” 21 соседние листья, перемещается вниз.
Результат удаления ключей 7 и 22 22
Результат удаления ключа 18 23
Результат удаления ключа 31 24
Алгоритм удаления ключей Шаг 3. • Выполняется, если удаляемый ключ находится в не листовом узле. • 1. Удаляем заданный ключ и помещаем на его место ключ, следующий по величине за удаленным. Узел, содержащий этот ключ, будет самым левым ключом правого поддерева удаленного ключа. • 2. Последующие действия будут аналогичны удалению ключа из листа. 25
Результат удаления ключей 8 и 20 26
Результат удаления ключа 29 27
Разновидности В-дерева • Основные затраты приходятся на спуск вниз по дереву и однородную последовательную обработку ключей, расположенных в листьях. • Однако нельзя пренебречь и затратами, связанными с возвратом на более высокий уровень дерева, так как для этого требуется обращение к внешней памяти. • В+-дерево, рассматриваемое далее, свободно от этого недостатка. • Существуют и другие разновидности В-дерева: • В++-дерево; • В*-деревья 28
В+-дерево (В-дерево с префиксом) • В-дерево, в котором истинные значения ключей содержатся только в листьях, будем называть В+-деревом. • Во внутренних узлах В+-дерева содержатся ключи-разделители, задающие диапазон изменения ключей для поддеревьев. • Во многих случаях они совпадают с истинными значениями ключей или их частью, но это вовсе не обязательно. 29
анализ • Затраты времени на поиск по В+-дереву почти не увеличиваются, так как поиск по В+-дереву всегда заканчивается в листе. • При расщеплении листа в результате вставки ключ из листа не удаляется, а в качестве ключа переноса используется его копия. • Необходимость в изменении ключа-разделителя возникает только в случае нехватки, когда потребуются перестановка ключей и установление новых связей при балансировке. • Все другие операции, помимо рассмотренных выше, выполняются аналогично операциям над 30 В-деревьями.
Достоинства и недостатки В+-дерева • Поскольку все ключи расположены на одном уровне - в листьях, если связать их указателями, то последовательный доступ станет особенно прост при высокой скорости доступа по дереву. • Операция удаления из В+-дерева имеет то преимущество, что удаление всегда производится из листа. • Таким образом, В+-деревья во многом превосходят В-деревья; уступают же они Вдеревьям в том, что требуют несколько больше памяти для представления. 31
B++-дерево • B++-деревья устроены аналогично B+-деревьям, отличается лишь стратегия расщепления / объединения. • Мы собираем три узла, а затем рассыпаем их. – При вставке, когда нам нужен дополнительный узел, мы рассыпаем на четыре узла. – При удалении, когда узел нужно удалить, мы рассыпаем на два узла. • Симметрия операций позволяет использовать при реализации вставки и удаления одни и те же собирающие/рассыпающие функции 32
В*-деревья • Структурно В*-деревья очень близки к В-деревьям и отличаются от них только более высоким коэффициентом использования памяти. • Если для В-дерева каждый узел должен быть заполнен ключами не менее чем наполовину, то для В*-дерева требуется, чтобы каждый узел был заполнен ключами не менее чем на 2/3. • Чтобы и в случае переполнения при вставке обеспечить коэффициент заполнения каждого узла не менее 2/3, необходимо вначале объединить два соседних узла, расположенных на одном уровне, а затем расщепить его на три части. • Если повысить коэффициент использования памяти, то можно уменьшить высоту дерева, а следовательно, и число шагов поиска. Вместе с этим может оказаться, что затраты на изменение структуры дерева при вставках и удалениях возрастут. 33
Практическое применение В-деревьев Словари • Словари для очень больших файлов располагаются, как правило, во внешней памяти. Словарь представляет собой индекс исходного файла и содержит ключи и адреса записей в нем. • Для реализации словаря мы могли бы использовать красно-черные деревья, заменив указатели на смещения от начала индексного файла, и использовать обычный произвольный доступ для узлов дерева. 34
В-деревья для баз данных • В-дерево организовано как "дерево поиска", т. е. ключи хранятся в дереве в определенном порядке. Ключи, используемые для доступа к записям в файле данных, хранятся в узлах этого дерева. • Элементарные индексы хранятся в каждом узле в порядке возрастания. Первый элементарный индекс содержит наименьший ключ для данного узла; последний элементарный индекс содержит максимальный ключ для данного узла. Элементарные индексы определяются как записи, содержащие соответствующие поля 35
В-деревья в гипертекстовых базах данных • Широко распространенным подходом, применяемым для создания гипертекстовых (ГТ) баз данных (БД), является B-деревья). • Каждому ГТ объекту сопоставляются имя фиксированной длины и адрес начала объекта на диске. Средства работы с B-деревьями позволяют упорядочить имена объектов и иметь к ним быстрый доступ. • Все обращения к ГТ объектам осуществляются по имени, в B-дереве отыскивается адрес объекта, после чего осуществляется его выборка с устройства прямого доступа. При использовании B-деревьев в связи, указывающей на ГТ объект, хранится его имя. 36
Сильноветвящиеся деревья.ppt