Лекция 6: Биномиальные кучи (binomial heaps)

58
Лекция 6: Биномиальные кучи (Binomial heaps) Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net

Upload: mikhail-kurnosov

Post on 15-Dec-2014

859 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Лекция 6: Биномиальные кучи (Binomial heaps)

Лекция 6:

Биномиальные кучи

(Binomial heaps)

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

к.т.н. доцент Кафедры вычислительных систем

Сибирский государственный университет

телекоммуникаций и информатики

http://www.mkurnosov.net

Page 2: Лекция 6: Биномиальные кучи (Binomial heaps)

Значение (Value) Приоритет (Priority)

Слон 3

Кит 1

Лев 15

Очередь с приоритетом (Priority queue)

2

Очередь с приоритетом (Priority queue) –

это очередь, в которой элементы имеют приоритет (вес)

Поддерживаемые операции:

o Insert(key, value) – добавляет в очередь значение value

c приоритетом (весом, ключом) key

o DeleteMin/DeleteMax – удаляет из очереди элемент

с мин./макс. приоритетом (ключом)

o Min/Max – возвращает элемент с мин./макс. ключом

o DecreaseKey – изменяет значение ключа заданного элемента

o Merge(q1, q2) – сливает две очереди в одну

Page 3: Лекция 6: Биномиальные кучи (Binomial heaps)

Двоичная куча (Binary heap)

3

Двоичная куча (пирамида, сортирующее дерево,

binary heap) – это двоичное дерево, удовлетворяющее

следующим условиям:

a) приоритет (ключ) любой вершины не меньше ( ≥ ),

приоритета её потомков

b) дерево является полным двоичным деревом

(complete binary tree) –

все уровни заполнены, возможно

за исключением последнего

Page 4: Лекция 6: Биномиальные кучи (Binomial heaps)

Двоичная куча (Binary heap)

4

max-heap

Приоритет любой вершины

не меньше (≥),

приоритета потомков

min-heap

Приоритет любой вершины

не больше (≤),

приоритета потомков

Page 5: Лекция 6: Биномиальные кучи (Binomial heaps)

Очередь с приоритетом (Priority queue)

5

В таблице приведены трудоемкости операций очереди

с приоритетом (в худшем случае, 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)

Page 6: Лекция 6: Биномиальные кучи (Binomial heaps)

Биномиальные кучи (Binomial heaps)

6

Биномиальная куча (Binomial heap, пирамида) –

это эффективно сливаемая куча (mergeable heap)

В биномиальной куче слияние (merge, union) двух куч

выполняется за время O(logn)

Биномиальные кучи формируются на основе

биномиальных деревьев (binomial trees)

Page 7: Лекция 6: Биномиальные кучи (Binomial heaps)

Биномиальное дерево (Binomial tree)

7

Биномиальное дерево Bk (Binomial tree) –

это рекурсивно определяемое дерево высоты k, в котором:

o количество узлов равно 2k

o количество узлов на уровне i = 0, 1, …, k:

𝑘𝑖

=𝑘!

𝑖! 𝑘−𝑖 !

(количество сочетаний из k по i)

o корень имеет k дочерних узлов:

− первый дочерний узел (самый левый) – дерево Bk-1

− второй дочерний узел (второй слева) – дерево Bk-2

− …

− k-й дочерний узел (самый правый) – дерево B0

Page 8: Лекция 6: Биномиальные кучи (Binomial heaps)

Биномиальное дерево (Binomial tree)

8

Биномиальное

дерево B0

(n = 20 = 1)

Биномиальное

дерево B1

(n = 21 = 2)

Биномиальное

дерево B2

(n = 22 = 4)

Биномиальное

дерево B3

(n = 23 = 8)

B3

B0B1

B0

B2

B0B1

B0

B2

B0B1

B0

B1

B0

B0

Максимальная степень узла

в биномиальном дереве с n вершинами равна O(logn)

Page 9: Лекция 6: Биномиальные кучи (Binomial heaps)

Биномиальная куча (Binomial heap)

9

Биномиальная куча (Binomial heap) –

это множество биномиальных деревьев, которые

удовлетворяют свойствам биномиальных куч:

