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

Глава 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.