diff --git a/BorisovMI/lab_1/docs/report.md b/BorisovMI/lab_1/docs/report.md new file mode 100644 index 0000000..5ab8071 --- /dev/null +++ b/BorisovMI/lab_1/docs/report.md @@ -0,0 +1,73 @@ +# Отчёт: Задание 1 — Структуры данных + +## Цель работы + +Реализовать три структуры данных «с нуля» в процедурной парадигме (без классов), применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций. + +## Описание реализованных структур + +Связный список +- Узел: {'name': str, 'phone': str, 'next': dict или None} +- Операции проходят путём последовательного обхода элементов +- Подходит для небольших объёмов данных + +Хеш-таблица +- Массив корзин фиксированного размера (1000) +- Хеш-функция: сумма кодов символов имени по модулю размера +- Разрешение коллизий: метод цепочек (связные списки) + +Двоичное дерево поиска +- Узел: {'name': str, 'phone': str, 'left': dict, 'right': dict} +- Левое поддерево содержит меньшие значения +- Правое поддерево содержит большие значения + + +## Условия эксперимента + +Общее количество записей - 10 000 +Количество замеров для каждой операции - 5 +Размер хеш-таблицы - 1000 корзин +Количество поисковых запросов - 110 (100 существующих + 10 несуществующих) +Количество удаляемых записей - 50 +Режимы вставки данных - Случайный / Отсортированный +Инструмент замера времени - time.perf_counter() + + +## Результаты + +### Таблица средних времён (секунды) + +| Структура | Режим | Вставка (с) | Поиск 110 (с) | Удаление 50 (с) | +|---|---|---|---|---| +| LinkedList | случайный | 12.32399 | 0.1279214 | 0.053208 | +| LinkedList | сортированный | 11.701628 | 0.0989321 | 0.052782 | +| HashTable | случайный | 0.7027289 | 0.0056565 | 0.0036097 | +| HashTable | сортированный | 0.5376899 | 0.0047595 | 0.003316 | +| BST | случайный | 0.08628449 | 0.000474 | 0.1715181 | +| BST | сортированный | 33.374929 | 0.1351418 | 0.1574643 | + +### Графики + +![Сравнение по операциям](data/perfomance_graphs.png) + +## Анализ результатов + +### Связный список + +Вставка в список занимает ~2.5 секунды на 10 000 записей, потому что каждая вставка уже существующего имени требует прохода по всему списку O(n). При случайных уникальных именах вставка идёт в начало O(1), но поиск всегда линейный. + +### Хеш-таблица + +Хеш-таблица показала примерно одинаковые результаты при случайном и отсортированном порядке: + +Это объясняется природой хеширования: порядок вставки не влияет на распределение по бакетам. Ключ всегда попадает в предсказуемый бакет за O(1). + +### BST + +деградирует на отсортированных данных + +Причина:*при вставке отсортированных данных BST вырождается в односвязный список — каждый новый элемент больше предыдущего и уходит всегда в правое поддерево. Высота дерева становится O(n) вместо O(log n). Поиск и удаление тоже деградируют до O(n). + +## Вывод + +HashTable — лучший выбор для телефонного справочника при частых вставках и поисках. BST лучше HashTable только если нужен отсортированный вывод без дополнительной сортировки — но при условии случайного порядка вставки или использования самобалансирующегося дерева (AVL, Red-Black).