1) каждое биномиальное дерево упорядочено (ordered)

в соответствии со свойствами неубывающей

или невозрастающей кучи (min-heap/max-heap):

ключ узла не меньше/не больше ключа его родителя

2) для любого целого k ≥ 0 имеется не более одного

биномиального дерева, чей корень имеет степень k

Биномиальная куча содержащая n узлов состоит

не более чем из log(𝑛) + 1 биномиальных деревьев

Page 10: Лекция 6: Биномиальные кучи (Binomial heaps)

Биномиальная куча (Binomial heap)

10

6

2914

38

8

1711

27

1

2512

18

10

Биномиальная куча из 13 узлов

(упорядоченные биномиальные деревья B0, B2 и B3)

Биномиальное

дерево B0

(n = 20 = 1)

Биномиальное

дерево B2

(n = 22 = 4)

Биномиальное

дерево B3

(n = 23 = 8)

Page 11: Лекция 6: Биномиальные кучи (Binomial heaps)

Биномиальное дерево (Binomial tree)

11

Пусть биномиальная куча содержит n узлов

Если записать n в двоичной системе исчисления,

то номера ненулевых битов будут соответствовать

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

6

2914

38

8

1711

27

1

2512

18

10

Биномиальная куча из 13 узлов (деревья B0, B2 и B3)

1310 = 11012

Page 12: Лекция 6: Биномиальные кучи (Binomial heaps)

Биномиальное дерево (Binomial tree)

12

Корни биномиальных деревьев биномиальной кучи

хранятся в односвязном списке – списке корней (root list)

В списке корней узлы упорядочены по возрастанию их

степеней (степеней корней биномиальных деревьев кучи)

6

2914

38

8

1711

27

1

2512

18

10

Биномиальная куча из 13 узлов (деревья B0, B2 и B3)

1310 = 11012

Head

Page 13: Лекция 6: Биномиальные кучи (Binomial heaps)

Узел биномиальной кучи

13

Каждый узел биномиальной кучи

(биномиального дерева) содержит следующие поля:

parent

key

value

degree

child sibling

o key – приоритет узла (вес, ключ)

o value – данные

o degree – количество дочерних узлов

o parent – указатель на родительский узел

o child – указатель на крайний левый

дочерний узел

o sibling – указатель на правый

сестринский узел

Page 14: Лекция 6: Биномиальные кучи (Binomial heaps)

Представление биномиальных куч

14

10

3

29

0

14

1

38

0

8

2

17

0

11

1

27

0

1

2

25

0

12

1

18

0

10

0

Head

Биномиальная куча из 13 узлов (деревья B0, B2 и B3)

Page 15: Лекция 6: Биномиальные кучи (Binomial heaps)

Поиск минимального узла (FindMin)

15

В корне каждого биномиального дерева хранится

его минимальный/максимальный ключ

Для поиска минимального/максимального элемента

в биномиальной куче требуется пройти по списку

из log(𝑛) + 1 корней

6

2914

38

8

1711

27

1

2512

18

10Head

Page 16: Лекция 6: Биномиальные кучи (Binomial heaps)

Поиск минимального узла (FindMin)

16

function BinomialHeapMin(heap)x = heapmin.key = Infinitywhile x != NULL do

if x.key < min.key thenmin = x

x = x.siblingend whilereturn min

end function

6

2914

38

8

1711

27

1

2512

18

10Head

TMin = O(logn)

Page 17: Лекция 6: Биномиальные кучи (Binomial heaps)

function BinomialHeapMin(heap)x = heapmin.key = Infinitywhile x != NULL do

if x.key < min.key thenmin = x

x = x.siblingend whilereturn min

end function

Поиск минимального узла (FindMin)

17

6

2914

38

8

1711

27

1

2512

18

10Head

Как реализовать поиск

минимального/максимального ключа за время O(1)?

Поддерживать указатель на корень дерева (узел),

в котором находится экстремальный ключ

TMin = O(logn)

Page 18: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние куч (Union)

18

Для слияния (union, merge) двух куч H1 и H2

в новую кучу H необходимо:

1. Слить списки корней H1 и H2 в один

