Изменения

Перейти к: навигация, поиск

Фибоначчиева куча

1 байт убрано, 13:06, 8 мая 2020
Удаление минимального элемента
'''int''' degree <span style="color:#008000"> // степень вершины</span>
'''boolean''' mark <span style="color:#008000">// был ли удален в процессе изменения ключа ребенок этой вершины)</span>
</code>Также стоит упомянуть, что нам нужен указатель только на одного ребенка, поскольку остальные хранятся в двусвязном списке с ним. Для доступа ко всей куче нам тоже нужен всего один элемент, поэтому разумно хранить именно указатель на минимум кучи(он обязательно один из корней), а для получения размера за константное время будем хранить размер кучи отдельно.
<code style="display:inline-block">
'''struct''' fibonacciHeap
min <tex>= \varnothing</tex>
'''return'''
min = min.right <span style="color:#008000"> // пока что перекинем указаиель указатель min на правого сына, а далее consolidate() скорректирует min в процессе выполнения</span>
consolidate()
size--
<code style="display:inline-block">
'''function''' decreaseKey(x: '''Node''', newValue: '''int'''):
'''if''' newValue > x.parent.key <span style="color:#008000"> // если после изменения структкра структура дерева сохранится, то меняем и выходим</span>
x.key = newValue
'''return'''
'''Node''' parent = x.parent <span style="color:#008000"> // иначе вызываем cut и cascadingCut</span>
cut(x)
cascadingCut(x.parent)
</code>
===== Вырезание =====
R.left = L <span style="color:#008000"> // аккуратно удаляем текущую вершину</span>
L.right = R
x.right = x
x.left = x
x.parent.degree--
'''if''' x.parent.child = x <span style="color:#008000"> // чтобы родитель не потерял ссылку на сыновей проверяем: </span>
'''else'''
x.parent.child = x.right
x.right = x
x.left = x
x.parent <tex>= \varnothing</tex>
unionLists(min, x) <span style="color:#008000"> // вставляем наше поддерево в корневой список</span>
Анонимный участник

Навигация