Jump to content

Теневая куча

В информатике теневая куча это кучи объединяемая структура данных , которая поддерживает эффективное слияние кучи в амортизированном смысле. Более конкретно, теневые кучи используют алгоритм теневого слияния для достижения вставки за амортизированное время O (f( n )) и удаления за амортизированное время O ((log n log log n )/f( n )) для любого выбора 1 ≤ f( n ) ≤ журнал журнал n . [1]

В этой статье предполагается, что A и B — двоичные кучи с | А | ≤ | Б |.

Слияние теней

[ редактировать ]

Теневое слияние — это алгоритм эффективного объединения двух двоичных куч, если эти кучи реализованы как массивы . В частности, время выполнения слияния теней в двух кучах. и является .

Алгоритм

[ редактировать ]

Мы хотим объединить две двоичные минимальные кучи. и . Алгоритм следующий:

  1. Объединить массив в конце массива чтобы получить массив .
  2. Определите тень в ; то есть предки последних узлы в которые разрушают свойство кучи.
  3. Определите следующие две части тени от :
    • Путь : набор узлов в тени, для которых имеется не более 2 на любой глубине. ;
    • Поддерево : остаток тени.
  4. Извлеките и отсортируйте самые маленькие узлы из тени в массив .
  5. Трансформировать следующее:
    • Если , затем, начиная с наименьшего элемента отсортированного массива, последовательно вставьте каждый элемент в , заменив их на мельчайшие элементы.
    • Если , затем извлеките и отсортируйте мельчайшие элементы из и объединить этот отсортированный список с .
  6. Замените элементы на свои исходные позиции в .
  7. Сделать кучу из .

Время работы

[ редактировать ]

Опять же, пусть обозначают путь и обозначаем поддерево объединенной кучи . Количество узлов в не более чем в два раза превышает глубину , что . Кроме того, количество узлов в на глубине составляет не более 3/4 количества узлов на глубине , поэтому поддерево имеет размер . Поскольку на каждом уровне имеется не более 2 узлов , затем читаем самый маленький элементы тени в отсортированный массив берет время.

Если , затем объединив и как и в шаге 5 выше, требуется время . В противном случае время, затраченное на этом этапе, равно . Наконец, создание кучи поддерева берет время. Это составляет общее время выполнения теневого слияния .

Структура

[ редактировать ]

Теневая куча состоит из пороговой функции и массив , для которого обычное свойство двоичной кучи , реализованное в массиве, поддерживается в его первых записях и для которого свойство кучи не обязательно поддерживается в других записях. Таким образом, теневая куча по сути представляет собой двоичную кучу. рядом с массивом . Чтобы добавить элемент в теневую кучу, поместите его в массив . Если массив становится слишком большим в соответствии с указанным порогом, мы сначала создаем кучу из используя алгоритм Флойда для построения кучи, [2] а затем объединить эту кучу с использование слияния теней. Наконец, объединение теневых куч просто осуществляется путем последовательной вставки одной кучи в другую с использованием описанной выше процедуры вставки.

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

Используя этот потенциал, мы можем получить желаемое амортизированное время работы:

create( H ) : инициализирует новую пустую теневую кучу

Здесь потенциал остается неизменной, поэтому амортизированная стоимость создания равна , фактическая стоимость.

вставить( x , H ) : вставляет в теневую кучу

Есть два случая:
  • Если используется слияние, то падение потенциальной функции равно точно фактической стоимости слияния. и , поэтому амортизированная стоимость равна .
  • Если слияние не произведено, то амортизированная стоимость составит
Таким образом, выбрав пороговую функцию, мы получаем, что амортизированная стоимость внедрения равна:

delete_min( H ) : удаляет элемент с минимальным приоритетом из

Поиск и удаление минимума занимает фактическое время . При этом потенциальная функция после такого исключения может увеличиться только в том случае, если значение уменьшается. По выбору , имеем, что амортизированная стоимость данной операции равна фактической стоимости.
[ редактировать ]

Наивный алгоритм слияния двоичной кучи объединит две кучи. и вовремя путем простого объединения обеих куч и создания кучи из полученного массива с использованием алгоритма Флойда для построения кучи. Альтернативно, кучи можно просто объединить, последовательно вставляя каждый элемент. в , требуется время .

Сак и Стротхотт предложили алгоритм объединения двоичных куч в время. [3] Их алгоритм, как известно, более эффективен, чем второе наивное решение, описанное выше, примерно, когда . Слияние теней работает асимптотически лучше, чем их алгоритм, даже в худшем случае.

Есть несколько других куч, которые поддерживают более быстрое слияние. Например, кучи Фибоначчи можно объединить в время. Поскольку двоичные кучи требуют время объединиться, [4] слияние теней остается эффективным.

  1. ^ Кушмаул, Кристофер Л. (2000). Эффективные операции слияния и вставки для двоичных куч и деревьев (PDF) (Технический отчет). Отдел передовых суперкомпьютеров НАСА. 00-003.
  2. ^ Сученек, Марек А. (2012), «Элементарный, но точный анализ наихудшего случая программы построения кучи Флойда» , Fundamenta Informaticae , 120 (1), IOS Press: 75–92, doi : 10.3233/FI-2012-751
  3. ^ Зак, Йорг-Р.; Стротхотт, Томас (1985), «Алгоритм объединения куч», Acta Informatica , 22 (2), Springer-Verlag: 171–186, doi : 10.1007/BF00264229 , S2CID   6427624 .
  4. ^ Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л. (1990). Введение в алгоритмы (1-е изд.). MIT Press и McGraw-Hill. ISBN  0-262-03141-8 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c776c433c4524b8846d935a3ec7c0779__1690263780
URL1:https://arc.ask3.ru/arc/aa/c7/79/c776c433c4524b8846d935a3ec7c0779.html
Заголовок, (Title) документа по адресу, URL1:
Shadow heap - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)