АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees)...

54
Лекция 3 АВЛ-деревья (AVL trees) Курносов Михаил Георгиевич E-mail: [email protected] WWW: www.mkurnosov.net Курс «Структуры и алгоритмы обработки данных» Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Осенний семестр, 2015

Transcript of АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees)...

Page 1: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Лекция 3АВЛ-деревья (AVL trees)

Курносов Михаил Георгиевич

E-mail: [email protected]: www.mkurnosov.net

Курс «Структуры и алгоритмы обработки данных»Сибирский государственный университет телекоммуникаций и информатики (Новосибирск)Осенний семестр, 2015

Page 2: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Двоичные деревья поиска

22

Двоичное дерево поиска (binary search tree, BST) –это двоичное дерево, в котором:

1) каждый узел (node) имеет не более двух дочерних узлов (child nodes)

2) каждый узел содержитключ (key) и значение (value)

3) ключи всех узлов левого поддерева меньше значения ключа родительского узла

4) ключи всех узлов правого поддерева больше значения ключа родительского узла

15Барсук

180Тигр

200Лев

Value:

Key:

Двоичные деревья поиска используются для реализации словарей (map, associative array) и множеств (set)

Page 3: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Двоичные деревья поиска

3

60Волк

35Рысь

90Ягуар

8Лиса

15Барсук

180Тигр

200Лев

4000Слон

600Медведь

9 узлов, высота (height) = 3, глубина (depth) = 3

Value:

Key:

Min MaxГлубина 3Высота 0

Глубина 2Высота 1

Глубина 1Высота 2

Глубина 0Высота 3

Page 4: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Двоичные деревья поиска

4

1Value1

2Value2

1. Операции над BST имеют трудоемкость пропорциональную высоте h дерева

2. В среднем случае высота дерева O(logn)

3. В худшем случае элементы добавляютсяпо возрастанию (убыванию) ключей –дерево вырождается в список длины O(n)

bstree_add(1, value1)

bstree_add(2, value2)

bstree_add(3, value3)

bstree_add(4, value4)

3Value3

4Value4

NULL

NULL

NULL

Page 5: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Сбалансированное дерево поиска (self-balancing binary search tree) – дерево поиска, в котором высота поддеревьев любого узла различается не более чем на заданную константу k

Cбалансированные деревья поиска:

Красно-черные деревья (red-black trees)

АВЛ-деревья (AVL trees)

2-3-деревья (2-3 trees)

B-деревья (B-trees)

AA trees

Сбалансированные деревья поиска

5

Page 6: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

AVL-деревья

АВЛ-дерево (AVL tree) – сбалансированное по высоте двоичное дерево поиска, в котором у любой вершины высота левого и правого поддеревьев различаются не более чем на 1

x

hh - 2

h - 1

Авторы:Адельсон-Вельский Г.М., Ландис Е.М. Один алгоритм организации информации // Доклады АН СССР. – 1962. Т. 146, № 2. –C. 263–266.

Right

Left

Адельсон-Вельский Г.М. Ландис Е.М.

GNU libavl

libdict

Python avllib

avlmap

Page 7: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

AVL-деревья Georgy Adelson-Velsky, G., Evgenii Landis. An algorithm for the organization of information //

Proc. of the USSR Academy of Sciences 146, P. 263–266. English transl. by Myron J. Ricci

http://professor.ufabc.edu.br/~jesus.mena/courses/mc3305-2q-2015/AED2-10-avl-paper.pdf

Page 8: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

AVL tree

88

ОперацияСредний случай

(Average case)Худший случай

(Worst case)

Add(key, value) O(logn) O(logn)

Lookup(key) O(logn) O(logn)

Remove(key) O(logn) O(logn)

Min O(logn) O(logn)

Max O(logn) O(logn)

Сложность по памяти (space complexity): O(n)

Page 9: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

AVL-деревья

9

Основная идеяЕсли вставка или удаление элемента приводит к нарушению сбалансированности дерева, то необходимо выполнить его балансировку

Коэффициент сбалансированности узла (balance factor) –это разность высот его левого и правого поддеревьев

В АВЛ-дереве коэффициент сбалансированности любого узла принимает значения из множества {-1, 0, 1}

