WikiDer > Мин-макс куча

Min-max heap
Мин-макс куча
Типдвоичное дерево / куча
Изобрел1986
Сложность времени в нотация большой O
АлгоритмСреднийХудший случай
ВставлятьO (журнал n)O (журнал n)
УдалитьO (журнал n) [1]O (журнал n)

В Информатика, а мин Макс куча это полный двоичное дерево структура данных который сочетает в себе полезность как мин-куча и max-heap, то есть он обеспечивает постоянное время извлечения и логарифмическое удаление как минимальных, так и максимальных элементов в нем.[2] Это делает кучу min-max очень полезной структурой данных для реализации двусторонняя приоритетная очередь. Как и двоичные минимальные и максимальные кучи, минимальные и максимальные кучи поддерживают логарифмическую вставку и удаление и могут быть построены за линейное время.[3] Кучи min-max часто неявно представлены в множество;[4] следовательно, это называется неявная структура данных.

В min-max куча недвижимость: каждый узел на четном уровне в дереве меньше, чем все его потомки, в то время как каждый узел на нечетном уровне в дереве больше, чем все его потомки.[4]

Структура также может быть обобщена для эффективной поддержки других операций статистики порядка, таких как найти-медиана, удалить-медиана,[2]найти (к) (определить kth наименьшее значение в структуре) и операция удалить (k) (удалите kth наименьшее значение в структуре), для любого фиксированного значения (или набора значений) k. Эти две последние операции могут быть реализованы за постоянное и логарифмическое время соответственно. Понятие минимального и максимального порядка может быть распространено на другие структуры на основе максимального или минимального порядка, например левые деревья, генерируя новый (и более мощный) класс структур данных.[4] Куча min-max также может быть полезна при реализации внешней быстрой сортировки.[5]

Описание

  • Куча min-max - это полное двоичное дерево содержащие чередующиеся мин (или же четное) и Максимум (или же странный) уровни. Четные уровни - это, например, 0, 2, 4 и т.д., а нечетные уровни - соответственно 1, 3, 5 и т.д. В следующих пунктах мы предполагаем, что корневой элемент находится на первом уровне, то есть 0.
Пример минимальной и максимальной кучи
  • Каждый узел в куче min-max имеет член данных (обычно называемый ключ), значение которого используется для определения порядка узла в куче min-max.
  • В корень элемент - это самый маленький/величайший элемент в куче min-max.
  • Один из двух элементов на втором уровне, который является максимальным (или нечетным) уровнем, является самым большим элементом в куче min-max.
  • Позволять быть любым узлом в куче min-max.
    • Если находится на минимальном (или даже) уровне, то это минимальный ключ среди всех ключей в поддереве с корнем .
    • Если находится на максимальном (или нечетном) уровне, то это максимальный ключ среди всех ключей в поддереве с корнем .
  • Узел на минимальном (максимальном) уровне называется минимальным (максимальным) узлом.

А макс-мин куча определяется аналогично; в такой куче максимальное значение хранится в корне, а наименьшее значение сохраняется в одном из дочерних элементов корня.[4]

Операции

В следующих операциях мы предполагаем, что куча min-max представлена ​​в массиве A [1..N]; В положение в массиве будет соответствовать узлу, расположенному на уровне в куче.

Строить

Создание кучи min-max осуществляется путем адаптации алгоритма построения кучи с линейным временем Флойда, который работает снизу вверх.[4] Типичный Флойд строительная куча алгоритм[6] идет следующим образом:

функция FLOYD-BUILD-HEAP(час):    за каждый индекс я из вплоть до 1 делать:        выталкивание(час, я)    возвращаться час

В этой функции час - это исходный массив, элементы которого не могут быть упорядочены в соответствии со свойством кучи min-max. В выталкивание операция (которую иногда также называют нагружать) кучи min-max объясняется далее.

Толкать вниз

В выталкивание алгоритм (или просачиваться вниз как это называется в [4]) как следует:

функция PUSH-DOWN(час, я):    если я находится на минимальном уровне тогда:        НАЖАТЬ-ВНИЗ(час, я)    еще:        НАЖАТЬ-ВНИЗ-МАКС. (час, я)    endif

Отжимание мин.

