Сбалансированные деревья.ppt
- Количество слайдов: 40
Сбалансированные деревья Идеально сбалансированные (оптимальные) деревья АВЛ-деревья Сбалансированные по весу деревья (ВВ-деревья) Красно-черные деревья. Деревья промежутков Расширяющиеся деревья – cамонастраивающиеся структуры данных Выровненные деревья 1
Идеально сбалансированные деревья • В общем случае бинарное дерево называется идеально сбалансированным деревом, если все листья находятся на уровне h, либо на уровне h-1, где h – высота дерева минимальна и равна log 2 n+1 , т. е. почти полное бинарное дерево. – Обозначение х соответствует минимальному целому числу, большему х ( «потолок» х), a x —максимальному целому числу, меньшему х ( «пол» х) (по К. Е. Иверсону). 2
Оптимальные деревья. • Полностью сбалансированное бинарное дерево имеет минимальную высоту. Когда все ключи (аргументы) поиска равновероятны (например, цифры в различных числах), полностью сбалансированное бинарное дерево представляет собой оптимальное бинарное дерево поиска. • Однако нередки случаи, когда частоты появления ключей не равны между собой (например, символы алфавита), и при этом заранее известны. В этом случае полностью сбалансированное бинарное дерево не оптимально. 3
АВЛ-деревья • АВЛ-деревом называется сбалансированное бинарное дерево, у которого высота левого поддерева каждого узла отличается от высоты правого поддерева не более чем на 1, т. е. используется менее строгий критерий сбалансированности • (показатель сбалансированности узла) = (высота правого поддерева этого узла)—(высота левого поддерева этого узла). • В АВЛ-дереве показатель сбалансированности всех узлов равен или -1, или 0, или +1. • Если для всех узлов, за исключением листьев, показатель сбалансированности равен +1 или – 1, то такое дерево называется деревом Фибоначчи. 4
Дерево Фибоначчи 5
Область АВЛ-деревьев • Между полностью сбалансированными деревьями Фибоначчи располагаются самые разные сбалансированные АВЛ-деревья высотой • 1, 4404 log 2(n+2)-0, 328 >h > log 2(n+1). • АВЛ-дерево представляет собой структуpy, для которой любая операция поиск, вставка и удаление ключа имеет временную сложность O(log 2 n). 6
Пример АВЛ-дерева. 7
Вставка ключей в АВЛ-дерево • Вставляемый ключ займет место одного из внешних узлов дерева а, b, . . . , u, . При этом могут наблюдаться следующие случаи: – Случай с. Показатель сбалансированности улучшается. – Случаи h, i, j, k, l, m. . Показатель сбалансированности ухудшается, но свойства АВЛдерева сохраняются. – Все остальные случаи, за исключением указанных в 1 и 2, нарушают свойства АВЛ-дерева. Появляются узлы с показателем сбалансированности +2 или -2, и для сохранения свойства сбалансированности АВЛ-дерева потребуется некоторая корректировка структуры дерева. 8
Пример - вставляется ключ со значением “ 1”. • Здесь показатель сбалансированно сти узла “ 4” окажется равным — 2, и условия АВЛ-дерева перестанут удовлетворяться. Вместо узла “ 4” корнем этого поддерева можно сделать узел “ 2”, совершив поворот узлов “ 2” и “ 4” направо. 9
Пример - вставляется ключ со значением “ 3” а б в В этом случае восстановить баланс будет несколько сложнее. Вначале повернем налево узлы “ 2” и “ 3”, как показано на рис. (а) и получим структуру, показанную на рис. (б), которая аналогична структуре на рис. (а). Теперь, если узлы “ 3” и “ 4” повернуть направо, то участок дерева окажется сбалансированным, как показано на рис. (в) 10
Пример - вставляется ключ со значением “ 7” • • а) • • б) В этом случае вблизи вставленного узла сбалансированность сохраняется. Однако результат вставки сказывается выше—для узла “ 14”, показатель сбалансированности для которого становится равным — 2. Поскольку при этом узел “ 14” находится точно в таком же положении по отношению к узлу “ 10”, как и узел “ 4” по отношению к узлу “ 2” на предыдущем рис. , то, если совершить аналогичный поворот направо, получим сбалансированный участок, как показано на рис. б). Однако при этом кроме поворота, показанного на рис. б), потребуется узел “ 12” открепить от узла “ 10” и прикрепить к узлу “ 14”. Вставка ключа “ 9” приводит почти к такому же эффекту, как и вставка ключа “ 7”. 11
Пример - вставка ключа “ 11” Последовательность действий при вставке ключа “ 11” в дерево показана на рис. и, по существу, аналогична действиям, показанным на рис. при вставке ключа 3; только в этом случае также при повороте узел “ 11” необходимо открепить от узла 12” и прикрепить к узлу “ 10”. 12
Обобщение рассмотренных случаев • Если после вставки показатели сбалансированности узлов имеют одинаковый знак и отличаются только на единицу, как для узлов “К” и “J” на рис. , то восстановить баланс дерева можно однократным поворотом (включая одно переприкрепление поддерева), при этом вставка не будет оказывать влияния на другие участки дерева. • Если же после вставки показатели сбалансированности имеют разный знак, например как для узлов “K” и “J” на рис. (т. е. их разница по абсолютной величине равна 3), то можно восстановить баланс дерева двукратными поворотами трех узлов, включая узел “J” (используя два переприкрепления поддеревьев). 13
Укрупненный алгоритм вставки ключа в АВЛ-дерево и балансировки его 1. Ищем место вставки ключа; 2. Вставляем ключ путем изменения указателей у предка; 3. Проверяем балансировку узлов (при сбалансированных узлах – выход); 4. При разбалансировке узлов выявляем необходимость: – – одного вращения, выполняем эту операцию и переходим к шагу 3; двух вращений, выполняем эти операции и переходим к шагу 3; 14
Выводы • Сочетание некоторых теоретических рассуждений и эмпирических результатов позволяет сделать следующие утверждения: • Математическое ожидание значения высоты при больших n близко к значению log 2 n + 0, 25. • Вероятность того, что при вставке не потребуется дополнительная балансировка, потребуется однократный поворот или двукратный поворот, близка к значениям 2/3, 1/6 и 1/6 соответственно. • Среднее число сравнений при вставке n–го ключа в дерево выражается формулой a log 2 n + b (a, b постоянные). 15
Сбалансированные по весу деревья (ВВ-деревья) • Сбалансированные по весу деревья есть класс бинарных деревьев, в которых ограничение на высоты поддеревьев заменено ограничением на число вершин в поддеревьях. Эти деревья называют деревьями с ограниченным балансом или ВВ-деревьями • Корневым балансом дерева Tn называется величина =(nl+1)/(n+1), • где nl - количество узлов в левой ветви, • n – общее количество узлов в дереве. • 0 1/2 16
Примеры ВВ-деревьев 17
Высота ВВ-дерева • Сбалансированность по весу и сбалансированность по высоте являются независимыми критериями сбалансированности. • Высота дерева Tn из класса BB[ ] не превышает • (log(n+1)-1)/log(1/(1 - )) • Для полностью сбалансированных бинарных деревьев ( = 1/2) эта формула дает h 1/2(n) log(n+1). • Для = 1 -( 2)/2— наибольшего значения , для которого работает описываемый ниже алгоритм перестройки, имеем • h 1 -( 2)/2 (n) 2 log(n+1)+O(1). 18
Операции редактирования • Операции включения и исключения узлов осуществляются аналогично этим же операциям для АВЛ –деревьев. • Затем проверяется сбалансированность узлов (показатель баланса для ВВ-дерева) • Алгоритмы редактирования и балансировки подробно рассмотрены в учебном пособии 19
Операции балансировки 20
Алгоритм включения новой вершины в ВВ-дерево • • • • • • 1. найти путь из новой вершины w в корень; 2. упорядочить вершины пути в направлении от корня; пусть это будет последовательность i 1, i 2, …, ik 3. для j от 1 до k шаг 1 цикл 4. вычисляем баланс v вершины ij по формуле v=(S(левый потомок vij)+1)/(S(vij)+2) 5. если w включена в левое поддерево дерева T(vij) то 6. если v 1 - то. S(vij)=S(vij)+1 7. иначе если S(vij) = 2 то 8. использовать вращение без учета вершины w; 9. иначе начало, вычислить значение — баланс правого поддерева - с учетом новой вершины w; 10. если 1 - < (1 -2 )/(1 - ) то 11. применить простое вращение 12 иначе применить двойное вращение; 13. конец 14. иначе, если 1 - то 15. иначе, если S (vij) = 2 то 16. использовать простое вращение без учета вершины w; 17. иначе вычислить значение - баланс левого поддерева — с учетом новой вершины w; 18. если < (1 - 2 )/(1 - ) то 19. применить простое вращение 20. иначе применить двойное вращение; 21. конец цикла; конец 21
Сравнение деревьев Структура Число Ожидаемое сравнений число в худшем сравнений случае Трудоемкост ь восстанов ления баланса АВЛ-деревья 1. 44*log(n+1)+0. 25 0(logn) ВВ-деревья 2*log(n+1) 1. 05*log(n+1) 0(logn) Log(n+1) 0(n) Полностью сбалансиров анные деревья (ВВ[1/2]) Log(n+1) 22
Красно-черные деревья • Красно-чёрные деревья (RB-деревья) - один из типов двоичных «сбалансированных» деревьев поиска, вершины которого разделены на красные (red) и чёрные (black) и которые обладает следующими свойствами (будем называть их RB-свойствами): • 1) каждая вершина—либо красная, либо чёрная; • 2) каждый лист (nil) — чёрный; • 3) у красной вершины оба ребёнка чёрные; • 4) все пути от корня к листьям содержат одинаковое количество чёрных вершин. • Количество черных вершин от листа до заданной вершины (саму вершину не учитываем) будем называть черной высотой вершины, а количество черных вершин от листа до корня будем называть черной высотой дерева. 23
Пример красно-чёрного дерева Чёрные вершины показаны как квадратные, красные - как круглые 24
Свойства красно-чёрных деревьев • Каждая вершина красно-чёрного дерева имеет поля color (цвет), key (ключ), left (левый ребёнок), right (правый ребёнок) и р (родитель). • Красно-чёрное дерево с n внутренними вершинами (т. е. не считая m. L-листьев) имеет высоту не больше 2 log(n+1) • Специальные операции балансировки гарантируют, что глубины любых двух листьев отличаются не более чем в два раза. 25
Операции редактирования • Операции поиска , поиска минимума , поиска максимума , поиска сына и поиска родителя для красно-чёрных деревьев выполняются за время О(log 2 n). Сложнее обстоит дело с процедурами вставки и удаления. • Операции вставки и удаления выполняются на красно-чёрном дереве так же, как и на обычном дереве за время О(log 2 n), но они изменяют дерево, и результат может не обладать RB-свойствами. Чтобы восстановить эти свойства, надо перекрасить некоторые вершины и изменить структуру дерева. • Мы будем менять структуру с помощью вращений (rotations), аналогично вращениям в АВЛ-деревьях 26
Деревья промежутков • Деревом промежутков (interval tree) назовём красно-чёрное дерево, каждая вершина х которого хранит отрезок • Рассматриваемая структура данных позволяет по любому промежутку найти все события, которые пересекаются с этим промежутком, причём делает это достаточно быстро. 27
Пример дерева промежутков • а) набор из 10 отрезков (выше тот, у которого левый конец больше). б) - дерево промежутков, хранящее эти отрезки. При этом свойство упорядоченности 28 дерева выполняется для левых концов.
Расширяющиеся деревья (splay trees) • Они представляют попытку объединить выгоды от АВЛ-дерева с простым случайным двоичным деревом поиска. • Дерево расширений не хранит значение высоты; вместо этого каждый раз, когда мы имеем доступ к узлу, мы перемещаем этот узел к корню, используя АВЛ-вращения. Практически это приводит к хорошо сбалансированным деревьям с быстрым временем доступа. Фактически средняя сложность алгоритма - O(lоg n). 29
Операции редактирования • узлы, к которым часто обращаются, будут очень близко к корню. • Алгоритм формирования и редактирования деревьев расширений состоит в том, что вначале выполняются операции над деревом как над обычным бинарным деревом, а затем рассматриваемый узел с помощью соответствующих последовательных вращений перемещается в корень дерева. Процедуры левого и правого вращений аналогичны вращениям, применяемым в АВЛ-деревьях и в красно-черных деревьях. Отличие состоит в том, как применяются эти вращения. • Возможные вращения можно свести к шести случаям: 30
Пример расширения дерева в r 1 31
Выровненные деревья • Бинарное дерево называется Н-деревом, если все висячие вершины находятся на одном и том же уровне и каждая вершина с единственным потомком имеет правого соседа с двумя потомками. Н-дерево высоты h имеет, по крайней мере, (3/2)h висячих вершин. • К выровненным деревьям относятся такие классы деревьев, как H-деревья, или деревья соседства, HB-деревья, или братские деревья, и др. 32
H-дерево • добавлена может быть только висячая вершина. При добавлении новой вершины у некоторой вершины может оказаться три потомка, а при удалении может появиться вершина без потомков на уровне выше уровня висячих вершин. В обоих случаях восстановление структуры Н 33 дерева происходит с помощью алгоритма упрощения.
Приложения бинарных деревьев 34
Манипулирование арифметическими выражениями • Такие выражения можно складывать в символьной форме, перемножать, вычитать одно из другого, дифференцировать, интегрировать, сравнивать на эквивалентность и т. д. • Например (а+в)-с*d^e + а * в с ^ d e 35
алгоритм кодирования (сжатия) информации по Хаффману • Например, алфавит состоит из символов A, B, C, D и пусть им назначены коды: • A - 010, B - 100, C - 000, D - 111. • Сообщение ABACCDA кодируется 21 битом. Назначим каждому символу 2 -битовый код: A - 00, B - 01, C - 10, D - 11. Тогда кодировка сообщения будет такова: 00010010101100 (требуется 14 бит). • Попробуем найти код, который минимизирует длину закодированного сообщения. • Буквы B и D встречаются в сообщении только раз, а буква А - три раза. Выберем код, в котором букве А будет назначена более короткая строка битов, чем буквам B и D. Длина закодированного сообщения станет меньше, так короткий код встречается чаще, чем длинный. Назначим коды следующим образом: A - 0 (частота 3), B - 110 (частота 1), C - 10 (частота 2), D - 111 (частота 1). Тогда наше сообщение будет содержать 13 бит. 36
Дерево Хаффмана • Если используются коды переменной длины, то код одного символа не должен совпадать с началом кода другого символа. Такое условие должно выполняться, если раскодирование происходит слева направо. 37
Алгоритм построения кода Хаффмана • Сортируем все символы сообщения в порядке возрастания или убывания вероятности их появления в тексте; • Последовательно объединяем два символа с наименьшими вероятностями их появления в новый составной символ, вероятность появления которого полагается равной сумме вероятностей составляющих его символов; в конце концов мы построим дерево, каждый узел которого имеет суммарную вероятность всех узлов, находящихся ниже него; • Прослеживаем путь к каждому листу дерева, помечая направление к каждому узлу (например, направо - 1, налево - 0) и получаем коды Хаффмана • Для заданного распределения частот символов может существовать несколько возможных кодов Хаффмана, - это дает возможность определить каноническое дерево Хаффмана, соответствующее наиболее компактному представлению исходного текста. 38
метод кодирования Фано‑Шеннона • • • Сортируем все символы в порядке возрастания вероятности появления их в тексте; Последовательно делим отсортированное множество символов на два подмножества так, чтобы сумма вероятностей появления символов одного подмножества была примерно равна сумме вероятностей появления символов другого. Для левого подмножества каждому символу приписываем "0", для правого - "1". Дальнейшие разбиения рекурсивно повторяются до тех пор, пока все подмножества не будут состоять из одного элемента. 39
пример • Имеем сообщение ABACCDACBDE, где встречаются • А – 3, С – 3, В – 2, D – 2, E -1 A, C, B, D, E A, C A B, D, E C B D, E D E Тогда: A – 00 C – 01 B – 10 D – 110 E - 111 40
Сбалансированные деревья.ppt