Jump to content

Куча Фибоначчи

Куча Фибоначчи
Тип куча
Изобретенный 1984
Изобретён Майкл Л. Фредман и Роберт Э. Тарджан
Сложности в обозначении большого О
Пространственная сложность
Временная сложность
Функция Амортизированный Худший случай
Вставлять я (1)
Найти-мин я (1)
Удалить-мин. О(логарифм n )
Клавиша уменьшения я (1)
Объединить я (1)

В информатике куча Фибоначчи — это структура данных для операций очереди с приоритетом , состоящая из набора упорядоченных по куче деревьев . Он имеет лучшее амортизированное время работы, чем многие другие структуры данных очереди приоритетов, включая двоичную и биномиальную кучу . Майкл Л. Фредман и Роберт Э. Тарьян разработали кучи Фибоначчи в 1984 году и опубликовали их в научном журнале в 1987 году. Кучи Фибоначчи названы в честь чисел Фибоначчи , которые используются в их анализе времени выполнения.

Амортизированное время всех операций с кучей Фибоначчи является постоянным, за исключением delete-min . [1] [2] Удаление элемента (чаще всего используется в частном случае удаления минимального элемента) работает в амортизированное время, где это размер кучи. [2] Это означает, что, начиная с пустой структуры данных, любая последовательность операций вставки и уменьшения клавиш , а также b операций удаления минимального значения будет занимать время наихудшего случая, когда — максимальный размер кучи. В двоичной или биномиальной куче такая последовательность операций заняла бы время. Таким образом, куча Фибоначчи лучше, чем двоичная или биномиальная куча, когда меньше, чем непостоянным фактором. Также возможно объединить две кучи Фибоначчи за постоянное амортизированное время, улучшив время логарифмического слияния биномиальной кучи и улучшив двоичные кучи, которые не могут эффективно обрабатывать слияния.

Использование куч Фибоначчи улучшает асимптотическое время работы алгоритмов, использующих очереди с приоритетами. Например, алгоритм Дейкстры и алгоритм Прима можно запустить в время.

Структура [ править ]

Рисунок 1. Пример кучи Фибоначчи. Он имеет три дерева степеней 0, 1 и 3. Отмечены три вершины (показаны синим цветом). Следовательно, потенциал кучи равен 9 (3 дерева + 2 × (3 помеченных вершины)).

Куча Фибоначчи — это совокупность деревьев, удовлетворяющих свойству минимальной кучи , то есть ключ дочернего элемента всегда больше или равен ключу родительского элемента. Это означает, что минимальный ключ всегда находится в корне одного из деревьев. По сравнению с биномиальными кучами структура кучи Фибоначчи более гибкая. Деревья не имеют заданной формы, и в крайнем случае куча может содержать каждый элемент в отдельном дереве. Эта гибкость позволяет выполнять некоторые операции ленивым образом, откладывая работу для последующих операций. Например, объединение куч осуществляется просто путем объединения двух списков деревьев, а операция уменьшения ключа иногда отсекает узел от его родителя и формирует новое дерево.

Однако в какой-то момент для достижения желаемого времени работы в куче необходимо навести порядок. В частности, степени узлов (здесь степень означает количество прямых потомков) сохраняются довольно низкими: каждый узел имеет не более степени. и размер поддерева с корнем в узле степени по крайней мере , где это число Фибоначчи . Это достигается правилом: от каждого некорневого узла можно отрезать не более одного дочернего узла. Когда второй дочерний элемент вырезается, сам узел должен быть отрезан от своего родителя и становится корнем нового дерева (см. «Доказательство границ степени» ниже). Количество деревьев уменьшается в операции delete-min , где деревья связаны друг с другом.

В результате расслабленной структуры некоторые операции могут занимать много времени, а другие выполняются очень быстро. Для анализа амортизированного времени выполнения мы используем потенциальный метод , в котором мы делаем вид, что очень быстрые операции занимают немного больше времени, чем на самом деле. Это дополнительное время затем суммируется и вычитается из фактического времени выполнения медленных операций. Количество времени, сэкономленное для последующего использования, измеряется в любой момент потенциальной функцией. Потенциал кучи Фибоначчи определяется выражением

,