упорядоченный список

2. Восстановить свойства биномиальной кучи H

После слияния списков корней известно, что в куче H

имеется не более двух корней с одинаковой степенью

и они соседствуют

Page 19: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние списков корней

19

6

4410

17

29

3148

50

3

37

18

8

2223

24

30

3245

55

H2

15

3328

41

7

25

12

H1

Списки корней H1 и H2 упорядочены по возрастанию

степеней узлов

Слияние выполняется аналогично слиянию упорядоченных

подмассивов в MergeSort (сортировке слиянием)

Page 20: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние списков корней

20

6

4410

17

29

3148

50

3

37

18

8

2223

24

30

3245

55

15

3328

41

7

25

12

H

Списки корней H1 и H2 упорядочены по возрастанию

степеней узлов

Слияние выполняется аналогично слиянию упорядоченных

подмассивов в MergeSort (сортировке слиянием)

Page 21: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние списков корней

function BinomialHeapListMerge(h1, h2)h = NULLwhile h1 != NULL && h2 != NULL do

if h1.degree <= h2.degree thenLinkedList_AddEnd(h, h1)h1 = h1.next

elseLinkedList_AddEnd(h, h2)h2 = h2.next

end ifend whilewhile h1 != NULL do

LinkedList_AddEnd(h, h1)h1 = h1.next

end whilewhile h2 != NULL do

LinkedList_AddEnd(h, h2)h2 = h2.next

end whilereturn h

end functionTMerge = O(log(max(n1, n2)))

21

Page 22: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние куч (Union)

22

6

4410

17

29

3148

50

3

37

18

8

2223

24

30

3245

55

15

3328

41

7

25

12

H

Ситуация после слияния списков корней

Свойство 1 биномиальной кучи выполняется

Свойство 2 не выполняется: два дерева B0 и два дерева B1

B0 B0

B1 B1

B2 B4

Page 23: Лекция 6: Биномиальные кучи (Binomial heaps)

23

Случай 3

x.degree = next-x.degree ≠ next-x.sibling.degree

x.key ≤ next-x.key

a b c

prev-x x next-x

d a b

c

prev-x x next-x

d

Bk Bk Bl

Bk

Bk Bl

Bk+1

x.sibling = next-x.sibling

BinomialTreeLink(next-x, x)

next-x = x.sibling

Page 24: Лекция 6: Биномиальные кучи (Binomial heaps)

Случай 3

24

6

4410

17

29

3148

50

3

37

18

8

2223

24

30

3245

55

15

3328

41

7

25

12

H

x.degree = next-x.degree ≠ next-x.sibling.degree

x.key ≤ next-x.key

Деревья x и next-x связываются

Узел next-x становится левым дочерним узлом x

x next-x

Page 25: Лекция 6: Биномиальные кучи (Binomial heaps)

x.sibling = next-x.sibling

BinomialTreeLink(next-x, x)

next-x = x.sibling

Случай 3

25

6

4410

17

29

3148

50

3

3718 8

2223

24

30

3245

55

15

3328

41

7

25

12

H

x next-x

x.degree = next-x.degree ≠ next-x.sibling.degree

x.key ≤ next-x.key

Page 26: Лекция 6: Биномиальные кучи (Binomial heaps)

Связывание биномиальных деревьев

26

function BinomialTreeLink(child, parent)child.parent = parentchild.sibling = parent.childparent.child = childparent.degree = parent.degree + 1

end functionTTreeLink = O(1)

10

0

parent

child

z.child

Page 27: Лекция 6: Биномиальные кучи (Binomial heaps)

Случай 2

27

a b c

prev-x x next-x

d a b c

prev-x x next-x

d

Bk Bk Bk Bk Bk Bk

x.degree = next-x.degree = next-x.sibling.degree

/* Перемещаем указатели по списку корней */prev-x = xx = next-xnext-x = x.sibling

Page 28: Лекция 6: Биномиальные кучи (Binomial heaps)

Случай 2

28

x.degree = next-x.degree = next-x.sibling.degree

/* Перемещаем указатели по списку корней */prev-x = xx = next-xnext-x = x.sibling

6

4410

