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

8.2. Осуществление приоритетной очереди со списком 335

8.2.2 Вид выбора и вид вставки

Вспомните схему PriorityQueueSort, введенную в Разделе 8.1.5. Нам дают

несортированный список L, содержащий n элементы, которые мы сортируем использование приоритетной очереди P в двух фазах. В первой фазе мы вставляем все элементы, и во второй фазе, мы неоднократно удаляем элементы, используя минуту и removeMin операции.

Вид выбора

Если мы осуществляем приоритетную очередь P с несортированным списком, то первая фаза

PriorityQueueSort берет O (n) время, так как мы можем вставить каждый элемент в постоянное время. Во второй фазе продолжительность каждой минуты и removeMin операции в настоящее время пропорциональна ряду элементов в P. Таким образом вычисление узкого места в этом внедрении - повторный «выбор» минимального элемента из несортированного списка во второй фазе. Поэтому этот алгоритм более известен как вид выбора. (См. рисунок 8.1.)

Список L

Приоритетная очередь P

Вход

(7, 4, 8, 2, 5, 3, 9)

()

Фаза 1

(a)

(4, 8, 2, 5, 3, 9)

(7)

(b)

(8, 2, 5, 3, 9)

(7, 4)

..

..

..

.

.

.

(g)

()

(7, 4, 8, 2, 5, 3, 9)

Фаза 2

(a)

(2)

(7, 4, 8, 5, 3, 9)

(b)

(2, 3)

(7, 4, 8, 5, 9)

(c)

(2, 3, 4)

(7, 8, 5, 9)

(d)

(2, 3, 4, 5)

(7, 8, 9)

(e)

(2, 3, 4, 5, 7)

(8, 9)

(f)

(2, 3, 4, 5, 7, 8)

(9)

(g)

(2, 3, 4, 5, 7, 8, 9)

()

Рисунок 8.1: Выполнение вида выбора в списке L = (7, 4, 8, 2, 5, 3, 9).

Как отмечено выше, узкое место - вторая фаза, куда мы неоднократно пере - перемещаем элемент с самым маленьким ключом от приоритетной очереди P. Размер P начинается в n и уменьшениях к 0 с каждым removeMin. Таким образом, первая removeMin операция

занимает время O (n), второй занимает время O (n- 1) и так далее. Поэтому, общее количество

время, необходимое для второй фазы,

O (n + (n- 1) + + 2 + 1) = O (ån=1 i). я

Суждением 4.3, у нас естьån=1 i = n (n + 1)/2. Таким образом фаза два берет O (n2) я

время, как делает весь алгоритм вида выбора.

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

Вид вставки

Если мы осуществляем приоритетную очередь P использование сортированного списка, то мы улучшаем пробег -

время ning второй фазы к O (n), потому что каждая операционная минута и removeMin на P теперь берут O (1) время. К сожалению, первая фаза теперь становится горлышком бутылки для продолжительности, с тех пор, в худшем случае, каждая операция по вставке занимает время пропорциональная размеру P. Этот алгоритм сортировки поэтому более известен как вид вставки (см. рисунок 8.2), поскольку узкое место в этом алгоритме сортировки включает повторную «вставку» нового элемента в соответствующем положении в сортированном списке.

Список L Приоритетная очередь P

Вход

(7, 4, 8, 2, 5, 3, 9)

()

Фаза 1

(a)

(4, 8, 2, 5, 3, 9)

(7)

(b)

(8, 2, 5, 3, 9)

(4, 7)

(c)

(2, 5, 3, 9)

(4, 7, 8)

(d)

(5, 3, 9)

(2, 4, 7, 8)

(e)

(3, 9)

(2, 4, 5, 7, 8)

(f)

(9)

(2, 3, 4, 5, 7, 8)

(g)

()

(2, 3, 4, 5, 7, 8, 9)

Фаза 2

(a)

(2)

(3, 4, 5, 7, 8, 9)

(b)

(2, 3)

(4, 5, 7, 8, 9)

..

.

(g)

..

.

(2, 3, 4, 5, 7, 8, 9)

..

.

()

Рисунок 8.2: Выполнение вида вставки в списке L = (7, 4, 8, 2, 5, 3, 9). В Фазе 1 мы неоднократно удаляем первый элемент L и вставляем его в P, просматривая список, осуществляющий P, пока мы не находим правильное место для этого элемента. В Фазе 2 мы неоднократно выполняем removeMin операции на P, каждый из которых возвращает первый элемент списка, осуществляющего P, и мы добавляем элемент в конце L.

Анализируя продолжительность Фазы 1 вида вставки, мы отмечаем это

O (1 + 2 +... + (n- 1) + n) = O (ån=1 i). я

Снова, вспоминая Суждение 4.3, первая фаза управляет в O (n2) временем; следовательно, весь алгоритм - также.

Поочередно, мы могли изменить наше определение вида вставки так, чтобы мы вставили элементы, начинающиеся с конца последовательности приоритетной очереди в первой фазе, когда выполнение вида вставки в списке, который уже сортирован, управляло бы в O (n) временем. Действительно, продолжительность вида вставки - O (n + I) в этом случае, где я - число инверсий во входном списке, то есть, число пар элементов, которые начинаются во входном списке в неправильном относительном заказе.