функция PUSH-DOWN-MIN(час, я):    если я есть дети тогда:        м : = индекс самого маленького ребенка или внука я        еслим внук я тогда:            если ч [м] < Здравствуй] тогда:                замена ч [м] и Здравствуй]                если ч [м] > h [родитель (м)] тогда:                    замена ч [м] и h [родитель (м)]                endif                НАЖАТЬ-ВНИЗ(час, м)            endif        иначе если ч [м] < Здравствуй] тогда:            замена ч [м] и Здравствуй]        endif     endif

Отталкивать Макс

Алгоритм для отжимание макс идентичен таковому для push-down-min, но со всеми операторами сравнения обратными.

функция PUSH-DOWN-MAX(час, я):    если я есть дети тогда:        м : = индекс самого большого ребенка или внука я        если м внук я тогда:            если ч [м] > Здравствуй] тогда:                замена ч [м] и Здравствуй]                если ч [м] < h [родитель (м)] тогда:                    замена ч [м] и h [родитель (м)]                endif                НАЖАТЬ-ВНИЗ-МАКС.(час, м)            endif        иначе если ч [м] > Здравствуй] тогда:            замена ч [м] и Здравствуй]        endif     endif

Итерационная форма

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

функция PUSH-DOWN-MIN-ITER(час, м):    пока м есть дети тогда:        я: = м        м : = индекс самого маленького ребенка или внука я        если м внук я тогда:            если ч [м] < Здравствуй] тогда:                замена ч [м] и Здравствуй]                если ч [м] > h [родитель (м)] тогда:                    замена ч [м] и h [родитель (м)]                endif            endif        иначе если ч [м] < Здравствуй] тогда:            замена ч [м] и Здравствуй]        еще            перемена endif     в конце концов

Вставка

Чтобы добавить элемент в кучу min-max, выполните следующие операции:

  1. Добавьте требуемый ключ в (конец) массива, представляющего кучу min-max. Это, скорее всего, нарушит свойства кучи min-max, поэтому нам нужно настроить кучу.
  2. Сравните новый ключ с его родительским:
    1. Если выясняется, что он меньше (больше), чем родительский, то он наверняка меньше (больше), чем все другие узлы на максимальных (минимальных) уровнях, которые находятся на пути к корню кучи. Теперь просто проверьте узлы на минимальных (максимальных) уровнях.
    2. Путь от нового узла к корню (учитывая только минимальные (максимальные) уровни) должен быть в порядке убывания (возрастания), как это было до вставки. Итак, нам нужно сделать двоичную вставку нового узла в эту последовательность. Технически проще поменять местами новый узел с его родителем, пока родитель больше (меньше).

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

Отжимание

В отжимание алгоритм (или пузыриться как это называется в [7]) как следует:

функция PUSH-UP(час, я):    если я это не корень тогда:        если я находится на минимальном уровне тогда:            если h [i]> h [родитель (i)] тогда:                замена Здравствуй] и h [родитель (я)]                PUSH-UP-MAX(h, родитель (я))            еще:                PUSH-UP-MIN(час, я)            endif        еще:            если ч [я] <ч [родитель (я)] тогда:                замена Здравствуй] и h [родитель (я)]                PUSH-UP-MIN(h, родитель (я))            еще:                PUSH-UP-MAX(час, я)            endif        endif    endif

Отжимания мин.

функция PUSH-UP-MIN(час, я):    если я есть бабушка и дедушка и ч [я] <ч [дедушка (я)] тогда:        замена Здравствуй] и h [дедушка (я)]        PUSH-UP-MIN(ч, дедушка и бабушка (я))    endif

Отжимания Макс

Как и в случае с выталкивание операции, отжимания-макс идентичен отжимания мин, но с обратными операторами сравнения:

функция PUSH-UP-MAX(час, я):    если я есть бабушка и дедушка и h [i]> h [дедушка / бабушка (i)] тогда:        замена Здравствуй] и h [дедушка (я)]        PUSH-UP-MAX(ч, дедушка и бабушка (я))    endif

Итерационная форма

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

функция PUSH-UP-MIN-ITER(час, я):    пока я есть бабушка и дедушка и ч [я] <ч [дедушка (я)] тогда:        замена Здравствуй] и h [дедушка / бабушка (я)]        я := дедушка и бабушка (я)    в конце концов