где - количество деревьев в куче Фибоначчи, а — количество отмеченных узлов. Узел помечается, если хотя бы один из его дочерних узлов был вырезан, поскольку этот узел был сделан дочерним по отношению к другому узлу (все корни не отмечены). Амортизированное время операции определяется как сумма фактического времени и раз на разницу потенциалов, где c — константа (выбранная для соответствия постоянным коэффициентам в большом обозначении O для фактического времени).

Таким образом, в корне каждого дерева в куче хранится одна единица времени. Эту единицу времени можно использовать позже для связи этого дерева с другим деревом в амортизированное время 0. Кроме того, в каждом отмеченном узле хранятся две единицы времени. Один из них можно использовать для отделения узла от его родителя. Если это произойдет, узел станет корнем и вторая единица времени останется сохраненной в нем, как и в любом другом корне.

Операции [ править ]

Чтобы обеспечить быстрое удаление и объединение, корни всех деревьев связаны с помощью циклического двусвязного списка . Дочерние элементы каждого узла также связаны с помощью такого списка. Для каждого узла мы сохраняем количество дочерних элементов и то, помечен ли узел.

Найти-мин [ править ]

Мы поддерживаем указатель на корень, содержащий минимальный ключ, что позволяет доступ к минимуму. Этот указатель должен обновляться во время других операций, что добавляет лишь постоянные затраты времени.

идти [ править ]

Операция слияния просто объединяет корневые списки двух куч и устанавливает минимальный из двух куч. Это можно сделать за постоянное время, и потенциал не изменится, что снова приведет к постоянному амортизированному времени.

Вставить [ править ]

Операцию вставки можно рассматривать как частный случай операции слияния с одним узлом. Узел просто добавляется в корневой список, увеличивая потенциал на единицу. Таким образом, амортизированная стоимость остается постоянной.

Удалить-мин [ изменить ]

Рисунок 2. Первая фаза delete-min .
Рисунок 3. Третья фаза delete-min .

Операция delete-min выполняет большую часть работы по восстановлению структуры кучи. Он имеет три фазы:

  1. Корень, содержащий минимальный элемент, удаляется, и каждый его элемент дети становятся новым корнем. Это требует времени обработать эти новые корни, и потенциал увеличивается на . Следовательно, амортизированное время выполнения этой фазы равно .
  2. Может быть до корни. Поэтому мы уменьшаем число корней, последовательно соединяя корни одной степени. Когда два корня имеют одинаковую степень, мы делаем тот, у которого ключ большего размера, дочерним по отношению к другому, чтобы соблюдалось свойство минимальной кучи. Степень меньшего корня увеличивается на единицу. Это повторяется до тех пор, пока каждый корень не будет иметь разную степень. Чтобы эффективно находить деревья одной степени, мы используем массив длины в котором мы храним указатель на один корень каждой степени. Когда обнаруживается второй корень той же степени, они связываются, и массив обновляется. Фактическое время работы , где – число корней в начале второй фазы. В итоге мы получим максимум корни (потому что каждый имеет разную степень). Следовательно, разница потенциалов до и после этой фазы равна . Таким образом, амортизированное время работы равно . Выбрав достаточно большое такие, что условия в отменить, это упрощает .
  3. Найдите окончательный список корней, чтобы найти минимум, и соответствующим образом обновите указатель минимума. Это занимает время, потому что количество корней уменьшилось.

В целом амортизированное время этой операции составляет , при условии, что . Доказательство этого приведено в следующем разделе.

Клавиша уменьшения [ править ]

Рисунок 4. Куча Фибоначчи с рисунка 1 после уменьшения ключа узла 9 до 0.

Если уменьшить ключ узла заставляет его становиться меньше своего родителя, затем он отсекается от своего родителя, становясь новым немаркированным корнем. Если он также меньше минимального ключа, то минимальный указатель обновляется.

Затем мы инициируем серию каскадных сокращений , начиная с родительского элемента. . Пока текущий узел помечен, он отсекается от своего родителя и становится немаркированным корнем. Затем рассматривается его первоначальный родитель. Этот процесс останавливается, когда мы достигаем немаркированного узла. . Если не является корнем, он помечен. В этом процессе мы вводим некоторое число, скажем , новых деревьев. За исключением, возможно, , каждое из этих новых деревьев теряет свою первоначальную метку. Конечный узел может стать отмеченным. Следовательно, изменение количества отмеченных узлов происходит между и . Результирующее изменение потенциала . Фактическое время, необходимое для выполнения резки, составило . Следовательно, амортизированное время , который является постоянным при условии достаточно велик.

