Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Вставка ключа в Б-дерево





Вставка ключа в Б-дерево существенно сложнее вставки в бинарное дерево поиска. Как и в случае бинарных деревьев поиска, ищем позицию листа, в который будет вставлен новый ключ. Однако при работе с Б-деревом нельзя просто создать новый лист и вставить в него ключ, поскольку будут нарушаться свойства Б-дерева. Вместо этого вставляем новый ключ в уже существующий лист. Поскольку вставить новый ключ в заполненный лист невозможно, вводим новую операцию – разбиение заполненного (т.е. содержащего 2t-1 ключей) узла на два, каждый из которых содержит по t-1 ключей (разбиваем на 2 по t-1). Средний элемент (для которого t-1 первых ключей меньше его, а t-1 последних больше) перемещается в родительский узел, где становится родительской точкой для двух вновь образовавшихся поддеревьев. Соответственно, если родительский узел также был заполнен – то опять приходится разбивать. И так далее до корня(если разбивается корень – то появляется новый корень и глубина дерева увеличивается).

Как и в случае бинарного дерева поиска, в Б-дереве вполне можно осуществить вставку за один нисходящий проход от корня к листу. Для этого не нужно выяснять, требуется ли разбить узел, в который должен вставляться новый ключ. Вместо этого при проходе от корня к листьям в поисках позиции для нового ключа разбиваем все заполненные узлы, через которые проходим(включая лист). Тем самым гарантируется, что если необходимо разбить какой-то узел, то его родительский узел не будет заполнен.

 

Пример. Возьмем нарисованное ниже дерево и добавим в него элемент 13.

Двигаясь от корня, найдем узел, в который следует добавить искомый элемент. Таким узлом в нашем случае окажется узел, содержащий элементы 11 и 12. Добавим

Получили переполнение. При его обработке узел, содержащий элементы 11, 12 и 13 разделится на две части: узел с элементом 11 и узел с элементом 13, – а средний элемент 12 будет вынесен на верхний уровень.

Опять получили переполнение, при обработке которого узел, содержащий элементы 8, 10 и 12 разделится на два узла: узел с элементом 8 и узел с элементом 12, – а средний элемент 10 будет вынесен на верхний уровень.

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

Теперь полученное дерево не имеет переполнения.

В этом случае, как и при поиске, время обработки страницы поиска есть величина постоянная, пропорциональная размеру страницы, а значит, сложность алгоритма добавления в Б-дерево будет также T(h), где h – глубина дерева.

 







Date: 2015-06-11; view: 430; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию