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

10.3. Косые деревья 455

• Удаляя ключ k, мы вывихиваем родителя узла w, который удален,

то есть, w - или узел, хранящий k или один из его потомков. (Вспомните пере -

алгоритм moval для деревьев двоичного поиска.) Пример вывиха после удаления показывают в рисунке 10.19.

(a) (b)

(c) (d)

(e)

Рисунок 10.19: Удаление от косого дерева: (a) удаление 8 от узла r за - сформирован, перемещая ключ самого правого внутреннего nodr v к r, в левом поддереве r, удаляя v и вывихивая родительский u v; (b) вывихивающий u начинается с крутого поворота крутого поворота; (c) после крутого поворота крутого поворота; (d) следующий шаг крутой поворот; (e) после крутого поворота.

456 Глава 10. Деревья поиска

10.3.3 Амортизируемый анализ вывиха

После крутого поворота крутого поворота или зигзага, глубина x уменьшается на два, и после крутого поворота глубина

из x уменьшается одним. Таким образом, если у x есть глубина d, вывихивание x состоит из последовательности

d/2 ⌋ крутые повороты крутого поворота и/или зигзаги, плюс один заключительный крутой поворот, если d странный. Начиная с единственного крутого поворота крутого поворота,

зигзаг или крутой поворот производит постоянное число узлов, он может быть сделан в O (1) время.

Таким образом вывихивая узел x в дереве двоичного поиска T занимает время O (d), где d - глубина x в T. Другими словами, время для выполнения шага вывиха для узла x является асимптотически тем же самым, поскольку время должно было только достигнуть того узла в нисходящем поиске от корня T.

Время худшего случая

В худшем случае полная продолжительность поиска, вставки или удаления в косом дереве высоты h является O (h), так как узел, который мы вывихиваем, мог бы быть самым глубоким узлом в дереве. Кроме того, для h возможно быть столь же большим как n, как показано в рисунке 10.18. Таким образом, с точки зрения худшего случая, косое дерево не привлекательная структура данных.

Несмотря на его плохую работу худшего случая, косое дерево выступает хорошо в амортизируемом смысле. Таким образом, в последовательности смешанных поисков, вставок и удалений, каждая операция занимает, в среднем, логарифмическое время. Мы выполняем амортизируемый анализ косых деревьев, используя бухгалтерский метод.

Амортизируемое исполнение косых деревьев

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

Позвольте T быть косым деревом с n ключами и позволить v быть узлом T. Мы определяем размер n (v) из v как число узлов в поддереве, внедренном в v. Обратите внимание на то, что это определение подразумевает, что размер внутреннего узла - еще один, чем сумма размеров ее двух детей. Мы определяем разряд r (v) из узла v как логарифм в основе 2 из размера v, то есть, r (v) = регистрация (n (v)). Ясно, у корня T есть максимальный размер (2n + 1) и максимальный разряд, регистрация (2n + 1), в то время как у каждого внешнего узла есть размер 1 и разряд 0.

Мы используем кибердоллары, чтобы заплатить за работу, которую мы выполняем в вывихе узла x в T, и мы предполагаем, что один кибердоллар платит за крутой поворот, в то время как плата за два кибердоллара за крутой поворот крутого поворота или зигзаг. Следовательно, затраты на вывих узла на глубине d являются d кибер - доллары. Мы сохраняем виртуальное хранение счета кибердолларами в каждом внутреннем узле T. Обратите внимание на то, что этот счет существует только в целях нашего амортизируемого анализа и не должен быть включен в структуру данных, осуществляющую косое дерево T.