Доказательство границ степени [ править ]

Амортизированная производительность кучи Фибоначчи зависит от степени (количества дочерних элементов) любого корня дерева. , где это размер кучи. Здесь мы показываем, что размер (под)дерева с корнем в любом узле степени в куче должен быть размер не менее , где это число Фибоначчи . Оценка степени следует из этого и того факта (легко доказываемого по индукции), что для всех целых чисел , где это золотое сечение . Тогда у нас есть , и переносим лог в базу обеих сторон дает по мере необходимости.

Позволять быть произвольным узлом в куче Фибоначчи, не обязательно корнем. Определять быть размером с дерево, у которого корни (число потомков , включая сам). Докажем индукцией по высоте (длина самого длинного пути от до листа-потомка), что , где это степень .

Базовый случай: если имеет высоту , затем , и .

Индуктивный случай: предположим имеет положительную высоту и степень . Позволять быть детьми , проиндексированные в порядке времени, когда они в последний раз стали детьми ( являющийся самым ранним и самое последнее), и пусть быть их соответствующими степенями.

Мы утверждаем, что для каждого . незадолго до был сделан ребенком , уже были детьми , и так должен был иметь как минимум степень в это время. Поскольку деревья объединяются только тогда, когда степени их корней равны, должно было быть так, что тоже имел степень как минимум в то время, когда он стал ребенком . С того времени и по настоящее время мог потерять не более одного ребенка (что гарантировано процессом маркировки), и поэтому его текущая степень по крайней мере . Это доказывает утверждение.

Поскольку высоты всех строго меньше, чем у , мы можем применить к ним индуктивную гипотезу, чтобы получить

Узлы и каждый вносит минимум 1 в и так у нас есть
где последний шаг — это тождество чисел Фибоначчи. Это дает желаемую нижнюю границу .

Производительность [ править ]

Хотя кучи Фибоначчи выглядят очень эффективно, у них есть два недостатка: [3]

  1. Они сложны в реализации.
  2. На практике они не так эффективны по сравнению с теоретически менее эффективными формами куч. [4] , требуются только два или три указателя на узел В своей простейшей версии они требуют манипулирования четырьмя указателями на узел, тогда как в других структурах, таких как биномиальная куча или парная куча . Это приводит к большому потреблению памяти на узел и высоким постоянным коэффициентам для всех операций.

Хотя общее время выполнения последовательности операций, начинающихся с пустой структуры, ограничено пределами, указанными выше, некоторые (очень немногие) операции в последовательности могут занять очень много времени (в частности, delete-min имеет линейное время выполнения в худший случай). По этой причине кучи Фибоначчи и другие амортизированные структуры данных могут не подходить для систем реального времени .

Можно создать структуру данных, которая будет иметь такую ​​же производительность в худшем случае, как амортизированная производительность кучи Фибоначчи. Одна из таких структур — очередь Бродала . [5] является, по словам создателя, «достаточно сложным» и «[не]применимо на практике». , изобретенная в 2012 году. Строгая куча Фибоначчи [6] является более простой (по сравнению со структурой Бродала) структурой с теми же границами наихудшего случая. Несмотря на свою простоту, эксперименты показывают, что на практике строгая куча Фибоначчи работает медленнее, чем более сложная очередь Бродала , а также медленнее, чем базовая куча Фибоначчи. [7] [8] Расслабленные от бега кучи Driscoll et al. обеспечивают хорошую производительность в худшем случае для всех операций с кучей Фибоначчи, кроме слияния. [9] Недавние экспериментальные результаты показывают, что куча Фибоначчи на практике более эффективна, чем большинство ее более поздних производных, включая кучи землетрясений, кучи нарушений, строгие кучи Фибоначчи и кучи спаривания рангов, но менее эффективна, чем кучи спаривания или кучи на основе массивов. [8]

Сводка времени работы [ править ]