Высота узла (height) – это длина наибольшего пути от него до дочернего узла, являющего листом

Page 10: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Высота узла (node height)

10

10Height 3

5 20

124 7

2 10

2

1

0 0

1 0

1

Высота пустого поддерева (NULL)равна -1

Page 11: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Коэффициент сбалансированности

11

10

1

5

0

20

1

12

0

4

1

7

-1

2

0

10

0

Balance:balance(node) =

height(left) – height(right)

Высота поддерева = 1

Balance(4) = = 0 - (-1) = 1

height = 3

height = 2 height = 1

height = 1 height = 0

Page 12: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Коэффициент сбалансированности

12

10

2

5

0

20

0

4

1

7

-1

2

0

10

0

Balance:

Нарушен балансЭто не AVL-дерево

balance(node) =

height(left) – height(right)

Высота поддерева = 1

Balance(4) = = 0 - (-1) = 1

height = 3

height = 2 height = 0

height = 1

Page 13: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Балансировка дерева (rebalancing)

13

После добавления нового элемента необходимо обновить коэффициенты сбалансированности родительских узлов

Если любой родительский узел принял значение -2 или 2, то необходимо выполнить балансировку поддерева путем поворота (rotation)

Повороты:

Одиночный правый поворот (R-rotation, single right rotation)

Одиночный левый поворот (L-rotation, single left rotation)

Двойной лево-правый поворот (LR-rotation, double left-right rotation)

Двойной право-левый поворот (RL-rotation, double right-left rotation)

Page 14: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Правый поворот (R-rotation)

14

2

3

1

2

0

1

В левое поддерево узла 3 добавили элемент 1

Дерево с корнем в узле 3не сбалансированноH(Left) = 1 > H(Right) = -1

Необходимо увеличить высоту правого поддерева

Left Left Сase

Page 15: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Правый поворот (R-rotation)

15

2

3

1

2

0

1

Left Left Сase

Поворачиваем ребро,

связывающее корень и его

левый дочерний узел, вправо

Page 16: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Правый поворот (R-rotation)

16

2

3

1

2

0

1

Left Left Сase

Поворачиваем ребро,

связывающее корень и его

левый дочерний узел, вправо

0

2

0

1

0

3

Деревосбалансированно

Page 17: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Правый поворот (R-rotation)

17

P

L

T1 T2

T3

X

Правый поворот в общем случае

L

P

T2 T3X

T1 В левое поддерево вставлен элемент Х

Дерево не сбалансированноH(Left) > H(Right)

Page 18: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Правый поворот (R-rotation)

18

P

L

T1 T2

T3

X

L

P

T2 T3X

T1

P.left = L.right

L.right = P

P.height = 1 + max(P.left.height,

P.right.height)

L.height = 1 + max(L.left.height,

P.height)

Page 19: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Левый поворот (L-rotation)

19

В правое поддерево узла 1 вставлен элемент 3

Поворачиваем ребро, связывающее корень и его правый дочерний узел, влево

-2

1-1

20

3

0

2

0

1

0

3

Деревосбалансированно

Right Right Сase

Page 20: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Левый поворот (L-rotation)

20

-2

P-1

R0

x

0

2

0

1

0

3

Деревосбалансированно

P.right = R.left

R.left = P

P.height = 1 + max(P.left.height,

P.right.height) + 1

R.height = 1 + max(R.right.height,

P.height) + 1

Right Right Сase

Page 21: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Двойной лево-правый поворот (LR-rotation)

21

LR-поворот выполняется после добавления элемента в правое поддерево левого дочернего узла дерева

L

T1

R

T2 T3

X Xили

P

T4

1. L-поворот левого поддерева P

2. R-поворот нового дерева с вершиной P

Left Right Case

Page 22: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Двойной лево-правый поворот (LR-rotation)

22

LR-поворот выполняется после добавления элемента в правое поддерево левого дочернего узла дерева

L

T1

R

T2 T3

X Xили

P

T4

1. L-поворот левого поддерева P

P.left = L_rotate(P.left)

Page 23: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Двойной лево-правый поворот (LR-rotation)

23

LR-поворот выполняется после добавления элемента в правое поддерево левого дочернего узла дерева

R

T3

L

