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

10.4. (2,4) Деревья 467

10.4.2 Операции по обновлению для (2, 4) деревья

Поддержание размера и свойств глубины требует некоторого усилия после выступающих вставок и удалений в (2, 4) дерево, как бы то ни было. Мы обсуждаем эти операции затем.

Вставка

Чтобы вставить новый вход (k, x), с ключом k, в (2, 4) дерево T, мы сначала выполняем поиск k. Предполагая, что у T нет входа с ключом k, этот поиск заканчивается неудачно во внешнем узле z. Позвольте v быть родителем z. Мы вставляем новый вход в узел v и добавляем нового ребенка w (внешний узел) к v слева от z. Таким образом, мы добавляем вход (k, x, w) к карте M (v).

Наш метод вставки сохраняет собственность глубины, так как мы добавляем новый внешний узел на том же самом уровне как существующие внешние узлы. Тем не менее, это может нарушить собственность размера. Действительно, если узел v был ранее с 4 узлами, то это может стать с 5 узлами после вставки, которая заставляет дерево T больше не быть (2, 4) дерево. Этот тип нарушения собственности размера называют overflow в узле v, и это должно быть решено, чтобы восстановить свойства (2, 4) дерево. Позвольте v1..., v5 быть детьми v и позволить k1..., k4 быть ключами, сохраненными в v. Чтобы исправить overflow в узле v, мы выполняем операцию по разделению на v следующим образом (см. рисунок 10.22):

• Замените v двумя узлами v и v ′′, где

v - с 3 узлами с детьми v1, v2, v3 хранение ключей k1 и k2

v ′′ - с 2 узлами с детьми v4, v5 хранение ключа k4

• Если v был корнем T, создайте новый узел корня u; еще, позвольте u быть родителем v

• Клавиша INSERT k3 в u и делает v и v ′′ дети u, так, чтобы, если v был ребенком i

из u тогда v и v ′′ становятся детьми i и я + 1 из u, соответственно

Мы показываем последовательность вставок в (2, 4) дерево в рисунке 10.23.

(a) (b) (c)

Рисунок 10.22: узел разделился: (a) overflow в v с 5 узлами; (b) третий ключ v вставлен

в родительский u v; (c) узел v замененный v с 3 узлами и v с 2 узлами ′′.

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

(a) (b) (c) (d)

(e) (f)

(g) (h)

(i) (j)

(k) (l)

Рисунок 10.23: последовательность вставок в (2, 4) дерево: (a) начальное дерево с одним входом; (b) вставка 6; (c) вставка 12; (d) вставка 15, который вызывает overflow; (e) разделение, которое вызывает создание нового узла корня; (f) после разделения; (g) вставка 3; (h) вставка 5, который вызывает overflow; (i) разделение; (j) после разделения; (k) вставка 10; (l) вставка 8.

10.4. (2,4) Деревья 469

Анализ вставки в (2, 4) дерево

Операция по разделению затрагивает постоянное число узлов дерева и O (1) записи

сохраненный в таких узлах. Таким образом это может быть осуществлено, чтобы бежать в O (1) время.

В результате операции по разделению на узле v, новый overflow может произойти в родительском u v. Если такой overflow происходит, он вызывает разделение в узле u в свою очередь. (См. рисунок 10.24.) Операция по разделению или устраняет overflow или размножает его в родителя текущего узла. Следовательно, число операций по разделению ограничено высотой дерева, которое является O (зарегистрируйте n) Суждением 10.8. Поэтому, полное время, чтобы выполнить вставку в (2, 4) дерево - O (зарегистрируйте n).

(a) (b)

(c) (d)

(e) (f)

Рисунок 10.24: вставка в (2, 4) дерево, которое вызывает разделение каскадирования: (a) перед вставкой; (b) вставка 17, вызывая overflow; (c) разделение; (d) после разделения новый overflow происходит; (e) другое разделение, создавая новый узел корня; (f) заключительное дерево.