forked from UNN/2026-rff_mp
41 lines
9.2 KiB
Plaintext
41 lines
9.2 KiB
Plaintext
|
|
{
|
|||
|
|
"metadata": {
|
|||
|
|
"kernelspec": {
|
|||
|
|
"display_name": "Python (Pyodide)",
|
|||
|
|
"language": "python",
|
|||
|
|
"name": "python"
|
|||
|
|
},
|
|||
|
|
"language_info": {
|
|||
|
|
"codemirror_mode": {
|
|||
|
|
"name": "python",
|
|||
|
|
"version": 3
|
|||
|
|
},
|
|||
|
|
"file_extension": ".py",
|
|||
|
|
"mimetype": "text/x-python",
|
|||
|
|
"name": "python",
|
|||
|
|
"nbconvert_exporter": "python",
|
|||
|
|
"pygments_lexer": "ipython3",
|
|||
|
|
"version": "3.8"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"nbformat_minor": 5,
|
|||
|
|
"nbformat": 4,
|
|||
|
|
"cells": [
|
|||
|
|
{
|
|||
|
|
"id": "eb4edc6f-c633-467e-abbb-e7ed9d5dd8fa",
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"source": "# Отчёт: Задание 1 — Структуры данных\n\n## Цель работы\n\nРазработать три структуры данных «с нуля» в процедурном стиле (без ООП), применить их для хранения записей телефонной книги и провести экспериментальное сравнение производительности ключевых операций.\n\n**Структуры данных:**\n- Связный список (LinkedList)\n- Хеш-таблица (HashTable)\n- Двоичное дерево поиска (BST)\n\n---\n\n## Реализация\n\n### Основные технические решения\n\n#### 1. Связный список\n\nУзел реализован как Python-словарь: `{'name': 'Имя', 'phone': '123', 'next': None}`.\n\nНовые элементы добавляются **в начало** списка за O(1) (при условии отсутствия имени), обновление требует прохода по списку O(n). Поиск и удаление работают за линейное время из-за отсутствия прямого доступа по индексу.\n\n#### 2. Хеш-таблица\n\nФиксированный массив на 256 корзин. Каждая корзина — указатель на связный список (метод цепочек). Хеш-функция: стандартный `hash(name) % size`. Среднее время операций O(1), при коллизиях — O(k), где k — длина цепочки.\n\n#### 3. Двоичное дерево поиска (BST)\n\nУзел: `{'name': 'Имя', 'phone': '123', 'left': None, 'right': None}`. Сравнение ключей — лексикографическое по полю name. Вставка и поиск реализованы итеративно. Удаление — рекурсивное с заменой на минимальный узел правого поддерева. Обход в глубину даёт отсортированный список.\n\n---\n\n## Экспериментальная часть\n\n### Условия проведения замеров\n\n| Параметр | Значение |\n|---|---|\n| Количество записей (N) | 10 000 |\n| Количество замеров на операцию | 5 |\n| Поисковых запросов | 110 (100 существующих + 10 отсутствующих) |\n| Удалений | 50 |\n| Размер хеш-таблицы | 256 корзин |\n\n**Два набора данных:**\n- `records_shuffled` — случайный порядок записей\n- `records_sorted` — упорядоченный по имени (алфавитный порядок)\n\n---\n\n## Результаты\n\n### Среднее время выполнения (секунды)\n\n| Структура | Режим | Вставка (с) | Поиск 110 (с) | Удаление 50 (с) |\n|---|---|---|---|---|\n| LinkedList | случайный | 2.541985 | 0.034289 | 0.020349 |\n| LinkedList | сортированный | 2.208557 | 0.025340 | 0.016424 |\n| HashTable | случайный | 0.018235 | 0.000214 | 0.000120 |\n| HashTable | сортированный | 0.016163 | 0.000207 | 0.000124 |\n| BST | случайный | 0.017192 | 0.000145 | 0.000104 |\n| **BST** | **сортированный** | **3.854338** | **0.033498** | **0.045823** |\n\n### Визуализация\n\n\n\n\n\n---\n\n## Анализ результатов\n\n### 1. Связный список — стабильно низкая скорость\n\nВставка требует **~2.5 секунд** на 10 000 элементов, поскольку каждая операция п
|
|||
|
|
"metadata": {}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": "00c3b29d-3742-471c-b8e1-f432ee2d10c4",
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"source": "",
|
|||
|
|
"metadata": {
|
|||
|
|
"trusted": true
|
|||
|
|
},
|
|||
|
|
"outputs": [],
|
|||
|
|
"execution_count": null
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|