T1 T2X

X

P

T4

1. L-поворот левого поддерева P

Page 24: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Двойной лево-правый поворот (LR-rotation)

24

LR-поворот выполняется после добавления элемента в правое поддерево левого дочернего узла дерева

R

T3

L

T1 T2X

X

P

T4

2. R-поворот нового дереваc корнем P

P = R_rotate(P)

Page 25: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Двойной лево-правый поворот (LR-rotation)

25

LR-поворот выполняется после добавления элемента в правое поддерево левого дочернего узла дерева

R

T3

X

T1 T2

X

PL

T4

2. R-поворот нового дереваc корнем P

Page 26: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Двойной лево-правый поворот (LR-rotation)

26

LR-поворот выполняется после добавления элемента в правое поддерево левого дочернего узла дерева

2

3

-1

1

0

2

2

3

1

2

0

1

L-поворот

0

2

0

3

0

1

R-поворот

Page 27: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Двойной право-левый поворот (RL-rotation)

27

RL-поворот выполняется после добавления элемента в левое поддерево правого дочернего узла дерева

-2

1

1

3

0

2

L-поворот -1

2

0

3

-2

1

R-поворот

0

2

0

3

0

1

Right Left case

P.right = R_rotate(P.right)

P = L_rotate(P)

Page 28: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Повороты в АВЛ-дереве

28

Вычислительная сложность любого поворота O(1)

Любой поворот сохраняет свойства бинарного дерева

поиска (распределение ключей по левыми и правым

поддеревьям)

Page 29: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Анализ эффективности АВЛ-деревьев

29

Оценим сверху высоту h АВЛ-дерева, содержащего Nвнутренних узлов (узлов, имеющих дочерние вершины)

Обозначим через N(h) минимальное количество внутреннихузлов необходимых для формирования АВЛ-дерева высоты h

h = 0 h = 1 h = 2 h = 3

АВЛ-деревья различной высоты

N(0) = 0 N(1) = 1 N(2) = 2 N(3) = 4

Page 30: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Анализ эффективности АВЛ-деревьев

30

Значения N(h): 0, 1, 2, 4, 7, 12, 20, 33, 54, …

Видно, что

N(h) = N(h – 1) + N(h – 2) + 1, для h = 2, 3, …

Значения последовательности N(h) можно выразить

через значения последовательности Фибоначчи

𝑭𝒏 = 𝑭𝒏−𝟏 + 𝑭𝒏−𝟐, 𝐹0 = 0, 𝐹1 = 1

Значения 𝑭𝒏: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

Значения N(h): 0, 1, 2, 4, 7, 12, 20, 33, 54, …

N(h) = F(h + 2) – 1, для h ≥ 0

Page 31: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Анализ эффективности АВЛ-деревьев

31

Выразим из N(h) = F(h + 2) – 1 значение высоты hАВЛ-дерева, состоящего из N(h) внутренних узлов

По формуле Бине можно найти приближенное значение n-го члена последовательности Фибоначчи

– отношение золотого сечения (gold ratio)

Page 32: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Анализ эффективности АВЛ-деревьев

32

𝑵 𝒉 =𝝋𝒉+𝟐

𝟓− 𝟏 >

𝝋𝒉+𝟐

𝟓− 𝟐

5 𝑁 ℎ + 2 > 𝜑ℎ+2

log𝜑( 5 𝑁 ℎ + 2 ) >ℎ + 2

ℎ < log𝜑 5(𝑁 ℎ + 2) − 2

ℎ < log𝜑 5 + log𝜑(𝑁 ℎ + 2) − 2

ℎ <lg 5

lg 𝜑+

1

log2 𝜑log2(𝑁 ℎ + 2) − 2

ℎ <lg 5

lg𝜑+lg 2

lg𝜑log2(𝑁 ℎ + 2) − 2

Page 33: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Анализ эффективности АВЛ-деревьев

33

ℎ <lg 5

lg𝜑+lg 2

lg𝜑log2(𝑁 ℎ + 2) − 2

ℎ < 1.6723 + 1.44 log2(𝑁 ℎ + 2) − 2

𝒉 < 𝟏. 𝟒𝟒𝟎𝟓 𝐥𝐨𝐠𝟐 𝑵 𝒉 + 𝟐 − 𝟎. 𝟑𝟐𝟕𝟕

