Теневая куча
В информатике — теневая куча это кучи объединяемая структура данных , которая поддерживает эффективное слияние кучи в амортизированном смысле. Более конкретно, теневые кучи используют алгоритм теневого слияния для достижения вставки за амортизированное время O (f( n )) и удаления за амортизированное время O ((log n log log n )/f( n )) для любого выбора 1 ≤ f( n ) ≤ журнал журнал n . [1]
В этой статье предполагается, что A и B — двоичные кучи с | А | ≤ | Б |.
Слияние теней
[ редактировать ]Теневое слияние — это алгоритм эффективного объединения двух двоичных куч, если эти кучи реализованы как массивы . В частности, время выполнения слияния теней в двух кучах. и является .
Алгоритм
[ редактировать ]Мы хотим объединить две двоичные минимальные кучи. и . Алгоритм следующий:
- Объединить массив в конце массива чтобы получить массив .
- Определите тень в ; то есть предки последних узлы в которые разрушают свойство кучи.
- Определите следующие две части тени от :
- Путь : набор узлов в тени, для которых имеется не более 2 на любой глубине. ;
- Поддерево : остаток тени.
- Извлеките и отсортируйте самые маленькие узлы из тени в массив .
- Трансформировать следующее:
- Если , затем, начиная с наименьшего элемента отсортированного массива, последовательно вставьте каждый элемент в , заменив их на мельчайшие элементы.
- Если , затем извлеките и отсортируйте мельчайшие элементы из и объединить этот отсортированный список с .
- Замените элементы на свои исходные позиции в .
- Сделать кучу из .
Время работы
[ редактировать ]Опять же, пусть обозначают путь и обозначаем поддерево объединенной кучи . Количество узлов в не более чем в два раза превышает глубину , что . Кроме того, количество узлов в на глубине составляет не более 3/4 количества узлов на глубине , поэтому поддерево имеет размер . Поскольку на каждом уровне имеется не более 2 узлов , затем читаем самый маленький элементы тени в отсортированный массив берет время.
Если , затем объединив и как и в шаге 5 выше, требуется время . В противном случае время, затраченное на этом этапе, равно . Наконец, создание кучи поддерева берет время. Это составляет общее время выполнения теневого слияния .
Структура
[ редактировать ]Теневая куча состоит из пороговой функции и массив , для которого обычное свойство двоичной кучи , реализованное в массиве, поддерживается в его первых записях и для которого свойство кучи не обязательно поддерживается в других записях. Таким образом, теневая куча по сути представляет собой двоичную кучу. рядом с массивом . Чтобы добавить элемент в теневую кучу, поместите его в массив . Если массив становится слишком большим в соответствии с указанным порогом, мы сначала создаем кучу из используя алгоритм Флойда для построения кучи, [2] а затем объединить эту кучу с использование слияния теней. Наконец, объединение теневых куч просто осуществляется путем последовательной вставки одной кучи в другую с использованием описанной выше процедуры вставки.
Анализ
[ редактировать ]Нам дана теневая куча , с пороговой функцией как указано выше. Предположим, что пороговая функция такова, что любое изменение не вызывает больших изменений, чем в . Мы получаем желаемые границы времени выполнения операций объединяемой кучи , используя потенциальный метод амортизированного анализа . Потенциал кучи выбирается следующим образом:
Используя этот потенциал, мы можем получить желаемое амортизированное время работы:
create( H ) : инициализирует новую пустую теневую кучу
- Здесь потенциал остается неизменной, поэтому амортизированная стоимость создания равна , фактическая стоимость.
вставить( x , H ) : вставляет в теневую кучу
- Есть два случая:
- Если используется слияние, то падение потенциальной функции равно точно фактической стоимости слияния. и , поэтому амортизированная стоимость равна .
- Если слияние не произведено, то амортизированная стоимость составит
- Таким образом, выбрав пороговую функцию, мы получаем, что амортизированная стоимость внедрения равна:
delete_min( H ) : удаляет элемент с минимальным приоритетом из
- Поиск и удаление минимума занимает фактическое время . При этом потенциальная функция после такого исключения может увеличиться только в том случае, если значение уменьшается. По выбору , имеем, что амортизированная стоимость данной операции равна фактической стоимости.
Связанные алгоритмы и структуры данных
[ редактировать ]Наивный алгоритм слияния двоичной кучи объединит две кучи. и вовремя путем простого объединения обеих куч и создания кучи из полученного массива с использованием алгоритма Флойда для построения кучи. Альтернативно, кучи можно просто объединить, последовательно вставляя каждый элемент. в , требуется время .
Сак и Стротхотт предложили алгоритм объединения двоичных куч в время. [3] Их алгоритм, как известно, более эффективен, чем второе наивное решение, описанное выше, примерно, когда . Слияние теней работает асимптотически лучше, чем их алгоритм, даже в худшем случае.
Есть несколько других куч, которые поддерживают более быстрое слияние. Например, кучи Фибоначчи можно объединить в время. Поскольку двоичные кучи требуют время объединиться, [4] слияние теней остается эффективным.
Ссылки
[ редактировать ]- ^ Кушмаул, Кристофер Л. (2000). Эффективные операции слияния и вставки для двоичных куч и деревьев (PDF) (Технический отчет). Отдел передовых суперкомпьютеров НАСА. 00-003.
- ^ Сученек, Марек А. (2012), «Элементарный, но точный анализ наихудшего случая программы построения кучи Флойда» , Fundamenta Informaticae , 120 (1), IOS Press: 75–92, doi : 10.3233/FI-2012-751
- ^ Зак, Йорг-Р.; Стротхотт, Томас (1985), «Алгоритм объединения куч», Acta Informatica , 22 (2), Springer-Verlag: 171–186, doi : 10.1007/BF00264229 , S2CID 6427624 .
- ^ Кормен, Томас Х .; Лейзерсон, Чарльз Э .; Ривест, Рональд Л. (1990). Введение в алгоритмы (1-е изд.). MIT Press и McGraw-Hill. ISBN 0-262-03141-8 .