26. Динамические структуры данных. (Степин Ю.Г.)

advertisement
КОНСПЕКТ ОБЗОРНОЙ ЛЕКЦИИ
Для студентов специальности
Т1002 «Программное обеспечение информационных технологий»
(Степин Ю.Г., старший преподаватель)
Вопрос 42 Сбалансированные деревья.
Сбалансированные и сильноветвящиеся деревья.
Сбалансированные деревья используются для реализации следующих основных операций:
1. Найти элемент по данному ключу,
2. Вставить элемент с заданным значением ключа,
3. Удалить элемент с заданным значением ключа.
Рекурсивно дерево[1] это конечное множество Т состоящее из одного или более
элементов, таких, что
a. Имеется одна специально обозначенная вершина – корень дерева.
b. Остальные вершины (исключая корень) содержаться в m попарно непересекающихся
подмножествах T1, T2,…, Tm, каждое из которых в свою очередь является деревом. Деревья T1,
T2,…, Tm называются поддеревьями данного дерева. Корни этих поддеревьев называются
потомками корня и обозначают r(Ti).
Количество поддеревьев данной вершины называется степенью этой вершины.
Вершина нулевой степени называется листом дерева.
Бинарное дерево это:
a. Одна вершина – корень.
b. Корень и единственный лист.
c. Дерево, в котором каждая вершина, не являющаяся листом имеет в точности двух
потомков.
Корень дерева – это вершина первого уровня, все потомки вершины k-го уровня
расположены на k+1 уровне.
Высота дерева – это максимальная длина пути от корня к листу или наибольший уровень
вершины в дереве.
Дерево называется упорядоченным, если для каждой вершины v на множестве ее
поддеревьев T1, T2,…, Tm задан относительный порядок. Потомков вершины в бинарном дереве
принято называть левым и правым.
Вершины дерева соответствуют записям информационной структуры. Каждой вершине v
дерева соответствует ключ K(v). В упорядоченном дереве
K(r(T1))< K(r(T2))<…< K(r(Tm))
Дерево называется сбалансированным, если для любой вершины дерева, высоты ее
поддеревьев отличаются не более чем на единицу. Бинарное дерево называется оптимальным,
если все его листья расположены на двух соседних уровнях.
Определение АВЛ-дерева.
Г.М.Адельсон-Вельский и Е.М.Ландис ввели менее строгое определение
сбалансированности и доказали, что при таком определении можно написать программы
добавления/удаления, имеющие логарифмическую сложность и сохраняющие дерево
сбалансированным.
Бинарное дерево называется сбалансированным или АВЛ-деревом, если для любой вершины
дерева, высота левого и правого поддеревьев отличается не более чем на единицу. Показатель
сбалансированности бинарного дерева, равный +1, 0, -1,означает соответственно: правое
поддерево выше, они равной высоты, левое поддерево выше. Типичная структура вершины
АВЛ-дерева:
node: = record
key: = integer;{ключ вершины}
left, right: ptr,{указатели на корни левого и правого поддеревьев}
bal: balance {-1, 0, +1- показатель сбалансированности}
end
Базовые операции над АВЛ-деревьями.
Вставка элементов.
Поиск и включение элементов в АВЛ-дерево выполняется аналогично процедуре
включения элемента в упорядоченное дерево.
proc search (n: integer; {искомый ключ}
var p: ptr; {указатель текущей вершины}
var h boolean); {признак изменения высоты поддерева}
begin
if p=nil then {включение элемента в дерево}
else if p^.key = n
then {нашли}
else if p^.key>n then begin {поиск в левом поддереве}
search (n, p^.left, h)
if h then {выросло левое поддерево, возможно,
необходима балансировка}
end
else begin{поиск в правом поддереве}
search (n, p^. right, h)
if h then {выросло правое поддерево, возможно,
необходима балансировка}
end
end;
end.
Операции вставки элементов в АВЛ-дерево могут нарушить его сбалансированность.
Это происходит, когда для некоторой вершины, у которой одно поддерево выше другого
увеличивается высота этого поддерева. Схема определения типа поворота при вставке элемента
приведена в таблице 1.
V.^Bal
Выросло левое поддерево
Выросло правое поддерево
+1
LR
RR
0
RL
-1
LL
Таблица 1 Схема определения типа поворота при вставке элемента.
С учетом зеркального отображения возможны два случая нарушения балансировки:
 Однократный поворот (LL, RR)
u
v
u
v

h

h+1
h+2

h+1
h



