B-дерево — различия между версиями
Borisov (обсуждение | вклад) |
Borisov (обсуждение | вклад) (→B-дерево) |
||
Строка 1: | Строка 1: | ||
== B-дерево == | == B-дерево == | ||
− | '''B-дерево''' — дерево поиска, позволяющее проводить поиск, добавление и удаление элементов за | + | <wikitex> |
+ | '''B-дерево''' — сильноветвящееся сбалансированное дерево поиска, позволяющее проводить поиск, добавление и удаление элементов за $O(\log n)$. B-деревья схожи с [[Красно-черное дерево|красно-черными деревьями]] в том, что B-дерево с $n$ узлами имеют высоту $O(\lg n)$, но отличаются от [[Красно-черное дерево|них]] количеством детей узлов — от нескольких до тысяч (обычно степень ветвления B-дерева определяется характеристиками устройства (дисков), на котором производится работа с деревом). Сама высота B-дерева может быть значительно меньше чем у [[Красно-черное дерево|красно-черного дерева]], из-за его ветвистости, и, следовательно, основание логарифма, выражающего высоту дерева, может быть намного больше. Таким образом, В-деревья также могут использоваться для реализации | ||
+ | многих операций над динамическими множествами за время $O(\lg n)$ | ||
B-дерево было впервые предложено Р. Бэйером и Е. МакКрейтом в 1970 году. | B-дерево было впервые предложено Р. Бэйером и Е. МакКрейтом в 1970 году. | ||
+ | </wikitex> | ||
== Структура == | == Структура == |
Версия 21:44, 26 марта 2012
Содержание
B-дерево
<wikitex> B-дерево — сильноветвящееся сбалансированное дерево поиска, позволяющее проводить поиск, добавление и удаление элементов за $O(\log n)$. B-деревья схожи с красно-черными деревьями в том, что B-дерево с $n$ узлами имеют высоту $O(\lg n)$, но отличаются от них количеством детей узлов — от нескольких до тысяч (обычно степень ветвления B-дерева определяется характеристиками устройства (дисков), на котором производится работа с деревом). Сама высота B-дерева может быть значительно меньше чем у красно-черного дерева, из-за его ветвистости, и, следовательно, основание логарифма, выражающего высоту дерева, может быть намного больше. Таким образом, В-деревья также могут использоваться для реализации многих операций над динамическими множествами за время $O(\lg n)$
B-дерево было впервые предложено Р. Бэйером и Е. МакКрейтом в 1970 году. </wikitex>
Структура
B-дерево является идеально сбалансированным, то есть глубина всех его листьев одинакова.
Каждый узел B-дерева, кроме корня, содержит от
до ключей. Корень содержит от до ключей. — параметр дерева, не меньший . Ключи в каждом узле упорядочены.Каждый узел дерева, кроме листьев, содержащий ключи
, имеет сына. -й сын содержит ключи из отрезка .Назначение
<wikitex>B-деревья разработаны для использования на дисках (в файловых системах) или иных вторичных устройствах хранения информации с прямым доступом, а также в базах данных. B-деревья похожи на красно-чёрные деревья, но они лучше минимизируют количество операций чтения-записи в диске.
В типичном приложении с B-деревом, объём хранимой информации так велик, что вся она просто не может храниться в основной памяти единовременно. Алгоритмы B-дерева копируют выбранные страницы (мера информации на дисках; обычно, от $2^{11}$ до $2^{14}$ Байт) с диска в основную память по мере надобности и записывает обратно на диск страницы, которые были изменены. Алгоритмы B-дерева хранят лишь определённое количество страниц в основной памяти в любой момент времени; таким образом, объём основной памяти не ограничивает размер B-деревьев, которыми можно управлять.</wikitex>
Операции
B-деревья представляют собой сбалансированные деревья, поэтому время выполнения стандартных операций в них пропорционально высоте. Однако, как уже было упомянуто выше, алгоритмы B-дерева созданы специально для работы с дисками (или другими носителями информации) и базами данных (или иными видами представления большого количества информация), минимизируя количество операций ввода-вывода.
Поиск ключа
Если ключ содержится в текущем узле, возвращаем его. Иначе определяем интервал и переходим к соответствующему сыну. Повторяем пока ключ не найден или не дошли до листа.
Добавление ключа
Ищем лист, в который можно добавить ключ, совершая проход от корня к листьям. Если найденный узел не заполнен, добавляем в него ключ. Иначе разбиваем узел на два узла, в первый добавляем первые
ключей, во второй — последние ключей. Добавляем ключ в один из этих узлов. Оставшийся средний элемент добавляем в узел родителя, если он заполнен — повторяем пока не встретим не заполненный узел или не дойдем до корня. В последнем случае корень разбивается на два узла и высота дерева увеличивается.Слияние
...
Удаление ключа
Находим ключ, который необходимо удалить
- Если удаление происходит из листа, смотрим на количество ключей в нем. Если ключей больше , то просто удаляем ключ. В противном случае, если существует соседний лист, который содержит больше ключа, удалим ключ из исходного узла, на его место поставим ключ-разделитель между исходным узлом и его соседом, а на его место поставим первый, если сосед правый, или последний, если сосед левый, ключ соседа. Если все соседи содержат по ключу, то объединяем узел с каким-либо из соседей, удаляем ключ и добавляем ключ-разделитель между узлами в объединенный узел. Если в родительском узле осталось меньше ключа, аналогичным образом добавляем в него ключи из соседей или объединяем узел в ними.
- Если удаление происходит не из листа, удаляем самый левый ключ из поддерева следующего дочернего узла или самый правый из поддерева предыдущего дочернего узла и ставим удаленный ключ на место удаляемого ключа в исходном узле.
Ссылки
- T. H. Cormen «Introduction to Algorithms» third edition, Chapter 18
- Д. Кнут «Искусство программирования. Сортировка и поиск», часть 6.2.4
- Хабрахабр. B-tree.