Участник:Flanir1 — различия между версиями
Flanir1 (обсуждение | вклад) (Новая страница: «right|300px|thumb|Пример 2-3 дерева ''' 2-3 дерево ''' — структура данных, пред...») |
Flanir1 (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | |||
''' 2-3 дерево ''' — структура данных, представляющая собой сбалансированное дерево поиска, такое что из каждого узла может выходить две или три ветви и глубина всех листьев одинакова. 2-3 дерево можно обобщить до [[B-дерево#B.2B-.D0.B4.D0.B5.D1.80.D0.B5.D0.B2.D0.BE|B+-дерева]]. | ''' 2-3 дерево ''' — структура данных, представляющая собой сбалансированное дерево поиска, такое что из каждого узла может выходить две или три ветви и глубина всех листьев одинакова. 2-3 дерево можно обобщить до [[B-дерево#B.2B-.D0.B4.D0.B5.D1.80.D0.B5.D0.B2.D0.BE|B+-дерева]]. | ||
+ | == Свойства == | ||
+ | 2-3 дерево {{---}} сбалансированное дерево поиска, обладающее следующими свойствами: | ||
+ | *нелистовые вершины имеют либо 2, либо 3 сына, | ||
+ | *нелистовая вершина, имеющая двух сыновей, хранит максимум левого поддерева. Нелистовая вершина, имеющая трех сыновей, хранит два значения.Первое значение хранит максимум левого поддерева, второе максимум центрального поддерева, | ||
+ | *сыновья упорядочены по значению максимума поддерева сына, | ||
+ | *все листья лежат на одной глубине, | ||
+ | *Высота 2-3 дерева <tex>O(\log{n})</tex>, где <tex> n </tex> - количество элементов в дереве. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | {{Теорема | ||
+ | |statement= Высота 2-3 дерева <tex>O(\log{n})</tex>, где <tex> n </tex> - количество элементов в дереве. | ||
+ | |proof= | ||
+ | Из построения следует, что все листья лежат на одной глубине, так как элементов <tex>n</tex>, то получаем что высота равна <tex>O(\log{n})</tex> | ||
+ | }} | ||
== Операции == | == Операции == | ||
+ | Введем следующие обозначения: | ||
+ | *<tex>\mathtt{root}</tex> - корень 2-3 дерева | ||
+ | Каждый узел дерева обладает полями: | ||
+ | *<tex>\mathtt{sons}</tex> - сыновья узла, | ||
+ | *<tex>\mathtt{keys}</tex> - ключи узла, | ||
+ | *<tex>\mathtt{length}</tex> - количество сыновей. | ||
=== Поиск === | === Поиск === | ||
− | + | *<tex>x</tex> - искомое значение. | |
− | + | *<tex>t</tex> - текущая вершина в дереве. Изначально <tex>t = \mathtt{root}</tex> | |
− | + | Будем просматривать ключи в узлах, пока узел не является листом.Рассмотрим два случая: | |
− | |||
− | |||
− | |||
− | |||
− | == | + | 1)у текущей вершины два сына. Если её значение меньше <tex>x</tex>, то <tex>t = \mathtt{t.sons[1]}</tex>, иначе <tex>t = \mathtt{t.sons[0]}</tex>. |
− | |||
− | + | 2)у текущей вершины три сына. Если второе значение меньше <tex>x</tex>, то <tex>t = \mathtt{t.sons[2]}</tex>. Если первое значение меньше <tex>x</tex>, то <tex>t = \mathtt{t.sons[1]}</tex>, иначе <tex>t = \mathtt{t.sons[0]}</tex>. | |
− | + | '''Node''' search('''int''' x): | |
− | + | Node t = root | |
− | 2) | + | '''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 | ||
+ | === Вставка элемента === | ||
=== Удаление элемента === | === Удаление элемента === | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=== Слияние двух деревьев === | === Слияние двух деревьев === | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Cсылки == | == Cсылки == |
Версия 14:59, 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
Вставка элемента
Удаление элемента
Слияние двух деревьев
Cсылки
- is.ifmo.ru - Визуализатор 2-3 дерева — 1
- rain.ifmo.ru - Визуализатор 2-3 дерева — 2
- Википедия — 2-3 дерево
- Д. Кнут «Искусство программирования. Сортировка и поиск», часть 6.2.4