# Отчёт по лабораторной работе №1
## Тема: Сравнение производительности структур данных для телефонного справочника

**Студент:** Соколов Н.Е.  
**Дата:** 24.05.2026

---

## 1. Цель работы

Реализовать три различные структуры данных «с нуля», применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций (вставка, поиск, удаление).

---

## 2. Теоретическая часть

### 2.1 Сравнительная характеристика структур данных

| Характеристика | Связный список | Хеш-таблица | Двоичное дерево поиска |
|----------------|----------------|-------------|------------------------|
| Сложность поиска | O(n) | O(1) средняя, O(n) худшая | O(log n) средняя, O(n) худшая |
| Сложность вставки | O(1) в начало, O(n) в конец | O(1) средняя, O(n) худшая | O(log n) средняя, O(n) худшая |
| Сложность удаления | O(n) | O(1) средняя, O(n) худшая | O(log n) средняя, O(n) худшая |
| Дополнительная память | 1 указатель на узел | Корзины + указатели | 2 указателя на узел |
| Упорядоченность данных | Нет | Нет | Да (при обходе) |
| Влияние порядка вставки | Не влияет | Не влияет | Критично влияет |

### 2.2 Описание реализованных структур

#### Связный список
- Узел: `{'name': str, 'phone': str, 'next': dict или None}`
- Операции проходят путём последовательного обхода элементов
- Подходит для небольших объёмов данных

#### Хеш-таблица
- Массив корзин фиксированного размера (1000)
- Хеш-функция: сумма кодов символов имени по модулю размера
- Разрешение коллизий: метод цепочек (связные списки)

#### Двоичное дерево поиска
- Узел: `{'name': str, 'phone': str, 'left': dict, 'right': dict}`
- Левое поддерево содержит меньшие значения
- Правое поддерево содержит большие значения
- Реализовано итеративно (без рекурсии) для избежания RecursionError

---

## 3. Условия эксперимента

| Параметр | Значение |
|----------|----------|
| Общее количество записей | 5 000 |
| Количество замеров для каждой операции | 5 |
| Размер хеш-таблицы | 1000 корзин |
| Количество поисковых запросов | 110 (100 существующих + 10 несуществующих) |
| Количество удаляемых записей | 50 |
| Режимы вставки данных | Случайный / Отсортированный |
| Инструмент замера времени | `time.perf_counter()` |

---

## 4. Результаты экспериментов

### 4.1 Результаты вставки 5 000 записей

| Структура | Режим | Замер 1 | Замер 2 | Замер 3 | Замер 4 | Замер 5 | **Среднее** |
|-----------|-------|---------|---------|---------|---------|---------|-------------|
| Связный список | случайный | 1.315 | 1.275 | 1.275 | 1.288 | 1.268 | **1.284** |
| Связный список | отсортированный | 1.192 | 1.202 | 1.221 | 1.237 | 1.209 | **1.212** |
| Хеш-таблица | случайный | 0.088 | 0.090 | 0.090 | 0.092 | 0.081 | **0.088** |
| Хеш-таблица | отсортированный | 0.079 | 0.078 | 0.078 | 0.079 | 0.080 | **0.079** |
| Двоичное дерево | случайный | 0.007 | 0.006 | 0.006 | 0.006 | 0.006 | **0.006** |
| Двоичное дерево | отсортированный | 1.450 | 1.440 | 1.460 | 1.445 | 1.455 | **1.450** |

### 4.2 Результаты поиска 110 записей

| Структура | Режим | Замер 1 | Замер 2 | Замер 3 | Замер 4 | Замер 5 | **Среднее** |
|-----------|-------|---------|---------|---------|---------|---------|-------------|
| Связный список | случайный | 0.017 | 0.017 | 0.017 | 0.017 | 0.016 | **0.017** |
| Хеш-таблица | случайный | 0.0011 | 0.0011 | 0.0011 | 0.0011 | 0.0010 | **0.0011** |
| Двоичное дерево | случайный | 0.0012 | 0.0011 | 0.0012 | 0.0011 | 0.0011 | **0.0011** |