𝒉 = 𝑶(𝐥𝐨𝐠 𝒏 + 𝟐 )

Page 34: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Анализ эффективности АВЛ-деревьев

34

Оценка сверху высоты h(n) АВЛ-дерева

[Knuth, Vol. 3], [Wirth89]:

log2(n + 1) ≤ h(n) < 1.4405log2(n + 2) – 0.3277

Оценка сверху высоты h(n) АВЛ-дерева [Levitin2006]:

𝐥𝐨𝐠𝟐 𝒏 ≤ 𝒉 𝒏 < 𝟏. 𝟒𝟒𝟎𝟓 𝐥𝐨𝐠𝟐 𝒏 + 𝟐 − 𝟏. 𝟑𝟐𝟕𝟕

Page 35: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Реализация

35

struct avltree {

int key;

char *value;

int height;

struct avltree *left;

struct avltree *right;

};

Page 36: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

int main(){

struct avltree *tree = NULL;

tree = avltree_add(tree, 10, "10");tree = avltree_add(tree, 5, "5");tree = avltree_add(tree, 3, "3");

tree = avltree_add(tree, 11, "11");tree = avltree_add(tree, 12, "12");avltree_print(tree);

avltree_free(tree); return 0;

}

Построение AVL-дерева

36

11

5

3

10 12

Page 37: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

int main(){

struct avltree *tree = NULL;

tree = avltree_add(tree, 5, "5");tree = avltree_add(tree, 3, "3");

/* Code */

tree = avltree_delete(tree, 5);

avltree_free(tree); return 0;

}

Удаление узлов из AVL-дерева

37

Page 38: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

void avltree_free(struct avltree *tree)

{

if (tree == NULL)

return;

avltree_free(tree->left);

avltree_free(tree->right);

free(tree);

}

Удаление всех узлов из AVL-дерева

38

TFree = O(n)

11

5

3

10 12

Обход в обратном порядке(post-order traversal)

Page 39: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

struct avltree *avltree_lookup(struct avltree *tree, int key)

{while (tree != NULL) {

if (key == tree->key) {return tree;

} else if (key < tree->key) {tree = tree->left;

} else {tree = tree->right;

}}return tree;

}

Поиск узла по ключу

39

TLookup = O(logn)

Page 40: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

struct avltree *avltree_create(int key,

char *value)

{

struct avltree *node;

node = malloc(sizeof(*node));

if (node != NULL) {

node->key = key;

node->value = value;

node->left = NULL;

node->right = NULL;

node->height = 0;

}

return node;

}

Создание узла

40

TCreate = O(1)

Page 41: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

int avltree_height(struct avltree *tree)

{

return (tree != NULL) ? tree->height : -1;

}

int avltree_balance(struct avltree *tree)

{

return avltree_height(tree->left) –

avltree_height(tree->right);

}

Высота и баланс узла (поддерева)

41

THeight = O(1)

TBalance = O(1)

Page 42: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

struct avltree *avltree_add(

struct avltree *tree, int key, char *value)

{

if (tree == NULL) {

/* Insert new item */

return avltree_create(key, value);

}

Добавление узла

42

Page 43: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

if (key < tree->key) {

/* Insert into left subtree */

tree->left = avltree_add(tree->left,

key, value);

if (avltree_height(tree->left) –

avltree_height(tree->right) == 2)

{

/* Subtree is unbalanced */

if (key < tree->left->key) {

/* Left left case */

tree = avltree_right_rotate(tree);

} else {

/* Left right case */

tree = avltree_leftright_rotate(tree);

}

}

}

Добавление узла (продолжение)

43

Page 44: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

else if (key > tree->key) {/* Insert into right subtree */tree->right = avltree_add(tree->right,

key, value);if (avltree_height(tree->right) -

avltree_height(tree->left) == 2) {

/* Subtree is unbalanced */if (key > tree->right->key) {

/* Right right case */tree = avltree_left_rotate(tree);

} else {/* Right left case */tree = avltree_rightleft_rotate(tree);

}}

}

Добавление узла (продолжение)

44

Page 45: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

tree->height =

imax2(avltree_height(tree->left),

avltree_height(tree->right)) + 1;

return tree;

}

