на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно... |
Тонкие кучи
Операция DeleteMin(H). Эта операция предназначена для удаления узла с минимальным ключом из непустой кучи . Для ее реализации удаляем минимальный узел из корневого списка кучи , добавляем список детей удаленного узла в корневой список и повторяем следующий "связывающий шаг".
Находим любые два дерева, корни которых имеют одинаковые ранги, и связываем их, делая корень с большим ключом новым левым потомком корня с меньшим ключом, увеличивая ранг нового полученного тонкого дерева на единицу. При этом следует удалить из корневого списка кучи корень с большим ключом. Как только не останется деревьев с корнями одинакового ранга, в полученном корневом списке необходимо найти элемент с минимальным ключом.
Рассмотрим теперь, с помощью каких средств реализуется связывающий шаг. Для хранения ссылок на корни деревьев используем временный массив , размера . Величина будет указателем на тонкое дерево ранга . Если найдется еще одно дерево ранга , то свяжем два дерева ранга в одно дерево ранга , в -й ячейке массива установим нулевой указатель и продолжим связывающую процедуру с вновь полученным деревом ранга .
При включении списка детей необходимо учесть возможность помеченности детей минимального узла. То есть уменьшить их ранг там, где это необходимо. Это требование вытекает из свойства 2 определения тонкого дерева. Очевидно, что для проверки помеченности узла требуется операций.
В результате выполнения связывающих шагов получаем заполненный массив . Теперь остается только связать все деревья, находящиеся в этом массиве, в корневой список и найти в этом списке новый минимальный элемент. Очевидно, все это можно выполнить с трудоемкостью .
Чтобы оценить амортизационную стоимость операции , подсчитаем фактическую стоимость операции и изменение потенциала. Фактическая стоимость складывается из операций на проверку кучи на пустоту, действий при добавлении детей минимального узла в корневой список и (количество связывающих шагов) + при выполнении связывающих шагов.
В итоге фактическая стоимость операции удаления минимального элемента есть (количество связывающих шагов) + .
Очевидно, что потенциал уменьшился, как минимум, на число связывающих шагов, так как при каждом связывающем шаге количество деревьев в корневом списке уменьшается на единицу. Поскольку амортизационная стоимость равна фактической стоимости плюс изменение потенциала, то амортизационная стоимость равна .
Операция DecreaseKey При уменьшении ключа у некорневого элемента в куче на величину может быть нарушено свойство кучеобразности. Для восстановления этого свойства перемещаем поддерево с корнем в изменяемом элементе в корневой список, но при этом, возможно, оставшееся после переноса дерево может не оказаться тонким.
Покажем, как, затратив амортизированного времени, исправлять его структуру. В процедуре после уменьшения ключа корректируется, если это необходимо, указатель на минимальный элемент кучи. После этого проверяется, не является ли измененный узел корнем дерева . Если это действительно так, то процедура завершается, в противном случае переносим поддерево с корнем в узле в корневой список кучи и запускаем процедуру коррекции оставшегося дерева .
Будем различать два вида нарушений свойств тонкого дерева:
- Братские нарушения — это нарушения третьего правила из определения тонкого дерева.
- Родительские нарушения — это нарушения первого или второго правила.
Рассмотрим подробнее каждое из двух видов нарушений. Назовем узел узлом локализации братского нарушения среди детей узла , если ранг узла отличается от ранга его ближайшего правого брата на 2, либо он не имеет правого брата и его ранг равен 1. Пример — на рис. 8.3.
Назовем узел узлом локализации родительского нарушения, если выполнено одно из трех условий:
- Ранг узла на три больше, чем ранг его самого левого сына.
- Ранг узла равен двум, и он не имеет детей.
- Узел есть помеченный корень дерева.
Пример приведен на рис. 8.4.