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

8.3. Кучи 347

(a) (b)

(c) (d)

(e) (f)

(g) (h)

Рисунок 8.8: Удаление элемента с самым маленьким ключом от кучи: (a) и (b) удаление последнего узла, элемент которого перемещен в корень; (c) и (d) обмениваются, чтобы в местном масштабе восстановить собственность заказа кучи; (e) и (f) другой обмен; (g) и (h) заключительный обмен.

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

Анализ

Таблица 8.2 показывает продолжительность приоритетной очереди функции ADT для внедрения кучи приоритетной очереди, предполагая, что два ключа могут быть сравнены в O (1) время и что куча T осуществлена или с вектором или связана struc-ture.

Операционный размер, пустой

минута

вставка removeMin

Время O (1) O (1) O (регистрируют n), O (регистрируют n),

Таблица 8.2: Выступление приоритетной очереди поняло посредством кучи, которая в свою очередь осуществлена с вектором или связанной структурой. Мы обозначаем с n число записей в приоритетной очереди в то время, когда метод выполнен. Космическое требование - O (n). Продолжительность операционной вставки и removeMin - худший случай для внедрения списка множества кучи и амортизируемый для связанного представления.

Короче говоря, каждая приоритетная очередь, функции ADT могут быть выполнены в O (1) время или в O (регистрируют n) время, где n - ряд элементов в это время функция, казнена. Этот анализ основан на следующем:

• У кучи T есть n узлы, каждый хранящий ссылку на вход

• Операции добавляют и удаляют на T, берут любого O (1) амортизируемое время (вектор

представление) или O (регистрируют n), время худшего случая

• В худшем случае-куча и пузырение вниз-кучи выполняют много

обмены равняются высоте T

• Высота кучи T является O (зарегистрируйте n), так как T полон (Суждение 8.5)

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

Мы приходим к заключению, что структура данных кучи - очень эффективная реализация приоритетной очереди ADT, независимый от того, осуществлена ли куча со связанной структурой или вектором. Основанное на куче внедрение достигает быстрой продолжительности и для вставки и для удаления, в отличие от основанной на списке приоритетной очереди implementa-tions. Действительно, важное последствие эффективности основанного на куче imple-процесса мышления - то, что это может ускорить сортировку приоритетной очереди, чтобы быть намного быстрее, чем основанный на списке вид вставки и алгоритмы вида выбора.

8.3. Кучи 349

8.3.4 C ++ внедрение

В этой секции мы представляем основанное на куче приоритетное внедрение очереди. Куча

осуществлен, используя основанное на векторе полное внедрение дерева, которое мы представили в Разделе 8.3.2.

В Кодовом Фрагменте 8.7, мы представляем определение класса. Общественная часть класса - по существу то же самое как интерфейс, но, чтобы сохранять кодекс простым, мы проигнорировали проверку на ошибки. Участники данных класса состоят из полного дерева, названного T и случаем объекта компаратора, названного островами. Мы также предоставили определение типа для положения узла в дереве, названном Положением.

шаблон <typename E, typename C>

класс HeapPriorityQueue

общественность:

международный размер () константа; пустой bool () константа; недействительная вставка (константа E& e); константа E& минута (); пустота removeMin ();

частный:

// // // // //

ряд элементов очередь пуст? ми элемента вставки ni мама el ement удаляет минимум

VectorCompleteTree <E> T; //приоритетное содержание C isLess очереди; //меньше компаратор

//короткий путь для положения дерева

typedef typename VectorCompleteTree <E>:: Положение Положения;

;

Кодовый Фрагмент 8.14: основанное на куче внедрение приоритетной очереди.

В Кодовом Фрагменте 8.15, мы представляем внедрения простого участника

размер функций, пустой, и минута. Минута функции возвращает ссылку на элемент корня с помощью «*» оператор, которому предоставляет класс Положения VectorCompleteTree.

шаблон <typename E, typename C> //интервал ряда элементов HeapPriorityQueue <E, C>:: размер () константа

возвращают T.size ();шаблон <typename E, typename C> //действительно ли очередь пуста?

bool HeapPriorityQueue <E, C>:: пустой () константа

возвращают размер () == 0;

шаблон <typename E, typename C> //ми ni мама константа E& HeapPriorityQueue el ement <E, C>:: минута ()

возвращаются * (T.root ()); //возвращают ссылку, чтобы внедрить элемент

Кодовый Фрагмент 8.15: участник функционирует размер, пустой, и минута.

350