digital-garden/dev/fundamental/structure/Сбалансированное дерево.md
2024-10-25 20:04:39 +03:00

71 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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) -->