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

8.3. Кучи 337

8.3 Кучи

Два внедрения схемы PriorityQueueSort, представленной в previ-ous секция, предлагают возможный способ улучшить продолжительность для сортировки приоритетной очереди. Один алгоритм (вид выбора) достигает быстрой продолжительности для первой фазы, но имеет медленную вторую фазу, тогда как другой алгоритм (вид вставки) имеет медленную первую фазу, но достигает быстрой продолжительности для второй фазы. Если мы могли бы так или иначе уравновесить продолжительность этих двух фаз, мы могли бы быть в состоянии значительно ускорить полную продолжительность для сортировки. Этот подход, фактически, точно что мы можем достигнуть использования внедрения приоритетной очереди, обсужденного в этой секции.

Эффективная реализация приоритетной очереди использует структуру данных, названную кучей. Эта структура данных позволяет нам выполнить и вставки и удаления в logarith-время микрометра, которое является существенным улучшением по основанным на списке внедрениям, обсужденным в Разделе 8.2. Фундаментальным путем куча достигает этого улучшения, должен оставить идею сохранить элементы и вводит список, и проявите подход хранения элементов, и вводит двоичное дерево вместо этого.

8.3.1 Структура данных кучи

Куча (см. рисунок 8.3) является двоичным деревом T, который хранит коллекцию элементов с

их связанные ключи в его узлах и это удовлетворяет два дополнительных свойства: относительная собственность, определенная с точки зрения способа, которым ключи сохранены в T и структурной собственности, определила с точки зрения узлов самого T. Мы предполагаем, что полное отношение заказа на ключах дано, например, компаратором.

Относительная собственность T, определенного с точки зрения способа, которым сохранены ключи, является следующим:

Собственность заказа кучи: В куче T, для каждого узла v кроме корня, ключа

связанный с v больше, чем или равен ключу, связанному с родителем v.

В результате собственности заказа кучи ключи, с которыми сталкиваются на пути от корня до внешнего узла T, находятся в неуменьшающемся заказе. Кроме того, минимальный ключ всегда хранится в корне T. Это - самый важный ключ и, как неофициально говорят, «наверху кучи», следовательно, имя «куча» для структуры данных. Между прочим, структура данных кучи, определенная здесь, не имеет никакого отношения к свободному - куча памяти магазина (Раздел 14.1.1), используемый в окружающей среде во время выполнения, поддерживающей языки программирования как C ++.

Вы могли бы задаться вопросом, почему кучи определены с самым маленьким ключом наверху, а не самым большим. Различие произвольно. (Это свидетельствуется фактом, что приоритетная очередь STL делает точно противоположное.) Вспоминают что компаратор

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

Рисунок 8.3: Пример кучи, хранящей 13 элементов. Каждый элемент - пара значения ключа формы (k, v). Куча заказана основанная на значении ключа, k, каждого элемента.

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

Предостережение

определяя минимальный ключ с точки зрения компаратора, «минимальный» ключ с «обратным» компаратором является фактически самым большим. Таким образом, без потери общности, мы предполагаем, что всегда интересуемся минимальным ключом, который всегда является в корне кучи.

Ради эффективности, которая становится ясной позже, мы хотим, чтобы у кучи T была максимально маленькая высота. Мы проводим в жизнь это желание, настаивая, чтобы куча T удовлетворила дополнительную структурную собственность, это должно быть полно. Прежде чем мы определим эту структурную собственность, нам нужны некоторые определения. Мы вспоминаем из Раздела 7.3.3, что уровень i двоичного дерева T является набором узлов T, у которых есть глубина i. Данные узлы v и w на том же самом уровне T, мы говорим, что v налево от w, если с v сталкиваются прежде w в inorder пересечении T. Таким образом, есть узел u T, таким образом, что v находится в левом поддереве u, и w находится в правильном поддереве u. Например, в двоичном дереве рисунка 8.3, вход хранения узла (15, K) налево от входа хранения узла (7, Q). В стандартном рисунке двоичного дерева, «налево от» отношения визуализируется относительным горизонтальным размещением узлов.

Полная Собственность Двоичного дерева: куча T с высотой h является полным набором из двух предметов

дерево, то есть, уровни 0, 1, 2..., h- 1 из T имеют максимальное количество узлов

возможный (а именно, уровень я имею 2i узлы за£ £0 ih- 1), и узлы в

уровень h заполняет этот уровень слева направо.