Struchkov Mark
eacf800157
All checks were successful
continuous-integration/drone/push Build is passing
71 lines
5.1 KiB
Markdown
71 lines
5.1 KiB
Markdown
---
|
||
aliases:
|
||
- сбалансированное дерево
|
||
- сбалансированное
|
||
tags:
|
||
- maturity/🌱
|
||
date: 2024-01-29
|
||
---
|
||
Сбалансированное [[../Tree|дерево]] — это [[структура данных]], в которой высота левого и правого поддеревьев каждого узла отличается не более чем на единицу. Это позволяет сохранять логарифмическую сложность поиска (O(log n)), что делает его эффективным для операций поиска, вставки и удаления.
|
||
|
||
В несбалансированном дереве, например, при последовательном добавлении элементов в возрастающем порядке, дерево может превратиться в цепочку, что ухудшает производительность поиска до O(n). Сбалансированное дерево решает эту проблему, сохраняя высоту минимальной.
|
||
|
||
![](../../../meta/files/images/Pasted%20image%2020240129191116.png)
|
||
|
||
**Плюсы**:
|
||
- Быстрая операция поиска — O(высоты дерева), что близко к O(log n) для сбалансированного дерева.
|
||
- Решает проблему вырожденного случая бинарного дерева.
|
||
|
||
**Минусы**:
|
||
- Требует дополнительных усилий и вычислительных ресурсов для поддержания балансировки, особенно при частых вставках и удалениях.
|
||
- В некоторых случаях операции вставки и удаления могут быть медленнее, чем в несбалансированных деревьях, из-за необходимости балансировки.
|
||
|
||
**Типы сбалансированных деревьев**
|
||
- **AVL-дерево**: Обеспечивает балансировку после каждой операции добавления или удаления. Высота левого и правого поддеревьев каждого узла отличается не более чем на единицу. AVL-деревья подходят для приложений, где важна быстрая операция поиска.
|
||
- **Красно-черное дерево**: Менее строгое, чем AVL-дерево, что делает его более быстрым для операций вставки и удаления. Красно-черные деревья используются в реализациях словарей и ассоциативных массивов.
|
||
|
||
**Алгоритмы балансировки**
|
||
- **Повороты**: Основной метод балансировки — это повороты (левое и правое). Они позволяют перераспределить элементы дерева так, чтобы сохранить его сбалансированность.
|
||
- **Перераспределение и слияние узлов**: Эти методы используются в зависимости от типа сбалансированного дерева для поддержания его свойств.
|
||
## Пример балансировки дерева
|
||
Представим, что добавляется новый элемент `30` в уже существующее AVL-дерево, и дерево становится несбалансированным:
|
||
|
||
```
|
||
20
|
||
/ \
|
||
10 25
|
||
```
|
||
|
||
После добавления `30` дерево становится несбалансированным, так как правое поддерево узла `25` становится слишком высоким:
|
||
|
||
```
|
||
20
|
||
/ \
|
||
10 25
|
||
\
|
||
30
|
||
```
|
||
|
||
Чтобы восстановить баланс, выполняется левое вращение относительно узла `25`, и дерево принимает следующий вид:
|
||
|
||
```
|
||
20
|
||
/ \
|
||
10 30
|
||
/
|
||
25
|
||
```
|
||
|
||
Таким образом, балансировка восстанавливает равновесие дерева и сохраняет его свойства. Например, если левое поддерево стало значительно выше правого, выполняется правое вращение для восстановления равновесия.
|
||
***
|
||
## Мета информация
|
||
**Область**:: [[../../../meta/zero/00 Разработка|00 Разработка]]
|
||
**Родитель**:: [[Tree|Tree]]
|
||
**Источник**::
|
||
**Автор**::
|
||
**Создана**:: [[2024-01-29]]
|
||
### Дополнительные материалы
|
||
-
|
||
### Дочерние заметки
|
||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|