17

29

3148

50

3

3718 8

2223

24

30

3245

55

15

3328

41

7

25

12

H

x next-xprev-x

Page 29: Лекция 6: Биномиальные кучи (Binomial heaps)

29

prev-x.sibling = next-xBinomialTreeLink(x, next-x)x = next-xnext-x = x.sibling

Случай 4

x.degree = next-x.degree ≠ next-x.sibling.degree

x.key > next-x.key

a b c

prev-x x next-x

d a c

b

prev-x x next-x

d

Bk Bk Bl

Bk

Bk Bl

Bk+1

Page 30: Лекция 6: Биномиальные кучи (Binomial heaps)

Случай 1

30

x.degree ≠ next-x.degree

Узел x – корень дерева Bk

Узел next-x – корень дерева Bl, l > k

/* Перемещаем указатели по списку корней */prev-x = xx = next-xnext-x = x.sibling

a b c

prev-x x next-x

d a b c

prev-x x next-x

d

Bk Bl Bk Bl

l > k

Page 31: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние биномиальных куч (Union)

function BinomialHeapUnion(h1, h2)

h = BinomialHeapListMerge(h1, h2)

prev-x = NULL

x = h

next-x = x.sibling

while next-x != NULL do

if (x.degree != next-x.degree) OR

(next-x.sibling != NULL AND

next-x.sibling.degree = x.degree)

then

prev-x = x /* Случаи 1 и 2 */

x = next-x

else if x.key <= next-x.key then

x.sibling = next-x.sibling /* Случай 3 */

BinomialTreeLink(next-x, x)

31

Page 32: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние биномиальных куч (Union)

else

/* Случай 4 */

if prev-x = NULL then

h = next-x

else

prev-x.sibling = next-x

end if

BinomialTreeLink(x, next-x)

x = next-x

end if

next-x = x.sibling

end while

return h

end function

32

TUnion = O(logn)

Page 33: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние биномиальных куч (Union)

33

Вычислительная сложность слияния двух

биномиальных куч в худшем случае равна O(log(n))

Длина списка корней не превышает

log(n1) + log(n1) + 2 ≤ log(n) + 2 = O(log(n))

Цикл while в функции BinomialHeapUnion выполняется

не более O(log(n)) раз

На каждой итерации цикла указатель перемещается

по списку корней вправо на одну позицию или удаляется

один узел – это требует времени O(1)

Page 34: Лекция 6: Биномиальные кучи (Binomial heaps)

Вставка узла (Insert)

34

Создаем биномиальную кучу из одного узла Zx –

биномиального дерева B0

Сливаем исходную кучу H и кучу из узла x

function BinomialHeapInsert(h, key, value)

x.key = key

x.value = value

x.degree = 0

x.parent = NULL

x.child = NULL

x.sibling = NULL

return BinomialHeapUnion(h, x)

end functionTInsert = O(logn)

Page 35: Лекция 6: Биномиальные кучи (Binomial heaps)

Удаление минимального узла (DeleteMin)

35

1. В списке корней кучи H отыскиваем корень x

с минимальным ключом и удаляем x из списка корней

(разрывам связь)

2. Инициализируем пустую кучу Z

3. Меняем порядок следования дочерних узлов корня х

на обратный, у каждого дочернего узла устанавливаем

поле parent в NULL

4. Устанавливаем заголовок кучи Z на первый элемент

нового списка корней

5. Сливаем кучи H и Z

6. Возвращаем x

Page 36: Лекция 6: Биномиальные кучи (Binomial heaps)

Удаление минимального узла (DeleteMin)

36

1

2512

18

16

3326

42

37

41 6

2914

38

8

1711

27

10

1328

77

H

В списке корней кучи H отыскиваем корень x

с минимальным ключом и удаляем x из списка корней

(разрывам связь)

x

Page 37: Лекция 6: Биномиальные кучи (Binomial heaps)

Удаление минимального узла (DeleteMin)

37

1

2512

18

16

3326

42

37

41 6

2914

38

8

1711

27

10

1328

77

H

Меняем порядок следования дочерних узлов корня х

на обратный, у каждого дочернего узла устанавливаем

