84 lines
3.4 KiB
Markdown
84 lines
3.4 KiB
Markdown
|
|
## Анализ результатов
|
|||
|
|
|
|||
|
|
### **1. Как порядок входных данных влияет на скорость вставки в BST**
|
|||
|
|
|
|||
|
|
BST работает быстро только если дерево сбалансировано.
|
|||
|
|
При случайном порядке глубина дерева ≈ `O(log n)`, поэтому вставка быстрая.
|
|||
|
|
Но при отсортированных данных дерево вырождается в цепочку.
|
|||
|
|
Вставка становится:
|
|||
|
|
|
|||
|
|
- **O(n)** на одну операцию
|
|||
|
|
- **O(n²)** на вставку всех элементов
|
|||
|
|
|
|||
|
|
Это приводит к резкому росту времени (в эксперименте: **0.02 сек → 5.23 сек**).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **2. Почему хеш‑таблица почти не чувствительна к порядку**
|
|||
|
|
|
|||
|
|
Хеш‑функция распределяет элементы по бакетам независимо от порядка входа.
|
|||
|
|
Поэтому:
|
|||
|
|
|
|||
|
|
- вставка ≈ **O(1)**
|
|||
|
|
- поиск ≈ **O(1)**
|
|||
|
|
- удаление ≈ **O(1)**
|
|||
|
|
|
|||
|
|
Даже если данные отсортированы, хеш‑таблица работает одинаково быстро.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **3. Почему связный список всегда медленный при поиске**
|
|||
|
|
|
|||
|
|
Связный список не имеет индексов.
|
|||
|
|
Поиск идёт последовательно: head → next → next → ...
|
|||
|
|
|
|||
|
|
Поэтому:
|
|||
|
|
|
|||
|
|
- поиск = **O(n)**
|
|||
|
|
- вставка в конец = **O(n)**
|
|||
|
|
- удаление = **O(n)**
|
|||
|
|
|
|||
|
|
Это делает его самой медленной структурой для телефонного справочника.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **4. Как работает удаление в каждой структуре**
|
|||
|
|
|
|||
|
|
#### Связный список
|
|||
|
|
- ищем предыдущий узел
|
|||
|
|
- перенаправляем ссылки
|
|||
|
|
- сложность: **O(n)**
|
|||
|
|
|
|||
|
|
#### Хеш‑таблица
|
|||
|
|
- вычисляем бакет
|
|||
|
|
- удаляем элемент в маленьком списке внутри бакета
|
|||
|
|
- сложность: **O(1)** в среднем
|
|||
|
|
|
|||
|
|
#### BST
|
|||
|
|
3 случая:
|
|||
|
|
1. лист
|
|||
|
|
2. один потомок
|
|||
|
|
3. два потомка (замена на inorder‑преемника)
|
|||
|
|
|
|||
|
|
Сложность:
|
|||
|
|
|
|||
|
|
- **O(log n)** в среднем
|
|||
|
|
- **O(n)** в худшем случае (несбалансированное дерево)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### **5. Какую структуру выбирать в реальной жизни**
|
|||
|
|
|
|||
|
|
| Задача | Лучшая структура | Причина |
|
|||
|
|
|--------|------------------|---------|
|
|||
|
|
| Частые вставки | **HashTable** | O(1) |
|
|||
|
|
| Частый поиск | **HashTable** | O(1) |
|
|||
|
|
| Частое удаление | **HashTable** | O(1) |
|
|||
|
|
| Нужен отсортированный вывод | **BST** | in‑order обход |
|
|||
|
|
| Маленькие данные | Любая | Разницы нет |
|
|||
|
|
| Учебные цели | LinkedList | Простая структура |
|
|||
|
|
|
|||
|
|
### **Общий вывод:**
|
|||
|
|
> В реальных приложениях телефонный справочник почти всегда реализуют через **хеш‑таблицу**, так как она обеспечивает лучшую производительность для вставки, поиска и удаления.
|
|||
|
|
|