75 lines
4.6 KiB
Markdown
75 lines
4.6 KiB
Markdown
|
||
# Отчёт по лабораторной работе
|
||
|
||
## Цель работы
|
||
|
||
Реализовать три структуры данных «с нуля» (связный список, хеш-таблица, двоичное дерево поиска), применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций.
|
||
|
||
**Структуры данных:**
|
||
- Связный список (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). Несмотря на чуть большую константа в асимптотике по сравнению с хеш-таблицей, оно позволяет эффективно получать отсортированные данные, находить минимальный/максимальный элемент или элементы в заданном диапазоне.
|
||
#### Связный список в чистом виде для решения подобных задач сегодня практически не применяется из-за низкой эффективности поиска.
|