Пример

Вот один из примеров вставки элемента в кучу Min-Max.

Скажем, у нас есть следующая куча min-max и мы хотим вставить новый узел со значением 6.

Пример минимальной и максимальной кучи

Первоначально узел 6 вставляется как правый дочерний узел узла 11. 6 меньше 11, поэтому он меньше, чем все узлы на максимальных уровнях (41), и нам нужно проверить только минимальные уровни (8 и 11 ). Мы должны поменять местами узлы 6 и 11, а затем поменять местами 6 и 8. Итак, 6 перемещается в корневую позицию кучи, бывший корень 8 перемещается вниз, чтобы заменить 11, а 11 становится правым дочерним элементом 8.

Рассмотрите возможность добавления нового узла 81 вместо 6. Первоначально узел вставляется как правый дочерний узел узла 11. 81 больше 11, поэтому он больше любого узла на любом из минимальных уровней (8 и 11). Теперь нам нужно только проверить узлы на максимальных уровнях (41) и сделать один обмен.

Найти минимум

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

Найти максимум

Максимальный узел (или максимальный узел в случае повторяющихся ключей) кучи Min-Max всегда находится на первом максимальном уровне, то есть как один из ближайших дочерних элементов корня. Таким образом, Find Maximum требует не более одного сравнения, чтобы определить, какой из двух дочерних элементов корня больше, и, таким образом, также является операцией с постоянным временем.

Удалить минимум

Удаление минимума - это просто частный случай удаления произвольного узла, индекс которого в массиве известен. В этом случае последний элемент массива удаляется (уменьшая длину массива) и используется для замены корня в заголовке массива. выталкивание затем вызывается в корневом индексе для восстановления свойства кучи в время.

Удалить максимум

Удаление максимума снова является частным случаем удаления произвольного узла с известным индексом. Как и в операции поиска максимума, требуется одно сравнение для определения максимального дочернего элемента корня, после чего он заменяется последним элементом массива и выталкивание затем вызывается по индексу замененного максимума для восстановления свойства кучи.

Расширения

Куча min-max-median - это вариант кучи min-max, предложенный в исходной публикации по структуре, которая поддерживает операции дерево статистики заказов.

Рекомендации

  1. ^ Мишель. "Джим". Переполнение стека. Получено 8 сентября 2016.
  2. ^ а б АТКИНСОН, M.D; SACK, J.-R; SANTORO, N .; СТРОТОТТ, Т. (1986). Манро, Ян (ред.). «Минимум-максимум кучи и очереди с общим приоритетом» (PDF). Коммуникации ACM. 29 (10): 996–1000. Дои:10.1145/6617.6621.
  3. ^ АТКИНСОН, M.D; SACK, J.-R; SANTORO, N .; СТРОТОТТ, Т. (1986). Манро, Ян (ред.). «Минимум-максимум кучи и очереди с общим приоритетом» (PDF). Коммуникации ACM. 29 (10): 996–1000. Дои:10.1145/6617.6621.
  4. ^ а б c d е ж АТКИНСОН, M.D; SACK, J.-R; SANTORO, N .; СТРОТОТТ, Т. (1986). Манро, Ян (ред.). «Минимум-максимум кучи и очереди с общим приоритетом» (PDF). Коммуникации ACM. 29 (10): 996–1000. Дои:10.1145/6617.6621.
  5. ^ Gonnet, Gaston H .; Баеза-Йейтс, Рикардо (1991). Справочник по алгоритмам и структурам данных: на языках Pascal и C. ISBN 0201416077.
  6. ^ К. Папарризос, Иоаннис (2011). «Жесткая граница наихудшего числа сравнений для алгоритма построения кучи Флойда». arXiv:1012.0956. Bibcode:2010arXiv1012.0956P. Цитировать журнал требует | журнал = (помощь)
  7. ^ АТКИНСОН, M.D; SACK, J.-R; SANTORO, N .; СТРОТОТТ Т. (1986). Манро, Ян (ред.). «Минимум-максимум кучи и очереди с общим приоритетом» (PDF). Коммуникации ACM. 29 (10): 996–1000. Дои:10.1145/6617.6621.