поле parent в NULL

Дочерние узлы корня x образуют биномиальную кучу Z

x

Page 38: Лекция 6: Биномиальные кучи (Binomial heaps)

Удаление минимального узла (DeleteMin)

38

25 12

18

16

3326

42

37

41

6

2914

38

8

1711

27

10

1328

77

H

Сливаем кучи H и Z

Z

Page 39: Лекция 6: Биномиальные кучи (Binomial heaps)

Удаление минимального узла (DeleteMin)

function BinomialHeapDeleteMin(h)

/* Lookup and unlink min node */

x = h

xmin.key = Infinitya

prev = NULL

while x != NULL do

if x.key < xmin.key then

xmin = x

prevmin = prev

end if

prev = x

x = x.sibling

end while

if prevmin != NULL then

prevmin.sibling = xmin.sibling

else

h = xmin.sibling

39

Page 40: Лекция 6: Биномиальные кучи (Binomial heaps)

Удаление минимального узла (DeleteMin)

/* Reverse linked list */

child = xmin.child

prev = NULL

while child != NULL do

sibling = child.sibling

child.sibling = prev

prev = child

child = sibling

end while

return BinomialHeapUnion(h, prev)

end function

40

TDeleteMin = O(logn)

Page 41: Лекция 6: Биномиальные кучи (Binomial heaps)

Уменьшение ключа (DecreaseKey)

41

1. Получаем указатель на узел x и изменяем у него ключ

(newkey <= x.key)

2. Проверяем значение ключа родительского узла,

если он меньше ключа x, то выполняем обмен ключей (и

данных), повторяем обмены пока не поднимемся до корня

текущего биномиального дерева

6

2914

38

8

175

27

1

2512

18

10Head

x

p

Page 42: Лекция 6: Биномиальные кучи (Binomial heaps)

Уменьшение ключа (DecreaseKey)

42

function BinomialHeapDecreaseKey(h, x, key)

if x.key < k then

return Error

x.key = key

y = x

z = y.parent

while z != NULL AND y.key < z.key do

temp = y.key

y.key = z.key

z.key = temp

y = z

z = y.parent

end while

end functionTDecreaseKey = O(logn)

Page 43: Лекция 6: Биномиальные кучи (Binomial heaps)

Удаление узла (Delete)

43

function BinomialHeapDelete(h, x)

BinomialHeapDecreaseKey(h, x, -Infinity)

BinomialHeapDeleteMin(h)

end function

TDelete = O(logn)

Page 44: Лекция 6: Биномиальные кучи (Binomial heaps)

Узел биномиального дерева

struct bmheap {

int key;

char *value;

int degree;

struct bmheap *parent;

struct bmheap *child;

struct bmheap *sibling;

};

44

Page 45: Лекция 6: Биномиальные кучи (Binomial heaps)

Пример использования bmheap

int main()

{

struct bmheap *h = NULL, *node;

h = bmheap_insert(h, 10, “10”);

h = bmheap_insert(h, 12, “12”);

h = bmheap_insert(h, 3, “3”);

h = bmheap_insert(h, 56, “56”);

node = bmheap_min(h);

printf("Min = %d\n", node->key);

h = bmheap_deletemin(h);

bmheap_free(h);

return 0;

}45

Page 46: Лекция 6: Биномиальные кучи (Binomial heaps)

Создание узла биномиального дерева

struct bmheap *bmheap_create(int key, char *value)

{

struct bmheap *h;

h = (struct bmheap *)malloc(sizeof(*h));

if (h != NULL) {

h->key = key;

h->value = value;

h->degree = 0;

h->parent = NULL;

h->child = NULL;

h->sibling = NULL;

}

return h;

}

46

Page 47: Лекция 6: Биномиальные кучи (Binomial heaps)

Поиск минимального элемента

struct bmheap *bmheap_min(struct bmheap *h)

{

struct bmheap *minnode, *node;

int minkey = ~0U >> 1; /* INT_MAX */

for (node = h; node != NULL;

node = node->sibling)

{

if (node->key < minkey) {

minkey = node->key;

minnode = node;

}

}

return minnode;

}

47

