Upload
simplepeople
View
97
Download
2
Embed Size (px)
Citation preview
Анализ комбинаторных алгоритмов
Лекция №7Элементарные
структуры данныхЧасть V
Двоичные кучи
Двоичной кучей называется древовидная структура обладающая свойством упорядоченности:x->parent->key >= x->keyт.е. значение ключа ребенка не превышает значение ключа родителя.
В дереве представляющем кучу, все уровни кроме последнего заполнены полностью. Следствием этого свойства является тот факт, что высота кучи составляет log(n).
Двоичные кучи
16
14 10
9 38 7
2 4 1
16 14 10 8 7 9 3 2 4 1
Двоичные кучи
void Heapify(A,i){ l = i->left; r = i->right; if ((l<=heapsize(A))&&(l->key=i->key))
largest = l; else largest = i; if (r<=heapsize(A))&&(r->key > largest->key))
largest = r; if (largest != i) {
Exchange(i,largest);Heapify(A,largest);
}}
Двоичные кучи
16
4 10
9 314 7
2 8 1
Двоичные кучи
16
14 10
9 34 7
2 8 1
Двоичные кучи
16
14 10
9 38 7
2 4 1
Двоичные кучи
void BuildHeap(A){ heapsize(A) = length(A); for (i=heapsize(A)/2; i>=0; i-- ) Heapify(A,i);}
void HeapSort(A){ BuildHeap(A); for (i=heapsize(A)/2; i>=0; i-- ){ heapsize(A) = heapsize(A) -1; Heapify(A,1); }}
Двоичные кучи
16
14 10
9 34 7
2 8 1
Двоичные кучи
16
14
10
9 34
7
2 8
1
Двоичные кучи
16 14
10
9
34
7
2 8
1
Сливаемые кучи
Сливаемая куча – это структура данных хранящая несколько множеств (куч), элементы которых называют вершинами.
Сливаемые кучи позволяют выполнить пять операций: MakeHeap – создание кучи, не содержащей элементов Insert(H,x) – добавление элемента в кучу Minimum(H) – возвращает минимальный элемент в куче ExtractMin(H) - возвращает минимальный и удаляет элемент Union(H1, H2) – сливает две кучи.
Биноминальные кучи
Биноминальным деревом называется дерево с порядком на детях Bk, определяемое индуктивно.
Дерево B0 состоит из единственной вершины. Дерево Bk склеено из двух экземпляров дерева
Bk-1: корень одного из них является левым ребенком корня другого.
Биноминальные кучи
Биноминальные кучи
Свойства биноминального дерева (Bk) : Содержит 2k вершин. Имеет высоту k. Имеет вершин глубины i. Имеет корень степени k, все остальные
вершины – меньшей степени. Максимальная степень вершины в
биноминальном дереве с n вершинами равна log n.
ikC
Биноминальные кучи
Биноминальная куча – это набор H биноминальных деревьев, в котором должны быть выполнены свойства: Каждое дерево обладает свойством кучи, т.е. ключ
каждой вершины не меньше ключа ее родителя. В H нет двух деревьев одного размера (с
одинаковой степенью корня)
Фибоначчиевы кучи
Фибоначчиева куча состоит из нескольких деревьев (необязательно биноминальных) корни которых объединены в список.
В каждом дереве выполняется основное свойство кучи.
В фибоначчиевой куче дети любой вершины x объединены в циклический связанный список.
Каждая вершина имеет поле degree (степень вершины) и поле mark, истинное если вершина потеряла ребенка после того, как сделалась чьим-либо ребенком.
Фибоначчиевы кучи
23 7 3 17 24
305218 38 26 46
354139
Сравнительная характеристика
Двоичные Биноминальные Фибоначчиевы
MakeHeapInsertMinimumExtractMinUnionDecreaseDelete
)1()(logn
)1(
)(n)(logn
)(logn)(logn
)1()1()1(
)1()1(
)1(
)(logn
)(logn)(logn)(lognO
)(lognO)(lognO
)(lognO
)(lognO