Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Глава 8. Кучи и приоритетные очереди

3. Во второй фазе алгоритма мы начинаем с пустого списка и движения

граница между кучей и списком справа налево, один шаг за один раз. В шаге i (я = 1..., n), мы удаляем максимальный элемент из кучи и храним ее в разряде n- я.

Вышеупомянутое изменение вида кучи, как говорят, оперативное, так как мы используем только довод «против» -

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

3 4

(a) 37214 (f) 43217

3 2

1

7 3

(b) 73214 (g) 31247

3 1 2

7 2

(c) 73214 (h) 21347

3 2 1

7

(d) 73214 (i) 12347 1

3 2

1

7

(e) 74213 (j) 12347

4 2

1 3

Рисунок 8.9: оперативный вид кучи. Части (a) через (e) показывают добавление элементов к куче; (f) через (j) показывают удаление последовательных элементов. Части множества, которые используются для структуры кучи, отображают синим.

8.3. Кучи 353

8.3.6 Восходящее строительство кучи ⋆

Анализ алгоритма вида кучи показывает, что мы можем построить кучу stor-луг n, элементы в O (n регистрируют n), время, посредством n последовательных операций по вставке, и затем используйте ту кучу, чтобы извлечь элементы в заказе. Однако, если все элементы, которые будут сохранены в куче, даны заранее, есть альтернатива, вверх дном подставляют - struction функция, которая управляет в O (n) временем. Мы описываем эту функцию в этой секции, замечая, что это может быть включено как один из конструкторов в классе Кучи вместо того, чтобы заполнить кучу, используя ряд операций по вставке n. Для простоты мы описываем это восходящее строительство кучи, предполагающее, что номер n ключей - целое число

тип n = 2 ч- 1. Таким образом, куча - полное двоичное дерево с каждым уровнем быть

полный, таким образом, у кучи есть высота h = регистрация (n + 1). Рассматриваемый нерекурсивно, восходящая куча

строительство состоит из следующего h = регистрация (n + 1) шаги:

1. В первом шаге (см. рисунок 8.10 (a)), мы строим (n + 1)/2 элементарные кучи

хранение одного входа каждый.

2. Во втором шаге (см. рисунок 8.10 (b) - (c)), мы формируем (n + 1)/4 кучи, каждого

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

3. В третьем шаге (см. рисунок 8.10 (d) - (e)), мы формируем (n + 1)/8 кучи, каждого

хранение 7 записей, присоединяясь к парам куч с 3 входами (построенный в пред - vious шаг) и добавляя новый вход. Новый вход помещен первоначально в корень, но, вероятно, придется спуститься с вниз-кучей, пузырящейся, чтобы сохранить собственность заказа кучи.

..

.

i. В универсальном шаге ith,£ £2 ih, мы формируем (n+1)/2i кучи, каждое хранение 2i-1

записи, присоединяясь к парам хранения куч (2i-1 - 1) записи (построенный в

предыдущий шаг) и добавление нового входа. Новый вход помещен первоначально в

корень, но, вероятно, придется спуститься с вниз-кучей, пузырящейся, чтобы сохранить собственность заказа кучи.

.. .

h + 1. В последнем шаге (см. рисунок 8.10 (f) - (g)), мы формируем заключительную кучу, храня все

n записи, присоединяясь к двум хранению куч (n- 1)/2 записи (построенный в

предыдущий шаг) и добавление нового входа. Новый вход помещен первоначально в

корень, но, вероятно, придется спуститься с вниз-кучей, пузырящейся, чтобы сохранить собственность заказа кучи.

Мы иллюстрируем восходящее строительство кучи в рисунке 8.10 для h = 3.