Page 48: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние биномиальных куч

struct bmheap *bmheap_union(struct bmheap *a, struct bmheap *b)

{

struct bmheap *h, *prevx, *x, *nextx;

h = bmheap_mergelists(a, b);

prevx = NULL;

x = h;

nextx = h->sibling;

while (nextx != NULL) {

if ((x->degree != nextx->degree) ||

(nextx->sibling != NULL &&

nextx->sibling->degree == x->degree))

{

/* Cases 1 & 2 */

prevx = x;

x = nextx;

}

48

Page 49: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние биномиальных куч

else if (x->key <= nextx->key) {

/* Case 3 */

x->sibling = nextx->sibling;

bmheap_linktrees(nextx, x);

} else {

/* Case 4 */

if (prevx == NULL) {

h = nextx;

} else {

prevx->sibling = nextx;

}

bmheap_linktrees(x, nextx);

x = nextx;

}

nextx = x->sibling;

}

return h;

}49

Page 50: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние списков корней

struct bmheap *bmheap_mergelists(struct bmheap *a,struct bmheap *b)

{struct bmheap *head, *sibling, *end;

end = head = NULL;while (a != NULL && b != NULL) {

if (a->degree < b->degree) {sibling = a->sibling;if (end == NULL) {

end = a;head = a;

} else {end->sibling = a; /* Add to the end */end = a;a->sibling = NULL;

}a = sibling;

}

50

Page 51: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние списков корней

else {

sibling = b->sibling;

if (end == NULL) {

end = b;

head = b;

} else {

end->sibling = b; /* Add to the end */

end = b;

b->sibling = NULL;

}

b = sibling;

}

}

51

Page 52: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние списков корней

while (a != NULL) {

sibling = a->sibling;

if (end == NULL) {

end = a;

} else {

end->sibling = a;

end = a;

a->sibling = NULL;

}

a = sibling;

}

52

Page 53: Лекция 6: Биномиальные кучи (Binomial heaps)

Слияние списков корней

while (b != NULL) {

sibling = b->sibling;

if (end == NULL) {

end = b;

} else {

end->sibling = b;

end = b;

b->sibling = NULL;

}

b = sibling;

}

return head;

}

53

Page 54: Лекция 6: Биномиальные кучи (Binomial heaps)

Связывание деревьев

void bmheap_linktrees(struct bmheap *y,

struct bmheap *z)

{

y->parent = z;

y->sibling = z->child;

z->child = y;

z->degree++;

}

54

Page 55: Лекция 6: Биномиальные кучи (Binomial heaps)

Вставка элемента в биномиальную кучу

struct bmheap *bmheap_insert(struct bmheap *h,

int key, char *value)

{

struct bmheap *node;

if ((node = bmheap_create(key, value)) == NULL)

return NULL;

if (h == NULL)

return node;

return bmheap_union(h, node);

}

55

Page 56: Лекция 6: Биномиальные кучи (Binomial heaps)

Удаление минимального элемента

struct bmheap *bmheap_deletemin(struct bmheap *h)

{

struct bmheap *x, *prev, *xmin, *prevmin,

*child, *sibling;

int minkey = ~0U >> 1; /* INT_MAX */

/* Lookup and unlink min node */

x = h;

prev = NULL;

while (x != NULL) {

if (x->key < minkey) {

minkey = x->key;

xmin = x;

prevmin = prev;

}

prev = x;

x = x->sibling;

}56

Page 57: Лекция 6: Биномиальные кучи (Binomial heaps)

Удаление минимального элемента

if (prevmin != NULL)

prevmin->sibling = xmin->sibling;

else

h = xmin->sibling;

/* Reverse linked list */

child = xmin->child;

prev = NULL;

while (child != NULL) {

sibling = child->sibling;

child->sibling = prev;

prev = child;

child = sibling;

}

free(xmin);

return bmheap_union(h, prev);

}

57

Page 58: Лекция 6: Биномиальные кучи (Binomial heaps)

Задания

58

Прочитать о левосторонней очереди (Leftist heap)

Прочитать о скошенной очереди (Skew heap)

Прочитать о куче Бродала (Brodal heap)