КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Удаление
Задача: удалить запись со значением ключа v. a) найдем путь от корня дерева к блоку i, содержащую запись с ключом v; b) если записи нет, то ошибка. Если запись есть удалим эту запись пересортируем. Если после удаления в блоке не менее «е» записей, то если эта запись первая, тогда возможно требуется изменить индексный файл на предыдущих уровнях. Однако коррекции не будет подвергаться отец блока «i» (т.к. у него первая запись не имеет ключа). Но возможно другие предки имеют запись с ключом v, которая не является первой. Т.о. от блока «i» следует двигаться в верх к корню, и в случае, если обнаружится такая запись, то её следует удалить, применив данную процедуру. Реверсивно с константой d. (Хотя удалять и не обязательно, всё равно дерево будет работать как индекс). Если после удаления в блоке «i» менее «е» записей (т.е. е-1 записей), то рассмотрим соседних братьев (в том же уровне) блока «i», имеющих того же отца, что и блок «i». Если среди братьев есть блок «i», с числом записей больше чем «е», то распределить записи этих двух блоков (всего каких записей е< 3/2(е-1) < 2е-1) равномерно между двумя блоками «i» и «i1», сохраняя отсортированный порядок. При этом возможно необходимо откорректировать предков «i». Если все братья «i» содержат ровно «е» записей, то соединим записи блоков «i» и любого соседнего блока «i1» (у них всего 2е-1 записей) и т.о. все записи поместятся в один блок. Такое удаление потребует модификации и рекурсивного применения процедуры удаления к предкам «i», заменив константу е на константу d. При этом, возможно, необходимо удалить корень и объединённые блоки на предыдущем корню уровне образуют новый корень – размер дерева уменьшается на единицу.
Пример: d=2, е=2. Дерево содержит квадраты чисел.
Добавим запись с ключом 32. Ищем блок, в который необходимо добавить – это i7, но в нем нет места значит делим его на 2: В i3 надо добавить 36. В i3 нет места это вместо 64 Добавляем в i1 64, которое ссылается на i3, добавляем блок i14 и i15 Удалим запись с ключом 64. Найти блок, это i8 и удаляем 64. Новый ключ – 81, распределяем вверх изменяем в i15 значение ключа 64 на 81 (всегда изменяем ровно 1 ключ). Но блок i8 содержит 1 запись, заполнен меньше, чем на половину и имеется блок i9, в котором меньше, чем 2е-1 запись, т.е. 2 и соединяем его с блоком i8. У i13 единственный сын необходимо удалить запись с ключом 100 из блока i13 и, следовательно, соединить его с i4, теперь вторая ссылка в этом блоке должна быть 144. Блок i13 обладает указателями на i10 и i11. Значение ключа, сопровождающее указатель на i11 находится в i4, тогда как значение ключа 144 для блока i10 в i14. Вообще, если мы объединяем блоки при удалении, необходимое значение ключей содержатся либо в объединяемых блоках, либо в блоке, являющемся их общим отцом. При объединении i13 и i4 оказывается, что у i14 существует единственный сын, поэтому объединяем i14 с i1. теперь у i15 один сын. Т.к. он корень, то удаляем его. и т.д.
Дата добавления: 2014-01-05; Просмотров: 312; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |