SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
Лекция 7
Бинарные кучи (пирамиды)
Курносов Михаил Георгиевич
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Курс «Структуры и алгоритмы обработки данных»
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск)
Весенний семестр, 2015
2
Значение (value) Приоритет (priority)
Слон 3
Кит 1
Лев 15
Очередь с приоритетом (priority queue)
 Очередь с приоритетом (priority queue) –
очередь, в которой элементы имеют приоритет (вес);
первым извлекается элемент с наибольшим приоритетом (ключом)
 Поддерживаемые операции:
 Insert – добавление элемента в очередь
 Max – возвращает элемент с максимальным приоритетом
 ExtractMax – удаляет из очереди элемент с максимальным
приоритетом
 IncreaseKey – изменяет значение приоритета заданного элемента
 Merge – сливает две очереди в одну
Бинарная куча – пирамида (binary heap)
3
 Бинарная куча (пирамида, сортирующее дерево, binary heap) –
это двоичное дерево, удовлетворяющее следующим условиям:
 Приоритет любой вершины не меньше ( ≥ ), приоритета ее
потомков
 Дерево является полным двоичным деревом
(complete binary tree) – все уровни заполнены слева направо
(возможно за исключением последнего)
Бинарная куча – пирамида (binary heap)
4
Невозрастающая пирамида
max-heap
Приоритет любой вершины не
меньше (≥),
приоритета потомков
Неубывающая пирамида
min-heap
Приоритет любой вершины
не больше (≤),
приоритета потомков
max min
Реализация бинарной кучи на основе массива
5
2 4
8 7
1
9 3
14 10
16
max-heap (10 элементов)
16 14 10 8 7 9 3 2 4 1
Массив H[1..14] приоритетов (ключей):
 Корень дерева храниться в ячейке 𝐻[1] – максимальный элемент
 Индекс родителя узла i: 𝑃𝑎𝑟𝑒𝑛𝑡 𝑖 = 𝑖/2
 Индекс левого дочернего узла: 𝐿𝑒𝑓𝑡 𝑖 = 2𝑖
 Индекс правого дочернего узла: 𝑅𝑖𝑔ℎ𝑡 𝑖 = 2𝑖 + 1
𝐻 𝑃𝑎𝑟𝑒𝑛𝑡 𝑖 ≥ 𝐻[𝑖]
Реализация бинарной кучи на основе массива
6
struct heapnode {
int key; /* Priority (key) */
char *value; /* Data */
};
struct heap {
int maxsize; /* Array size */
int nnodes; /* Number of keys */
struct heapnode *nodes; /* Nodes: [0..maxsize] */
};
struct heap *heap_create(int maxsize)
{
struct heap *h;
h = malloc(sizeof(*h));
if (h != NULL) {
h->maxsize = maxsize;
h->nnodes = 0;
/* Heap nodes [0, 1, ..., maxsize] */
h->nodes = malloc(sizeof(*h->nodes) * (maxsize + 1));
if (h->nodes == NULL) {
free(h);
return NULL;
}
}
return h;
}
Создание пустой кучи
7
TCreate = O(1)
void heap_free(struct heap *h)
{
free(h->nodes);
free(h);
}
void heap_swap(struct heapnode *a,
struct heapnode *b)
{
struct heapnode temp;
temp = *a;
*a = *b;
*b = temp;
}
Удаление кучи
8
Поиск максимального элемента
9
2 4
8 7
1
9 3
14 10
16
max-heap (10 элементов)
16 14 10 8 7 9 3 2 4 1
Массив H[1..14] приоритетов (ключей):
Максимальный
элемент хранится
в корне max-heap
 Корень дерева храниться в ячейке 𝐻[1] – максимальный элемент
 Индекс родителя узла i: 𝑃𝑎𝑟𝑒𝑛𝑡 𝑖 = 𝑖/2
 Индекс левого дочернего узла: 𝐿𝑒𝑓𝑡 𝑖 = 2𝑖
 Индекс правого дочернего узла: 𝑅𝑖𝑔ℎ𝑡 𝑖 = 2𝑖 + 1
𝐻 𝑃𝑎𝑟𝑒𝑛𝑡 𝑖 ≥ 𝐻[𝑖]
Поиск максимального элемента
10
struct heapnode *heap_max(struct heap *h)
{
if (h->nnodes == 0)
return NULL;
return &h->nodes[1];
} TMax = O(1)
Вставка элемента в бинарную кучу
11Вставка элемента с приоритетом 15 [CLRS, Глава 6]
15
15 15
nnodes++; nodes[nnodes] = 15
15 < 16
15 > 7 => swap(15, 7)
15 > 14 => swap(15, 14)
Вставка элемента в бинарную кучу
12
int heap_insert(struct heap *h, int key, char *value)
{
if (h->nnodes >= h->maxsize) {
/* Heap overflow */
return -1;
}
h->nnodes++;
h->nodes[h->nnodes].key = key;
h->nodes[h->nnodes].value = value;
for (int i = h->nnodes; i > 1 &&
h->nodes[i].key > h->nodes[i / 2].key; i = i / 2)
{
heap_swap(&h->nodes[i], &h->nodes[i / 2]);
}
return 0;
} TInsert = O(logn)
Удаление максимального элемента
13
Заменяем
корень листом
Восстанавливаем
свойства кучи
heap_heapify(H, 1)
Удаление максимального элемента
14
struct heapnode heap_extract_max(struct heap *h)
{
if (h->nnodes == 0)
return (struct heapnode){0, NULL};
struct heapnode maxnode = h->nodes[1];
h->nodes[1] = h->nodes[h->nnodes];
h->nnodes--;
heap_heapify(h, 1);
return maxnode;
}
Восстановление свойств кучи (max-heap)
15
void heap_heapify(struct heap *h, int index)
{
for (;;) {
int left = 2 * index;
int right = 2 * index + 1;
// Find largest key: A[index], A[left] and A[right]
int largest = index;
if (left <= h->nnodes &&
h->nodes[left].key > h->nodes[index].key)
{ largest = left; }
if (right <= h->nnodes &&
h->nodes[right].key > h->nodes[largest].key)
{ largest = right; }
if (largest == index)
break;
heap_swap(&h->nodes[index], &h->nodes[largest]);
index = largest;
}
} THeapify = O(logn)
Увеличение ключа
16
int heap_increase_key(struct heap *h, int index, int key)
{
if (h->nodes[index].key > key)
return -1;
h->nodes[index].key = key;
for ( ; index > 1 &&
h->nodes[index].key > h->nodes[index / 2].key;
index = index / 2)
{
heap_swap(&h->nodes[index], &h->nodes[index / 2]);
}
return index;
} TIncrease = O(logn)
int main()
{
struct heap *h;
struct heapnode node;
h = heap_create(100);
heap_insert(h, 16, "16");
heap_insert(h, 14, "14");
heap_insert(h, 10, "10");
heap_insert(h, 8, "8");
heap_insert(h, 7, "7");
heap_insert(h, 9, "9");
heap_insert(h, 3, "3");
heap_insert(h, 2, "2");
heap_insert(h, 4, "4");
heap_insert(h, 1, "1");
node = heap_extract_max(h);
printf("Item: %dn", node.key);
int i = heap_increase_key(h, 9, 100);
heap_free(h);
return 0;
}
Работа с бинарной кучей
17
Сортировка на базе бинарной кучи
18
 На основе бинарной кучи можно реализовать алгоритм
сортировки с вычислительной сложностью O(nlogn)
в худшем случае
Как ?
Сортировка на базе бинарной кучи
19
 На основе бинарной кучи можно реализовать алгоритм