Вот временные сложности [10] различных структур данных кучи. Имена функций предполагают минимальную кучу. Значение « O ( f )» и « Θ ( f )» см в обозначении Big O. .

Операция найти-мин удаление-мин вставлять клавиша уменьшения сливаться
Двоичный [10] я (1) Θ (логарифм n ) О (логарифм n ) О (логарифм n ) Θ ( н )
Левый я (1) Θ (логарифм n ) Θ (логарифм n ) О (логарифм n ) Θ (логарифм n )
Биномиальный [10] [11] я (1) Θ (логарифм n ) я (1) [а] Θ (логарифм n ) О (логарифм n )
Наклонный бином [12] я (1) Θ (логарифм n ) я (1) Θ (логарифм n ) О (логарифм n ) [б]
Сопряжение [13] я (1) О (логарифм n ) [а] я (1) о (логарифм n ) [а] [с] я (1)
Сопряжение по рангам [16] я (1) О (логарифм n ) [а] я (1) я (1) [а] я (1)
Фибоначчи [10] [2] я (1) О (логарифм n ) [а] я (1) я (1) [а] я (1)
Строгий Фибоначчи [17] я (1) О (логарифм n ) я (1) я (1) я (1)
Мостовая долина [18] [д] я (1) О (логарифм n ) я (1) я (1) я (1)
2–3 кучи [20] я (1) О (логарифм n ) [а] я (1) [а] я (1) О (логарифм n )
  1. Перейти обратно: Перейти обратно: а б с д и ж г час я Амортизированное время.
  2. ^ в наихудшем случае Бродал и Окасаки описывают метод уменьшения сложности объединения до Θ (1); этот метод применим к любой структуре данных кучи, которая имеет вставку в Θ (1) и find-min , delete-min , объединение в O (log n ).
  3. ^ Нижняя граница [14] верхняя граница [15]
  4. ^ Бродал и Окасаки позже описывают постоянный вариант с теми же границами, за исключением клавиши уменьшения, которая не поддерживается.Кучи с n элементами могут быть построены снизу вверх за O ( n ). [19]

