Участник:Flanir1 — различия между версиями
Flanir1 (обсуждение | вклад) (→Поиск) |
Flanir1 (обсуждение | вклад) (→Операции) |
||
Строка 44: | Строка 44: | ||
'''else''' t = t.sons[0] | '''else''' t = t.sons[0] | ||
'''return''' t | '''return''' t | ||
− | + | Пример поиска в 2-3 дереве, так как элемент 6 существует, то был возвращен корректный узел, так как элемента 10 нет, возвращается некорректный узел. На основе этого можно сделать метод <tex>\mathtt{exist}</tex>, проверяющий наличии элемента в дереве | |
− | [[Файл:23treesearch.png | + | |
+ | [[Файл:23treesearch.png|border]] | ||
=== Вставка элемента === | === Вставка элемента === |
Версия 15:14, 10 мая 2015
2-3 дерево — структура данных, представляющая собой сбалансированное дерево поиска, такое что из каждого узла может выходить две или три ветви и глубина всех листьев одинакова. 2-3 дерево можно обобщить до B+-дерева.
Содержание
Свойства
2-3 дерево — сбалансированное дерево поиска, обладающее следующими свойствами:
- нелистовые вершины имеют либо 2, либо 3 сына,
- нелистовая вершина, имеющая двух сыновей, хранит максимум левого поддерева. Нелистовая вершина, имеющая трех сыновей, хранит два значения.Первое значение хранит максимум левого поддерева, второе максимум центрального поддерева,
- сыновья упорядочены по значению максимума поддерева сына,
- все листья лежат на одной глубине,
- Высота 2-3 дерева , где - количество элементов в дереве.
Теорема: |
Высота 2-3 дерева , где - количество элементов в дереве. |
Доказательство: |
Из построения следует, что все листья лежат на одной глубине, так как элементов | , то получаем что высота равна
Операции
Введем следующие обозначения:
- - корень 2-3 дерева
Каждый узел дерева обладает полями:
- - сыновья узла,
- - ключи узла,
- - количество сыновей.
Поиск
- - искомое значение.
- - текущая вершина в дереве. Изначально
Будем просматривать ключи в узлах, пока узел не является листом.Рассмотрим два случая: 1)у текущей вершины два сына. Если её значение меньше
, то , иначе .2)у текущей вершины три сына. Если второе значение меньше
, то . Если первое значение меньше , то , иначе .Node search(int x): Node t = root while (t не является листом) if (t.length == 2) if (t.keys[0] < x) t = t.sons[1] else t = t.sons[0] else if (t.keys[1] < x) t = t.sons[2] else if (t.keys[0] < x) t = t.sons[1] else t = t.sons[0] return t
Пример поиска в 2-3 дереве, так как элемент 6 существует, то был возвращен корректный узел, так как элемента 10 нет, возвращается некорректный узел. На основе этого можно сделать метод
, проверяющий наличии элемента в деревеВставка элемента
Удаление элемента
Слияние двух деревьев
Cсылки
- is.ifmo.ru - Визуализатор 2-3 дерева — 1
- rain.ifmo.ru - Визуализатор 2-3 дерева — 2
- Википедия — 2-3 дерево
- Д. Кнут «Искусство программирования. Сортировка и поиск», часть 6.2.4