- •Поиск и включение для деревьев
- •Исключение из деревьев
- •Сбалансированные деревья
- •Включение элементов в сбалансированное дерева.
- •1 Случай
- •2 Случай
- •Исключение из балансированного дерева (авл)
- •Критерии и оценки алгоритма. Общие методы.
- •Асимптотические характеристики
- •Роль и методы в снижении трудоемкости решения задачи
- •Структура данных для описания решетки.
- •Частные характеристики качества алгоритмов
- •Увеличение быстродействия программ
- •Хеширование
- •Хеш таблицы.
- •Хеш функции
- •Двойное хеширование
- •Идеальное хеширование
- •Алгоритмы для работы с графами
- •Деревья поиска в ширину
- •Поиск в глубину
- •Стягивающие или остовные деревья
- •Минимальное остовное дерево
- •Эйлоровый цикл
- •Гомельтоновый цикл
- •Кротчайшие пути в ориентированных графах.
- •Комбинаторика
Включение элементов в сбалансированное дерева.
Пусть включение L приведет к увеличение на единицу его высоты. Пусть была такая позиция
R L,R
1) HL=Hk->hL>hr но дерево остается сбалансированным
2) HL<Hr-> HL=HR
3) hL>hR -> критерии сбалансированности нарушается. Дерево необходимо перестраивать
Существуют две различные ситуации, требующие подхода. Остальные мб выведены из двух на основе симметрии.
1) B A
A B
1 Случай
Пр.
8 4
4 10 2 8
2 6 1 6 10
1
2) С В
А А С
В
2 Случай
Алгоритм включения и сбалансированности зависит от организации дерева. Можно хранить показатель сбалансированности каждой вершине.
Type ptr=^Node; Balance=-1..+1 Node=record key:integer; count:word; left,right:ptr; bal:balance; end;
Показатель сбалансированности будем интерпретировать(показывать) как разность между высотой R и L.
Процесс включения вершины состоит из 3х частей.
Проход по пути поиска (пока не убедимся, что ключа в дереве нет)
Включение новой вершины в определенную точку и определяем результирующий показатель сбалансированности.
Отступление по пути поиска (назад с проверкой) и проверка в каждой вершине показателя сбалансирования, если надо, то балансировка.
За основу возьмем процедуру search для бинарного дерева. Добавляем в нее нужные действия и в параметре включаем показатель баланса типа Boolean. h указывает, что высота дерева увеличилась. Перед включением мы в поддереве должны различать ситуации.
HL<HR p^.bal=+1
Тогда предыдущая несбалансированность уравновешивается.
HL=HR
P^bal=0
Тогда левое поддерево перевесит.
HL<HR p^.bal=-1
Необходима балансировка. Если левое поддерево выше правого, то случай баланса 1, иначе случай 2.
Пр. Рассмотрим дерево, содержащая 2 вершины.
4 5
5 простой RR поворот 4 7
7 2
1 (баланс нарушен)
5
2 7 4
1 4 сложный LR повотор 2 5
3 1 3 7
6
4
2 6 RL
1 3 5 7
(4) блок схема включения АВЛ дерева
Procedure Search (x:integer; var p:ptr; var h:Boolean); var p1,p2:ptr;
P=nil
Getmem(p,sizeof(node)) h=true p^.key=x; p^.count=1; p^.left=nil; p^.right=nil; p^.bal=0;
P^.key>x
Search(x,p^.left);
H=true
- +
баланс
P^.bal=1
P^.bal=0
P^.bal=-1
+ + +
P^.bal=0 h=false
P^.bal=-1
P1=p^.left
м
P1.bal=-1
{LR}
P2=p1.^right p1^.right=p2^.left p2^.left=p1 p^.left=p2^.right p2^.right=p
P^.left=p1^.right p1^.right=p; p^.bal=0 p=p1
{LL}
P2^.bal=-1
P^.bal=0 h=false
= - {конец case}
P^.bal=1
P^.bal=0
P2^.bal=+1
P1^.bal=0
P1^.bal=-1
P=p2
B
P^.key<x
-
P^.count=p^.count+1
+
End search
Search(x,p^.right,h)
С
(правая ветвь)
H=true
+
P^.bal=-1
P^.bal=0
P^.bal=+1
Баланс
P^.bal=0 h=false
P^.bal=1
p1=p^.right
P1^.bal=1
RL
(RR)
p^.right=p1^.left p1^.left=p p1^.bal=0 p=p1
B
P2^.bal=1
P2^.bal=-1
P^.bal=0
P^.bal=0 h=false
{end case} {end then} С