Добавление узла (окончание)

45

TAdd = O(logn)

Поиск листа для вставки нового элемента выполняется за время O(logn)

Повороты выполняются за время O(1), их количество не может превышать O(logn) при подъеме от нового элемента к корню (высота AVL-дерева O(logn))

Page 46: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

struct avltree *avltree_right_rotate(

struct avltree *tree)

{

struct avltree *left;

left = tree->left;

tree->left = left->right;

left->right = tree;

tree->height = imax2(

avltree_height(tree->left),

avltree_height(tree->right)) + 1;

left->height = imax2(

avltree_height(left->left),

tree->height) + 1;

return left;

}

R-поворот (left left case)

46

T

L

X

Page 47: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

struct avltree *avltree_left_rotate(

struct avltree *tree)

{

struct avltree *right;

right = tree->right;

tree->right = right->left;

right->left = tree;

tree->height = imax2(

avltree_height(tree->left),

avltree_height(tree->right)) + 1;

right->height = imax2(

avltree_height(right->right),

tree->height) + 1;

return right;

}

L-поворот (right right case)

47

T

R

X

Page 48: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

struct avltree *avltree_leftright_rotate(

struct avltree *tree)

{

tree->left = avltree_left_rotate(tree->left);

return avltree_right_rotate(tree);

}

LR-поворот (left right case)

48

Page 49: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

struct avltree *avltree_rightleft_rotate(

struct avltree *tree)

{

tree->right = avltree_right_rotate(tree->right);

return avltree_left_rotate(tree);

}

RL-поворот (right left case)

49

Page 50: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

void avltree_print_dfs(struct avltree *tree, int level)

{

int i;

if (tree == NULL)

return;

for (i = 0; i < level; i++)

printf(" ");

printf("%d\n", tree->key);

avltree_print_dfs(tree->left, level + 1);

avltree_print_dfs(tree->right, level + 1);

}

Вывод дерева на экран

50

Page 51: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

tree = avltree_add(tree, 10, "10");

tree = avltree_add(tree, 5, "5");

tree = avltree_add(tree, 3, "3");

tree = avltree_add(tree, 11, "11");

tree = avltree_add(tree, 12, "12");

avltree_print_dfs(tree, 0);

Вывод дерева на экран

51

5

3

11

10

12

11

5

3

10 12

Page 52: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Удаление элемента выполняется аналогично добавлению

После удаления может нарушиться баланс нескольких

родительских вершин

После удаления вершины может потребоваться

порядка O(logn) поворотов поддеревьев

Удаление элемента

52

Вирт Н. Алгоритмы и структуры данных. – М.: Мир, 1989.[Глава 4.5, С. 272—286]

Page 53: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

С каждым узлом АВЛ-дерева ассоциирован флаг deleted

При удалении узла находим его в дереве и устанавливаем флаг deleted = 1 (реализуется за время O(logn))

При вставке нового узла с таким же ключом как и у удалённого элемента, устанавливаем у последнего флаг deleted = 0 (в поле данных копируем новое значение)

При достижении порогового значения количества узлов с флагом deleted = 1 создаем новое АВЛ-деревосодержащее все не удалённые узлы (deleted = 0)

Поиск не удалённых элементов и их вставка в новое АВЛ-дерево реализуется за время O(nlogn)

Ленивое удаление элементов (lazy deletion)

53

Page 54: АВЛ деревья (AVL trees) · Лекция 3 АВЛ-деревья(AVL trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: Курс «Структуры

Литература

54

1. Левитин А.В. Алгоритмы: введение в разработку и анализ. – М.: Вильямс, 2006. – 576 с. (С. 267-271)

2. Вирт Н. Алгоритмы и структуры данных. – М.: Мир, 1989. –360 с. (С. 272-286)

3. Кнут Д. Искусство программирования, Том 3. Сортировка и поиск. – М.: Вильямс, 2007. – 824 с.

4. AVL-деревья // Сайт RSDN.ru. –URL: http://www.rsdn.ru/article/alg/bintree/avl.xml

5. To Google:

“avl tree” || “avl tree ext:pdf” || “avl tree ext:ppt”