Почему кучи Фибоначчи нуждаются в каскадных сокращениях?

Я изучаю f-heap от "введения к алгоритмам", и операция "уменьшение-ключ" действительно меня смущает - зачем это нужно "каскадно-разрезать"?

если эта операция удалена:

  • стоимость make-heap(), insert(), minimum() и union() остается, очевидно, неизменной
  • extract-min() все еще O (D (n)), потому что в операции O (n)) "консолидировать" стоимость большинства корневых деревьев может быть оплачена , когда они были добавлены в корневой список, а остальные затраты O (D (n))
  • reduce-key(): очевидно, O (1)

Что касается D (n), хотя я не могу это точно объяснить, я думаю, что он все еще O (lgn), cuz без "каскадного разреза", node может быть просто перенесен в root немного позже, а любые node скрытые под своим отцом не влияют на эффективность. По крайней мере, это не ухудшит ситуацию.

извиниться за мой бедный английский: (

Кто-нибудь может помочь? спасибо

Ответ 1

Причина каскадного сокращения заключается в том, чтобы D (n) был низким. Оказывается, что если вы разрешаете любое количество узлов быть отрезанным от дерева, то D (n) может расти линейным, что делает удаление и удаление-min линейным.

Интуитивно, вы хотите, чтобы число узлов в дереве порядка k было экспоненциальным по k. Таким образом, вы можете иметь логарифмически много деревьев в консолидированной куче. Если вы можете вырезать произвольное количество узлов из дерева, вы потеряете эту гарантию. В частности, вы могли бы взять дерево порядка k, а затем разрезать всех своих внуков. Это оставляет дерево с k детьми, каждый из которых - листья. Следовательно, вы можете создавать деревья порядка k с помощью всего k + 1 тотальных узлов в них. Это означает, что в худшем случае вам понадобится дерево порядка n - 1 для хранения всех узлов, поэтому D (n) станет n - 1, а не O (log n).

Надеюсь, это поможет!