сортировки с вычислительной сложностью O(nlogn)
в худшем случае
Как ?
function HeapSort(v[1:n])
h = CreateBinaryHeap(n)
for i = 1 to n do
HeapInsert(h, v[i], v[i])
end for
for i = 1 to n do
v[i] = HeapRemoveMax(h)
end for
end function
T1 = O(1)
T2 = O(logn)
T3 = O(logn)
Сортировка на базе бинарной кучи
20
 На основе бинарной кучи можно реализовать алгоритм
сортировки с вычислительной сложностью O(nlogn)
в худшем случае
Как ?
function HeapSort(v[1:n])
h = CreateBinaryHeap(n)
for i = 1 to n do
HeapInsert(h, v[i], v[i])
end for
for i = 1 to n do
v[i] = HeapRemoveMax(h)
end for
end function
T1 = O(1)
T2 = O(logn)
T3 = O(logn)
THeapSort = 1 + nlogn + nlogn = O(nlogn)
Построение бинарной кучи
21
 Дан неупорядоченный массив A длины n
 Требуется построить из его элементов бинарную кучу
Построение бинарной кучи (v1)
22
 Дан неупорядоченный массив A длины n
 Требуется построить из его элементов бинарную кучу
function BuildHeap(A[1:n])
h = CreateBinaryHeap(n) // O(1)
for i = 1 to n do
HeapInsert(h, A[i], A[i]) // O(logn)
end for
end function TBuildHeap = O(nlogn)
Построение бинарной кучи (v2)
23
 Дан неупорядоченный массив A длины n
 Требуется построить из его элементов бинарную кучу
function MaxHeapify(A[1:n], i)
left = 2 * i // left sub heap
right = 2 * i + 1 // right sub heap
largest = i
if left <= n and A[left] > A[i] then
largest = left
if right <= n and A[right] > A[largest] then
largest = right
if largest != i then
heap_swap(A[i], A[largest])
MaxHeapify(A, largest)
end if
end function
function BuildMaxHeap(A[1:n])
h = CreateBinaryHeap(n) // O(1)
for i = ⌊n / 2⌋ downto 1 do
MaxHeapify(A, i) // O(h)
end function
TBuildHeap = O(n)
Доказательство
см. в [CLRS, C. 187]
Очередь с приоритетом (priority queue)
24
 В таблице приведены трудоемкости операций очереди
с приоритетом (в худшем случае, worst case)
 Символом ‘*’ отмечена амортизированная сложность операций
Операция
Binary
heap
Binomial
heap
Fibonacci
heap
Pairing
heap
Brodal
heap
FindMin Θ(1) O(logn) Θ(1) Θ(1)* Θ(1)
DeleteMin Θ(logn) Θ(logn) O(logn)* O(logn)* O(logn)
Insert Θ(logn) O(logn) Θ(1) Θ(1)* Θ(1)
DecreaseKey Θ(logn) Θ(logn) Θ(1)* O(logn)* Θ(1)
Merge/Union Θ(n) Ω(logn) Θ(1) Θ(1)* Θ(1)
Домашнее чтение
25
 Анализа вычислительной сложности построения бинарной
кучи (Build-Max-Heap) за время O(n)
 [CLRS, Глава 6]
 http://en.wikipedia.org/wiki/Binary_heap#Building_a_heap

Contenu connexe

Tendances

Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Mikhail Kurnosov
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очередиMikhail Kurnosov
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Technopark
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовMikhail Kurnosov
 

Tendances (20)

Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очереди
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимости
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
 

En vedette

Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаMikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыMikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеЛекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Olga Maksimenkova
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачиЛекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачиMikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Mikhail Kurnosov
 

En vedette (17)

Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеЛекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графе
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачиЛекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачи
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)
 

Similaire à Лекция 7. Бинарные кучи. Пирамидальная сортировка

Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Technopark
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
 
Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1simple_people
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Mikhail Kurnosov
 