h+2
Схема выполнения однократного поворота, RR поворота
 Двукратный поворот (LR, RL).
u
w
v
w
h
h+1
h+2

h
2
1
v
u


h+1
h+2
2
1

Схема выполнения двукратного поворота, RL поворота
В обоих случаях высота поддерева после балансировки становиться равной высоте
поддерева до вставки элементов. Следовательно, при вставке элементов достаточно
однократной балансировки. Балансировка выполняется в вершине максимального уровня, в
которой нарушается сбалансированность.
Пример вставки элемента в дерево приведен на рис 1.
Удаление элементов.
Удаление элементов из АВЛ-дерева выполняется по схеме, аналогичной удалению
элементов из упорядоченного дерева:
 Если у удаляемой вершины менее двух потомков, то удаление вершины из АВЛдерева аналогично удалению элемента из списка.
 Если у удаляемой вершины два потомка, то она заменяется самой правой вершиной в
левом поддереве, которая удаляется из дерева.
Если высота поддерева уменьшается, то возможно нарушение сбалансированности дерева,
которое восстанавливается аналогично вставке элементов в дерево. Схема определения типа
поворота при удалении элемента приведена в таблице 2.
Bal
Уменьшилось правое поддерево Уменьшилось левое поддерево
+1
LR
RR
0
LL
-1
RL
Таблица 2. Схема определения типа поворота при удалении элемента
При выполнении балансировки высота дерева уменьшается, поэтому возможна
многократная балансировка вдоль пути от корня дерева к удаляемой вершине.
Пример удаления элемента приведен на рис 2. В данном случае выполняется двукратная
балансировка.
Оценка эффективности.
Г.М.Адельсон-Вельский и Е.М.Ландис доказали теорему, согласно которой высота АВЛдерева с N внутренними вершинами заключена между log2(N+1) и 1.4404*log2(N+2)-0.328, то
есть высота АВЛ-дерева никогда не превысит высоту идеально сбалансированного дерева
более, чем на 45%. Для больших N имеет место оценка 1.04*log2(N). Таким образом,
выполнение основных операций 1 – 3 требует порядка log2(N) сравнений. Экспериментально
выяснено, что одна балансировка приходится на каждые два включения и на каждые пять
исключений.
Определение В-дерева.
В-деревья используются для построения индекса таблиц в СУБД. Часть набора данных,
считываемая в оперативную память операцией ввода-вывода, называется страницей. Размер
страницы m = n до 2n, n - порядок дерева. В-деревья обладают следующими свойствами:
1) каждая страница, кроме корня, содержит m элементов, где n  m  2n .
2) каждая страница либо является листом, либо имеет m +1 потомка.
Замечание. Количество потомков у корня от 2 до 2n + 1.
3) все листья расположены на одном уровне.
4) Ключи на каждом листе упорядочены.
Рассмотрим схему выполнения основных операций на примере В-дерева порядка 2.
Пусть Ti ( v) - i-ый потомок вершины v, i  0, m m – количество элементов в вершине v.
Ti * (v ) поддерево с корнем в вершине Ti ( v) . Упорядоченность В-дерева означает, что для
каждой вершины v
max( K (T *i 1 (v))  Ki (v)  min( K (Ti* (v))) .
Если ключ x не найден на странице v, то возможны следующие ситуации:
1. K (v)  x  K (v) - поиск продолжается на странице Ti ( v) .
i
i 1
2. K m (v)  x - поиск продолжается на странице Tm (v) .
3. x  K0 (v) - поиск продолжается на странице T0 (v) .
Если указанная страница не существует, то элемента x не в дереве.
Базовые операции над В-дерево
Вставка элементов.
Включение элемента в дерево выполняется по следующей схеме:
1. Находится лист, в который включается элемент. Если на этой странице не более
2n элементов, то ключ включается на страницу с учетом порядка элементов.
2. Если на текущей странице более 2n элементов, то страница разделяется на 2
страницы, а n+1 элемент передается предку текущей страницы.
Пример включения элемента приведен на рис3.
Удаление элементов.
Удаление элемента из В-дерева, как и для любого дерева распадается на два случая:
1. Удаляемый элемент находится в листе – в этом случае он просто удаляется.
2. Элемент находится не в листе – его нужно заменить самым правым элементом в
левом поддереве, то есть максимальным элементом, не превосходящим
удаляемый элемент. Пусть этот элемент находится в листе P. Тогда размер листа
P уменьшается на единицу.
Если размер текущей страницы P меньше n, то выполняется балансировка: страница
P объединяется с соседней страницей Q и элементом «родительской» страницы,
указывающим на Q. Если, общее количество элементов на страницах P и Q больше
2n-1, то элементы поровну делятся между страницами, иначе страницы сливаются и
страница Q уничтожается. При этом размер «родительской» страницы уменьшается
на единицу. При необходимости повторно выполняется балансировка. Очевидно, что
балансировка может выполняться в каждой вершине, входящей в путь от корня к
листу P. Пример удаления элемента приведен на рис 4.
Оценка эффективности.
При поиске элемента в n-В-дереве, содержащем N элементов, просматривается не более
 N 1
1  log n 
 страниц. Среднее число балансировок, требующихся на одно включении не
 2 
более 1 . Недостатком В-деревьев является слабая заполняемость страниц. Поэтому, можно
n
использовать деревья, у которых каждая вершина, отличная от корня имеет не менее [(2*n-1)/3]
потомков, а корень не менее двух и не более 2* (2* n  2) / 3  1 сыновей, так называемые В*деревья.
Примеры выполнения базовых операций над АВЛ-деревьями и Вдеревьями.
9
u
3
23
v
1
5
17
13
4
21
15
11
29
w
27
19
25
33
31
35
16
Нарушена балансировка в вершине 9: коеффициент сбалансированности +1 и выросло
правое поддерево. У вершины 23 коеффициент сбалансированности -1, следовательно
выполняется RL-балансировка.
17 w
u
9
v
3
23
29
21
13
27
5
1
11
15
33
19
4
16
25
31
35
Корнем становиться вершина 17 –w, вершины u –9 и v-23 ее потомки, левое поддерево
вершины 17 становиться правым поддеревом вершины 9, правое поддерево вершины 17 –
левым поддеревом вершины 23
Рис. 1 Включение элемента 16 в дерево.
9
3
23
5
1
17
29
13
21
27
33
2
11
15
19
25
31
35
Удаляем элемент 9 . элемент 9 заменяется самым правым элементом в левом поддереве –
элемент 5, который удаляется.
5
23
3
1
17
29
13
21
27
33
2
11
15
19
25
31
35
В вершине 3 нарушена балансировка, ее показатель сбалансированности равен -1 и
уменьшилась высота правого поддерева. У вершины 1 показатель сбалансированности
равен +1, следовательно выполняется LR-балансировка .
5
2
1
23
3
17
29
13
11
21
15
27
19
25
33
31
35
В вершине 5 нарушена балансировка, ее показатель сбалансированности равен +1 и
уменьшилась высота левого поддерева,. У вершины 23 показатель сбалансированности
равен 0 следовательно выполняется RR-балансировка.
23
5
29
2
1
27
17
13
3
21
25
11
15
33
19
Результат выполнения балансировки
Рис.2 Пример удаления элемента 9.
31
35
16
4 10
1
2
6
8
22 32 38 48
12
14
18
20
24
26
28
30
34
36
40
42
44
46
50
52
54
56
51
Включение элемента 51. После включение на текущей странице 5 элементов. Она
расделяется на две страницы (50. 51) и (54, 56), а элемент 52 переносится на
«родительскую» страницу.
16
52
22 32 38 48
4 10
1
2
6
8
12
14
18
20
24
26
28
30
34
36
40
42
44
46
50
51
54
56
Операция расделения выполняется и для этой страницы. В результате на втором уровне
возникает новая страница, а ключ 38 перемещается в корень дерева.
16 38
4 10
1
2
6
8
22 32
12
14
18
20
24
26
28
30
Рис3 прмер включения элемента в В-дерево.
48 52
34
36
40
42
44
46
50
51
54
56
21 38
4 10 16
1
2
6
8
26 32
12
14
18
20
22
24
24
26
48 52
34
36
40
42
44
46
50
51
54
56
Удаляем элемент 38.
Замещаем его элементом 36. размер листа уменьшается.
Сливаем с соедней страницей и получаем страницу 24, 26, 32 34, удаляем пустую страницу
21 38
4 10 16
1
2
6
8
48 52
26
12
14
18
20
22
24
24
26
32
34
40
42
44
46
50
51
54
56
На странице 26 количество элементов меньше n.
Объединяем ее с соседней: 4, 10, 16, 21, 26
Перераспределяем элементы между страницами.
16, 38
4 10
1
2
6
8
48 52
21,26
12
14
18
20
22
24
24
26
32
34
40
42
44
46
Рис 4 Результат выполнени удаления элемента 38 из В-дерева
50
51
54
56
Download