
# Отчёт по лабораторной работе

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

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

**Структуры данных:**
- Связный список (LinkedList)
- Хеш-таблица (HashTable)
- Двоичное дерево поиска (BST)


## Параметры эксперимента

- Количество записей: 10000
- Количество повторов каждого теста: 5
- Размер хеш-таблицы: 1000 корзин

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

| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) |
|-------|---------------|-------------|----------------|
| Случайный | 7.027 |  0.062 |  0.02 |
| Отсортированный | 6.93 | 0.065 | 0.02 |

### 2. Хеш-таблица

| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) |
|-------|---------------|-------------|----------------|
| Случайный | 0.033 | 0.0003 | 0.0001 |
| Отсортированный | 0.065 | 0.0003 | 0.0001 |

### 3. Двоичное дерево поиска (BST)

| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) |
|-------|---------------|-------------|----------------|
| Случайный | 9.6316 | 0.0967 | 0.035 |
| Отсортированный | 9.4514 | 0.1112 | 0.0352 |



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

### 1. Влияние порядка данных на BST

На отсортированных данных BST деградирует с O(log n) до O(n).

Время вставки увеличилось с {bst_random_insert:.4f} до {bst_sorted_insert:.4f} секунд — в {bst_sorted_insert/bst_random_insert:.1f} раз.

### 2. Почему хеш-таблица не чувствительна к порядку

Хеш-функция распределяет элементы случайно, порядок ввода не влияет на позицию элемента.

Разница между случайным и отсортированным порядком:

- Вставка: {ht_random_insert:.4f} vs {ht_sorted_insert:.4f}

- Отношение: {ht_sorted_insert/ht_random_insert:.2f}x (почти не чувствительна)

### 3. Почему связный список медленный при поиске

Поиск требует последовательного прохода O(n) без возможности индексации.

Поэтому связный список хорош только когда записей мало.

Для больших телефонных справочников он не подходит.
Выбор структуры данных должен основываться на требованиях конкретной задачи:

### Выбор структуры данных должен основываться на требованиях конкретной задачи:

#### Для максимальной скорости поиска и вставки (Телефонный справочник):Следует выбирать Хеш-таблицу. Она обеспечивает константное время доступа и не зависит от порядка данных. Это оптимальный выбор для базового функционала справочника.
#### Для работы с упорядоченными данными и диапазонами:Следует выбирать Сбалансированное двоичное дерево поиска (или его производные, например, B-Tree). Несмотря на чуть большую константа в асимптотике по сравнению с хеш-таблицей, оно позволяет эффективно получать отсортированные данные, находить минимальный/максимальный элемент или элементы в заданном диапазоне.
#### Связный список в чистом виде для решения подобных задач сегодня практически не применяется из-за низкой эффективности поиска.
