Куча Фибоначчи состоит из набора более мелких упорядоченных деревьев различных «порядков», которые подчиняются определенным структурным ограничениям. Последовательность Фибоначчи возникает потому, что эти деревья построены таким образом, что дерево порядка n имеет как минимум F n + 2 узлов, где F n + 2 - это (n + 2) -е число Фибоначчи.
Чтобы понять, почему этот результат верен, давайте начнем с того, что посмотрим, как строятся деревья в куче Фибоначчи. Первоначально, когда узел помещается в кучу Фибоначчи, он помещается в дерево порядка 0, которое содержит только этот узел. Всякий раз, когда значение удаляется из кучи Фибоначчи, некоторые деревья в куче Фибоначчи объединяются, так что количество деревьев не становится слишком большим.
При объединении деревьев куча Фибоначчи объединяет деревья только одного порядка. Чтобы объединить два дерева порядка n в дерево порядка n + 1, куча Фибоначчи берет любое из двух деревьев с большим значением корня, чем другое, а затем делает это дерево дочерним по отношению к другому дереву. Одним из следствий этого факта является то, что деревья порядка n всегда имеют ровно n дочерних элементов.
Основная привлекательность кучи Фибоначчи заключается в том, что она эффективно поддерживает ключ уменьшения (в амортизированном O (1)). Чтобы поддерживать это, куча Фибоначчи реализует ключ уменьшения следующим образом: чтобы уменьшить ключ значения, хранящегося в каком-либо узле, этот узел вырезается из его родительского дерева и обрабатывается как его собственное отдельное дерево. Когда это происходит, порядок его старого родительского узла уменьшается на единицу. Например, если у дерева порядка 4 есть дочерний элемент, вырезанный из него, оно сжимается до дерева порядка 3, что имеет смысл, потому что порядок дерева должен быть количеством дочерних элементов, которые оно содержит.
Проблема с этим заключается в том, что если слишком много деревьев будет отрезано от одного и того же дерева, у нас может быть дерево с большим порядком, но которое содержит очень небольшое количество узлов. Временные гарантии кучи Фибоначчи возможны только в том случае, если деревья с большими порядками содержат огромное количество узлов, и если мы можем просто вырезать любые узлы, которые нам нужны, из деревьев, мы можем легко попасть в ситуацию, когда дерево с огромным порядком содержит только небольшое количество узлов.
Чтобы решить эту проблему, кучи Фибоначчи предъявляют одно требование: если вы вырезаете двух дочерних элементов из дерева, вы должны, в свою очередь, вырезать это дерево из его родителя. Это означает, что деревья, образующие кучу Фибоначчи, выиграют » t быть слишком сильно поврежденным клавишей уменьшения.
А теперь мы можем перейти к части, касающейся чисел Фибоначчи. На данный момент мы можем сказать следующее о деревьях в куче Фибоначчи:
- У дерева порядка n ровно n детей.
- Деревья порядка n формируются путем взятия двух деревьев порядка n - 1 и превращения одного дерева в потомка другого.
- Если дерево теряет двух дочерних элементов, это дерево отрезается от своего родителя.
Итак, теперь мы можем спросить - какие наименьшие возможные деревья можно построить, исходя из этих предположений?
Давайте попробуем несколько примеров. Существует только одно возможное дерево порядка 0, которое представляет собой всего лишь один узел:
Smallest possible order 0 tree: *
Наименьшее возможное дерево порядка 1 должно быть как минимум узлом с дочерним элементом. Наименьший возможный дочерний элемент, который мы могли бы создать, - это единственный узел с наименьшим деревом порядка 0 в качестве дочернего, которым является это дерево:
Smallest possible order 1 tree: *
|
*
А как насчет наименьшего дерева порядка 2? Здесь все становится интересно. У этого дерева обязательно должно быть два дочерних элемента, и оно будет образовано путем слияния двух деревьев порядка 1. Следовательно, дерево изначально будет иметь двух дочерних элементов - дерево порядка 0 и дерево порядка 1. Но помните - мы можем срезайте детей с деревьев после их слияния! В этом случае, если мы отсечем дочерний элемент дерева порядка 1, у нас останется дерево с двумя дочерними элементами, оба из которых являются деревьями порядка 0:
Smallest possible order 2 tree: *
/ \
* *
Как насчет порядка 3? Как и прежде, это дерево будет создано путем слияния двух деревьев порядка 2. Затем мы попытаемся вырезать как можно больше поддеревьев этого дерева порядка 3. Когда оно создано, дерево имеет поддеревья порядков 2, 1 и 0. Мы не можем вырезать из дерева порядка 0, но мы можем вырезать одного дочернего элемента из дерева порядка 2 и упорядочить дерево 1. Если мы сделаем это, у нас останется дерево с тремя дочерними элементами, одним из которых является порядок 1, а два - вторым:
Smallest possible order 3 tree: *
/|\
* * *
|
*
Теперь мы можем определить закономерность. Наименьшее возможное дерево порядка- (n + 2) будет сформировано следующим образом: начните с создания дерева нормального порядка (n + 2), у которого есть дочерние элементы порядков n + 1, n, n - 1, ..., 2 , 1, 0. Затем сделайте эти деревья как можно меньше, вырезая из них узлы, не вырезая двух дочерних элементов из одного узла. В результате остается дерево с дочерними элементами порядков n, n - 2, ..., 1, 0 и 0.
Теперь мы можем написать рекуррентное отношение, чтобы попытаться определить, сколько узлов находится в этих деревьях. Если мы сделаем это, мы получим следующее, где NC (n) представляет наименьшее количество узлов, которые могут быть в дереве порядка n:
NC(0) = 1
NC(1) = 2
NC(n + 2) = NC(n) + NC(n - 1) + ... + NC(1) + NC(0) + NC(0) + 1
Здесь последний +1 соответствует самому корневому узлу.
Если мы расширим эти термины, мы получим следующее:
NC(0) = 1
NC(1) = 2
NC(2) = NC(0) + NC(0) + 1 = 3
NC(3) = NC(1) + NC(0) + NC(0) + 1 = 5
NC(4) = NC(2) + NC(1) + NC(0) + NC(0) + 1 = 8
Если вы заметите, это в точности ряд Фибоначчи, смещенный на две позиции. Другими словами, в каждом из этих деревьев должно быть не менее F n + 2 узлов, где F n + 2 - это (n + 2) -е число Фибоначчи. .
Так почему же это называется кучей Фибоначчи? Потому что каждое дерево порядка n должно иметь как минимум F n + 2 узлов!
Если вам интересно, в оригинальной статье о кучах Фибоначчи есть изображения этих мельчайших деревьев. На это приятно смотреть! Также ознакомьтесь с этот пост по обмену стеками теории CS для альтернативного объяснения того, почему деревья кучи Фибоначчи имеют такие размеры, как и они.
Надеюсь это поможет!
person
templatetypedef
schedule
15.01.2013