Ссылки [ править ]

  1. ^ Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л .; Штейн, Клиффорд (2001) [1990]. «Глава 20: Кучи Фибоначчи». Введение в алгоритмы (2-е изд.). MIT Press и McGraw-Hill. стр. 476–497. ISBN  0-262-03293-7 . Третье издание стр. 518.
  2. Перейти обратно: Перейти обратно: а б с Фредман, Майкл Лоуренс ; Тарьян, Роберт Э. (июль 1987 г.). «Кучи Фибоначчи и их использование в улучшенных алгоритмах оптимизации сети» (PDF) . Журнал Ассоциации вычислительной техники . 34 (3): 596–615. CiteSeerX   10.1.1.309.8927 . дои : 10.1145/28869.28874 .
  3. ^ Фредман, Майкл Л .; Седжвик, Роберт ; Слитор, Дэниел Д .; Тарьян, Роберт Э. (1986). «Парная куча: новая форма саморегулирующейся кучи» (PDF) . Алгоритмика . 1 (1–4): 111–129. дои : 10.1007/BF01840439 . S2CID   23664143 .
  4. ^ http://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/FibonacciHeaps.pdf , стр. 79
  5. ^ Герт Столтинг Бродал (1996), «Эффективные приоритетные очереди в наихудшем случае» , Proc. 7-й симпозиум ACM-SIAM по дискретным алгоритмам , Общество промышленной и прикладной математики : 52–58, CiteSeerX   10.1.1.43.8133 , ISBN  0-89871-366-8
  6. ^ Бродал, GSL; Лагояннис, Г.; Тарьян, RE (2012). Строгие кучи Фибоначчи (PDF) . Материалы 44-го симпозиума по теории вычислений - STOC '12. п. 1177. дои : 10.1145/2213977.2214082 . ISBN  978-1-4503-1245-5 .
  7. ^ Мрена, Михал; Седлачек, Питер; Квасай, Мирослав (июнь 2019 г.). «Практическая применимость передовых реализаций очередей с приоритетами при поиске кратчайших путей». Международная конференция по информационным и цифровым технологиям (IDT) 2019 . Жилина, Словакия: IEEE. стр. 335–344. дои : 10.1109/DT.2019.8813457 . ISBN  9781728114019 . S2CID   201812705 .
  8. Перейти обратно: Перейти обратно: а б Ларкин, Дэниел; Сен, Сиддхартха; Тарьян, Роберт (2014). «Эмпирическое исследование приоритетных очередей». Материалы шестнадцатого семинара по разработке алгоритмов и экспериментам : 61–72. arXiv : 1403.0252 . Бибкод : 2014arXiv1403.0252L . дои : 10.1137/1.9781611973198.7 . ISBN  978-1-61197-319-8 . S2CID   15216766 .
  9. ^ Дрисколл, Джеймс Р.; Габоу, Гарольд Н.; Шрайрман, Рут; Тарьян, Роберт Э. (ноябрь 1988 г.). «Расслабленные кучи: альтернатива кучам Фибоначчи с приложениями к параллельным вычислениям» . Коммуникации АКМ . 31 (11): 1343–1354. дои : 10.1145/50087.50096 . S2CID   16078067 .
  10. Перейти обратно: Перейти обратно: а б с д Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л. (1990). Введение в алгоритмы (1-е изд.). MIT Press и McGraw-Hill. ISBN  0-262-03141-8 .
  11. ^ «Биномиальная куча | Блестящая вики по математике и естественным наукам» . блестящий.орг . Проверено 30 сентября 2019 г.
  12. ^ Бродал, Герт Столтинг; Окасаки, Крис (ноябрь 1996 г.), «Оптимальные чисто функциональные очереди приоритетов», Journal of Functional Programming , 6 (6): 839–857, doi : 10.1017/s095679680000201x
  13. ^ Яконо, Джон (2000), «Улучшенные верхние границы для спаривания куч», Proc. 7-й скандинавский семинар по теории алгоритмов (PDF) , Конспекты лекций по информатике, том. 1851, Springer-Verlag, стр. 63–77, arXiv : 1110.4428 , CiteSeerX   10.1.1.748.7812 , doi : 10.1007/3-540-44985-X_5 , ISBN  3-540-67690-2
  14. ^ Фредман, Майкл Лоуренс (июль 1999 г.). «Об эффективности объединения куч и связанных структур данных» (PDF) . Журнал Ассоциации вычислительной техники . 46 (4): 473–501. дои : 10.1145/320211.320214 .
  15. ^ Петти, Сет (2005). К окончательному анализу парных куч (PDF) . FOCS '05 Материалы 46-го ежегодного симпозиума IEEE по основам информатики. стр. 174–183. CiteSeerX   10.1.1.549.471 . дои : 10.1109/SFCS.2005.75 . ISBN  0-7695-2468-0 .
  16. ^ Хёплер, Бернхард; Сен, Сиддхартха; Тарьян, Роберт Э. (ноябрь 2011 г.). «Кучи ранговых пар» (PDF) . СИАМ Дж. Компьютерные технологии . 40 (6): 1463–1485. дои : 10.1137/100785351 .
  17. ^ Бродал, Герт Столтинг ; Лагояннис, Джордж; Тарьян, Роберт Э. (2012). Строгие кучи Фибоначчи (PDF) . Материалы 44-го симпозиума по теории вычислений - STOC '12. стр. 1177–1184. CiteSeerX   10.1.1.233.1740 . дои : 10.1145/2213977.2214082 . ISBN  978-1-4503-1245-5 .
  18. ^ Бродал, Герт С. (1996), «Эффективные приоритетные очереди для наихудшего случая» (PDF) , Proc. 7-й ежегодный симпозиум ACM-SIAM по дискретным алгоритмам , стр. 52–58.
  19. ^ Гудрич, Майкл Т .; Тамассия, Роберто (2004). «7.3.6. Построение кучи снизу вверх». Структуры данных и алгоритмы в Java (3-е изд.). стр. 338–341. ISBN  0-471-46983-1 .
  20. ^ Такаока, Тадао (1999), Теория 2–3 куч (PDF) , стр. 12

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 32944f3b8126ceb6d9615cf4c376d6fb__1718738220
URL1:https://arc.ask3.ru/arc/aa/32/fb/32944f3b8126ceb6d9615cf4c376d6fb.html
Заголовок, (Title) документа по адресу, URL1:
Fibonacci heap - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)