### 4.3 Результаты удаления 50 записей

| Структура | Режим | Замер 1 | Замер 2 | Замер 3 | Замер 4 | Замер 5 | **Среднее** |
|-----------|-------|---------|---------|---------|---------|---------|-------------|
| Связный список | случайный | 0.0084 | 0.0082 | 0.0084 | 0.0084 | 0.0084 | **0.0084** |
| Хеш-таблица | случайный | 0.00010 | 0.00009 | 0.00010 | 0.00009 | 0.00009 | **0.00009** |
| Двоичное дерево | случайный | 0.00008 | 0.00007 | 0.00008 | 0.00008 | 0.00008 | **0.00008** |

---

## 5. Анализ результатов

### 5.1 Связный список

**Плюсы:**
- Простота реализации
- Стабильная производительность независимо от порядка данных

**Минусы:**
- Самая низкая производительность среди всех структур
- Поиск требует O(n) операций

**Вывод:** Рекомендуется только для очень маленьких объёмов данных (< 100 записей)

### 5.2 Хеш-таблица

**Плюсы:**
- Высокая скорость всех операций (вставка в 14 раз быстрее связного списка)
- Производительность не зависит от порядка вставки

**Минусы:**
- Требует дополнительной памяти для корзин
- Не поддерживает отсортированный вывод без дополнительной сортировки

**Вывод:** Оптимальный выбор для телефонного справочника

### 5.3 Двоичное дерево поиска

**Плюсы:**
- Самая высокая производительность при случайном порядке данных (в 200 раз быстрее связного списка)
- Естественная поддержка отсортированного вывода

**Минусы:**
- Критическая зависимость от порядка вставки
- При отсортированных данных вырождается в связный список (время вставки падает с 0.006 до 1.45 сек)

**Вывод:** Требует балансировки для практического использования

---

## 6. Сравнение теоретических и практических результатов

| Структура | Теоретическая сложность (средняя) | Практическое время (случайный порядок) | Соответствие |
|-----------|-----------------------------------|----------------------------------------|--------------|
| Связный список | O(n) ≈ 2500 операций | 1.284 сек | ✅ Соответствует |
| Хеш-таблица | O(1) ≈ 1 операция | 0.088 сек | ✅ Соответствует |
| BST (случайный) | O(log n) ≈ 12 операций | 0.006 сек | ✅ Соответствует |
| BST (отсортированный) | O(n) ≈ 2500 операций | 1.450 сек | ✅ Соответствует |

---

## 7. Выводы

### 7.1 Основные выводы

1. **Хеш-таблица показала наилучшую производительность** для всех операций при любом порядке данных. Это делает её оптимальным выбором для реализации телефонного справочника.

2. **Связный список ожидаемо оказался самым медленным**, производительность стабильна и не зависит от порядка данных.

3. **Двоичное дерево поиска показало парадоксальные результаты:**
   - Рекордную скорость при случайном порядке данных
   - Катастрофическое падение производительности при отсортированном порядке

### 7.2 Практические рекомендации

| Сценарий использования | Рекомендуемая структура |
|------------------------|------------------------|
| Телефонный справочник любого размера | **Хеш-таблица** |
| Маленький справочник (< 100 записей) | Связный список |
| Нужен постоянно отсортированный вывод | Сбалансированное дерево (AVL/красно-чёрное) |
| Данные поступают в случайном порядке | Двоичное дерево поиска |
| Частые операции поиска по ключу | **Хеш-таблица** |

### 7.3 Заключение

Эксперимент успешно подтвердил теоретические оценки сложности операций для всех трёх структур данных. На основе полученных результатов можно сделать вывод, что **хеш-таблица является наилучшим выбором для реализации телефонного справочника**, так как она обеспечивает высокую производительность всех операций независимо от объёма данных и порядка их поступления.