Обработка коллекций. Единая суть и множество проявлений
Обработка коллекций. Единая суть и множество проявленийОбработка коллекций. Единая суть и множество проявлений
Обработка коллекций. Единая суть и множество проявленийcorehard_by
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Mikhail Kurnosov
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Mikhail Kurnosov
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Yandex
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноOpen-IT
 
03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетамиFedor Tsarev
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 
Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Technopark
 

Similaire à Лекция 7. Бинарные кучи. Пирамидальная сортировка (20)

Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
лекция 3
лекция 3лекция 3
лекция 3
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
Progr labrab-4-2013-c++
Progr labrab-4-2013-c++Progr labrab-4-2013-c++
Progr labrab-4-2013-c++
 
Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
 
Обработка коллекций. Единая суть и множество проявлений
Обработка коллекций. Единая суть и множество проявленийОбработка коллекций. Единая суть и множество проявлений
Обработка коллекций. Единая суть и множество проявлений
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатно
 
03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3
 

Plus de Mikhail Kurnosov

Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 

Plus de Mikhail Kurnosov (12)

Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 

Лекция 7. Бинарные кучи. Пирамидальная сортировка

  • 1. Лекция 7 Бинарные кучи (пирамиды) Курносов Михаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс «Структуры и алгоритмы обработки данных» Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Весенний семестр, 2015
  • 2. 2 Значение (value) Приоритет (priority) Слон 3 Кит 1 Лев 15 Очередь с приоритетом (priority queue)  Очередь с приоритетом (priority queue) – очередь, в которой элементы имеют приоритет (вес); первым извлекается элемент с наибольшим приоритетом (ключом)  Поддерживаемые операции:  Insert – добавление элемента в очередь  Max – возвращает элемент с максимальным приоритетом  ExtractMax – удаляет из очереди элемент с максимальным приоритетом  IncreaseKey – изменяет значение приоритета заданного элемента  Merge – сливает две очереди в одну
  • 3. Бинарная куча – пирамида (binary heap) 3  Бинарная куча (пирамида, сортирующее дерево, binary heap) – это двоичное дерево, удовлетворяющее следующим условиям:  Приоритет любой вершины не меньше ( ≥ ), приоритета ее потомков  Дерево является полным двоичным деревом (complete binary tree) – все уровни заполнены слева направо (возможно за исключением последнего)
  • 4. Бинарная куча – пирамида (binary heap) 4 Невозрастающая пирамида max-heap Приоритет любой вершины не меньше (≥), приоритета потомков Неубывающая пирамида min-heap Приоритет любой вершины не больше (≤), приоритета потомков max min
  • 5. Реализация бинарной кучи на основе массива 5 2 4 8 7 1 9 3 14 10 16 max-heap (10 элементов) 16 14 10 8 7 9 3 2 4 1 Массив H[1..14] приоритетов (ключей):  Корень дерева храниться в ячейке 𝐻[1] – максимальный элемент  Индекс родителя узла i: 𝑃𝑎𝑟𝑒𝑛𝑡 𝑖 = 𝑖/2  Индекс левого дочернего узла: 𝐿𝑒𝑓𝑡 𝑖 = 2𝑖  Индекс правого дочернего узла: 𝑅𝑖𝑔ℎ𝑡 𝑖 = 2𝑖 + 1 𝐻 𝑃𝑎𝑟𝑒𝑛𝑡 𝑖 ≥ 𝐻[𝑖]
  • 6. Реализация бинарной кучи на основе массива 6 struct heapnode { int key; /* Priority (key) */ char *value; /* Data */ }; struct heap { int maxsize; /* Array size */ int nnodes; /* Number of keys */ struct heapnode *nodes; /* Nodes: [0..maxsize] */ };
  • 7. struct heap *heap_create(int maxsize) { struct heap *h; h = malloc(sizeof(*h)); if (h != NULL) { h->maxsize = maxsize; h->nnodes = 0; /* Heap nodes [0, 1, ..., maxsize] */ h->nodes = malloc(sizeof(*h->nodes) * (maxsize + 1)); if (h->nodes == NULL) { free(h); return NULL; } } return h; } Создание пустой кучи 7 TCreate = O(1)
  • 8. void heap_free(struct heap *h) { free(h->nodes); free(h); } void heap_swap(struct heapnode *a, struct heapnode *b) { struct heapnode temp; temp = *a; *a = *b; *b = temp; } Удаление кучи 8
  • 9. Поиск максимального элемента 9 2 4 8 7 1 9 3 14 10 16 max-heap (10 элементов) 16 14 10 8 7 9 3 2 4 1 Массив H[1..14] приоритетов (ключей): Максимальный элемент хранится в корне max-heap  Корень дерева храниться в ячейке 𝐻[1] – максимальный элемент  Индекс родителя узла i: 𝑃𝑎𝑟𝑒𝑛𝑡 𝑖 = 𝑖/2  Индекс левого дочернего узла: 𝐿𝑒𝑓𝑡 𝑖 = 2𝑖  Индекс правого дочернего узла: 𝑅𝑖𝑔ℎ𝑡 𝑖 = 2𝑖 + 1 𝐻 𝑃𝑎𝑟𝑒𝑛𝑡 𝑖 ≥ 𝐻[𝑖]
  • 10. Поиск максимального элемента 10 struct heapnode *heap_max(struct heap *h) { if (h->nnodes == 0) return NULL; return &h->nodes[1]; } TMax = O(1)
  • 11. Вставка элемента в бинарную кучу 11Вставка элемента с приоритетом 15 [CLRS, Глава 6] 15 15 15 nnodes++; nodes[nnodes] = 15 15 < 16 15 > 7 => swap(15, 7) 15 > 14 => swap(15, 14)
  • 12. Вставка элемента в бинарную кучу 12 int heap_insert(struct heap *h, int key, char *value) { if (h->nnodes >= h->maxsize) { /* Heap overflow */ return -1; } h->nnodes++; h->nodes[h->nnodes].key = key; h->nodes[h->nnodes].value = value; for (int i = h->nnodes; i > 1 && h->nodes[i].key > h->nodes[i / 2].key; i = i / 2) { heap_swap(&h->nodes[i], &h->nodes[i / 2]); } return 0; } TInsert = O(logn)
  • 13. Удаление максимального элемента 13 Заменяем корень листом Восстанавливаем свойства кучи heap_heapify(H, 1)
  • 14. Удаление максимального элемента 14 struct heapnode heap_extract_max(struct heap *h) { if (h->nnodes == 0) return (struct heapnode){0, NULL}; struct heapnode maxnode = h->nodes[1]; h->nodes[1] = h->nodes[h->nnodes]; h->nnodes--; heap_heapify(h, 1); return maxnode; }
  • 15. Восстановление свойств кучи (max-heap) 15 void heap_heapify(struct heap *h, int index) { for (;;) { int left = 2 * index; int right = 2 * index + 1; // Find largest key: A[index], A[left] and A[right] int largest = index; if (left <= h->nnodes && h->nodes[left].key > h->nodes[index].key) { largest = left; } if (right <= h->nnodes && h->nodes[right].key > h->nodes[largest].key) { largest = right; } if (largest == index) break; heap_swap(&h->nodes[index], &h->nodes[largest]); index = largest; } } THeapify = O(logn)
  • 16. Увеличение ключа 16 int heap_increase_key(struct heap *h, int index, int key) { if (h->nodes[index].key > key) return -1; h->nodes[index].key = key; for ( ; index > 1 && h->nodes[index].key > h->nodes[index / 2].key; index = index / 2) { heap_swap(&h->nodes[index], &h->nodes[index / 2]); } return index; } TIncrease = O(logn)
  • 17. int main() { struct heap *h; struct heapnode node; h = heap_create(100); heap_insert(h, 16, "16"); heap_insert(h, 14, "14"); heap_insert(h, 10, "10"); heap_insert(h, 8, "8"); heap_insert(h, 7, "7"); heap_insert(h, 9, "9"); heap_insert(h, 3, "3"); heap_insert(h, 2, "2"); heap_insert(h, 4, "4"); heap_insert(h, 1, "1"); node = heap_extract_max(h); printf("Item: %dn", node.key); int i = heap_increase_key(h, 9, 100); heap_free(h); return 0; } Работа с бинарной кучей 17
  • 18. Сортировка на базе бинарной кучи 18  На основе бинарной кучи можно реализовать алгоритм сортировки с вычислительной сложностью O(nlogn) в худшем случае Как ?
  • 19. Сортировка на базе бинарной кучи 19  На основе бинарной кучи можно реализовать алгоритм сортировки с вычислительной сложностью O(nlogn) в худшем случае Как ? function HeapSort(v[1:n]) h = CreateBinaryHeap(n) for i = 1 to n do HeapInsert(h, v[i], v[i]) end for for i = 1 to n do v[i] = HeapRemoveMax(h) end for end function T1 = O(1) T2 = O(logn) T3 = O(logn)
  • 20. Сортировка на базе бинарной кучи 20  На основе бинарной кучи можно реализовать алгоритм сортировки с вычислительной сложностью O(nlogn) в худшем случае Как ? function HeapSort(v[1:n]) h = CreateBinaryHeap(n) for i = 1 to n do HeapInsert(h, v[i], v[i]) end for for i = 1 to n do v[i] = HeapRemoveMax(h) end for end function T1 = O(1) T2 = O(logn) T3 = O(logn) THeapSort = 1 + nlogn + nlogn = O(nlogn)
  • 21. Построение бинарной кучи 21  Дан неупорядоченный массив A длины n  Требуется построить из его элементов бинарную кучу
  • 22. Построение бинарной кучи (v1) 22  Дан неупорядоченный массив A длины n  Требуется построить из его элементов бинарную кучу function BuildHeap(A[1:n]) h = CreateBinaryHeap(n) // O(1) for i = 1 to n do HeapInsert(h, A[i], A[i]) // O(logn) end for end function TBuildHeap = O(nlogn)
  • 23. Построение бинарной кучи (v2) 23  Дан неупорядоченный массив A длины n  Требуется построить из его элементов бинарную кучу function MaxHeapify(A[1:n], i) left = 2 * i // left sub heap right = 2 * i + 1 // right sub heap largest = i if left <= n and A[left] > A[i] then largest = left if right <= n and A[right] > A[largest] then largest = right if largest != i then heap_swap(A[i], A[largest]) MaxHeapify(A, largest) end if end function function BuildMaxHeap(A[1:n]) h = CreateBinaryHeap(n) // O(1) for i = ⌊n / 2⌋ downto 1 do MaxHeapify(A, i) // O(h) end function TBuildHeap = O(n) Доказательство см. в [CLRS, C. 187]
  • 24. Очередь с приоритетом (priority queue) 24  В таблице приведены трудоемкости операций очереди с приоритетом (в худшем случае, worst case)  Символом ‘*’ отмечена амортизированная сложность операций Операция Binary heap Binomial heap Fibonacci heap Pairing heap Brodal heap FindMin Θ(1) O(logn) Θ(1) Θ(1)* Θ(1) DeleteMin Θ(logn) Θ(logn) O(logn)* O(logn)* O(logn) Insert Θ(logn) O(logn) Θ(1) Θ(1)* Θ(1) DecreaseKey Θ(logn) Θ(logn) Θ(1)* O(logn)* Θ(1) Merge/Union Θ(n) Ω(logn) Θ(1) Θ(1)* Θ(1)
  • 25. Домашнее чтение 25  Анализа вычислительной сложности построения бинарной кучи (Build-Max-Heap) за время O(n)  [CLRS, Глава 6]  http://en.wikipedia.org/wiki/Binary_heap#Building_a_heap