- •Поиск и включение для деревьев
- •Исключение из деревьев
- •Сбалансированные деревья
- •Включение элементов в сбалансированное дерева.
- •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} С
