Пирамиды и пирамидальная сортировка

Содержание

Слайд 2

Пирамида

Пирамида является структурой данных, позволяющей обратиться к наибольшему элементу за время O(1),

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

Слайд 3

Пример пирамиды

Пример пирамиды

Слайд 4

Свойство полноты

Второе свойство называется свойством полноты и заключается в том, что это

Свойство полноты Второе свойство называется свойством полноты и заключается в том, что
дерево содержит все возможные узлы при заполнении слева направо и сверху вниз.
На рисунке слева изображено полное дерево, а справа – неполное.

Слайд 5

Пирамида на основе массива

Наиболее простой реализацией пирамиды является реализация на основе массива.
При

Пирамида на основе массива Наиболее простой реализацией пирамиды является реализация на основе
этом каждому узлу дерева соответствует конкретная ячейка массива.
Именно свойство полноты позволяет осуществить такое отображение (обеспечить отсутствие «дыр» в массиве).

Слайд 6

Пример пирамиды на основе массива

Пример пирамиды на основе массива

Слайд 7

Связь между деревом и массивом

Благодаря такому отображению для любого узла можно определить

Связь между деревом и массивом Благодаря такому отображению для любого узла можно
индексы его родителя и потомков. Пусть i – индекс некоторого узла в массиве, тогда
индекс родителя равен (i-1) /2;
индекс левого потомка равен 2*i+1;
индекс левого потомка равен 2*i+2.
В качестве упражнения проверьте эти формулы для приведённого рисунка.

Слайд 8

Реализация операций

Рассмотрим теперь, как реализуются операции взятия наибольшего элемента, вставки нового элемента

Реализация операций Рассмотрим теперь, как реализуются операции взятия наибольшего элемента, вставки нового
и удаления наибольшего.
Для обращения к наибольшему элементу пирамиды достаточно взять первый элемент массива.
Операции вставки нового элемента и удаления наибольшего элемента несколько сложнее, то осуществляются быстро – за время O(log2N).

Слайд 9

Удаление вершины

Поскольку удаляется первый элемент, то в массиве образуется «дыра», и возникает

Удаление вершины Поскольку удаляется первый элемент, то в массиве образуется «дыра», и
необходимость исключить её, восстановив тем самым полноту дерева. Для этого существует следующий алгоритм:
переместить последний узел в корень (на место удалённого);
смещать его вниз до тех пор, пока он не окажется на подходящем месте (меньше либо равен родители и больше либо равен потомков).
При смещении вниз, очевидно, существуют две альтернативы: влево или вправо. Так вот смещать следует в сторону большего из этих двух узлов, чтобы не нарушить слабую упорядоченность.

Слайд 10

Пример удаления вершины

Пример удаления вершины

Слайд 11

Добавление нового элемента

Рассмотрим теперь операцию добавления нового элемента.
Сложность этой процедуры состоит

Добавление нового элемента Рассмотрим теперь операцию добавления нового элемента. Сложность этой процедуры
в том, что после добавления должна быть сохранена слабая упорядоченность дерева.
Алгоритм добавления похож на алгоритм удаления и состоит из следующих шагов:
поместить новый узел на последнюю позицию;
смещать его вверх до тех пор, пока он не станет меньше либо равен своего родителя.

Слайд 12

Пример добавления

Пример добавления

Слайд 13

Пирамидальная сортировка

С использованием пирамиды можно осуществить сортировку массива по следующему алгоритму.
Цикл

Пирамидальная сортировка С использованием пирамиды можно осуществить сортировку массива по следующему алгоритму.
i=0..N-1
Добавить(Массив[i]);
Цикл i=0..N-1
Массив[i] := ВершинаПирамиды;
Удалить ВершинуПирамиды;
Массив окажется отсортированным в силу того, что вершина пирамиды – это её наибольший элемент. Этот алгоритм напоминает сортировку методом прямого выбора, но с более эффективным поиском максимального элемента.

Слайд 14

Реализация пирамиды на С++

Реализация пирамиды на С++

Слайд 15

Реализация добавления

Реализация добавления

Слайд 16

Тестирование программы

Тестирование программы

Слайд 17

Реализация вывода пирамиды в виде дерева

Реализация вывода пирамиды в виде дерева

Слайд 18

Вывод пирамиды в виде дерева

Вывод пирамиды в виде дерева

Слайд 19

Реализация удаления вершины

Реализация удаления вершины

Слайд 20

Реализация пирамидальной сортировки - 1

Реализация пирамидальной сортировки - 1

Слайд 21

Реализация пирамидальной сортировки - 2

Реализация пирамидальной сортировки - 2

Слайд 22

Оптимизация цепочки перестановок

При добавлении и удалении элементов в пирамиде производится цепочка перестановок,

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

Слайд 23

Пример оптимизации перестановок

Пример оптимизации перестановок