доп.тест
This commit is contained in:
parent
303da5bdc5
commit
cfa0475158
19
nikolaevda/docs/data/experiment_results.csv
Normal file
19
nikolaevda/docs/data/experiment_results.csv
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
Структура;Режим;Операция;Замер1(с);Замер2(с);Замер3(с);Замер4(с);Замер5(с);Среднее(с)
|
||||||
|
linked_list;случайный;вставка;4.743085900001461;4.702243700005056;4.426778699998977;4.3052682999987155;4.301903599996876;4.495856040000217
|
||||||
|
linked_list;случайный;поиск;0.040070499999274034;0.03833870000380557;0.038309099996695295;0.038068900001235306;0.037999300002411474;0.03855730000068434
|
||||||
|
linked_list;случайный;удаление;0.03337140000076033;0.03520829999615671;0.03318629999557743;0.03670069999498082;0.03511889999936102;0.03471711999736726
|
||||||
|
hash_table;случайный;вставка;0.054787300003226846;0.038778399997681845;0.038185400000656955;0.03906660000211559;0.040834699997503776;0.042330480000237
|
||||||
|
hash_table;случайный;поиск;0.00048270000115735456;0.0003393000006326474;0.00034130000130971894;0.0003389000048628077;0.0003389000048628077;0.00036822000256506724
|
||||||
|
hash_table;случайный;удаление;0.00018000000272877514;0.0001720000000204891;0.0001720000000204891;0.0001764999979059212;0.0001747999995131977;0.00017506000003777444
|
||||||
|
bst;случайный;вставка;0.04329969999525929;0.04011429999809479;0.0377946999942651;0.03973660000337986;0.03843010000127833;0.03987507999845548
|
||||||
|
bst;случайный;поиск;0.0005353999949875288;0.0004243000003043562;0.00040499999886378646;0.00041709999641170725;0.00041870000131893903;0.00044009999837726357
|
||||||
|
bst;случайный;удаление;0.08770270000240998;0.08755029999883845;0.09487290000106441;0.08564219999971101;0.08784590000141179;0.08872280000068714
|
||||||
|
linked_list;отсортированный;вставка;5.82706280000275;5.942067100004351;6.058909300001687;5.410613899999589;5.423316100001102;5.732393840001896
|
||||||
|
linked_list;отсортированный;поиск;0.05126659999950789;0.04912999999942258;0.04894649999914691;0.048823999997694045;0.0484264999977313;0.04931871999870054
|
||||||
|
linked_list;отсортированный;удаление;0.03424879999511177;0.03367250000155764;0.03369569999631494;0.03390580000268528;0.034035600001516286;0.033911679999437186
|
||||||
|
hash_table;отсортированный;вставка;0.03484389999357518;0.03386820000014268;0.033041399998182897;0.03465739999955986;0.035284899997350294;0.03433915999776218
|
||||||
|
hash_table;отсортированный;поиск;0.0005273999995552003;0.00044519999937620014;0.00037960000190651044;0.000374099996406585;0.0003724999987753108;0.00041975999920396134
|
||||||
|
hash_table;отсортированный;удаление;0.00017210000078193843;0.00017210000078193843;0.00017300000035902485;0.00017389999993611127;0.0001722999950288795;0.00017267999937757849
|
||||||
|
bst;отсортированный;вставка;17.43330440000136;17.245424400003685;17.230704699999478;17.4216249999954;17.25258659999963;17.31672901999991
|
||||||
|
bst;отсортированный;поиск;0.15691709999373415;0.15601930000411812;0.15765989999636076;0.15630209999653744;0.1590829000051599;0.15719625999918208
|
||||||
|
bst;отсортированный;удаление;0.08944690000498667;0.086433999997098;0.08745249999628868;0.08608390000154031;0.09040470000036294;0.08796440000005532
|
||||||
|
BIN
nikolaevda/docs/data/graphs.png
Normal file
BIN
nikolaevda/docs/data/graphs.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
245
nikolaevda/docs/report_laba1.ipynb
Normal file
245
nikolaevda/docs/report_laba1.ipynb
Normal file
|
|
@ -0,0 +1,245 @@
|
||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"id": "7cbca316",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"{\n",
|
||||||
|
" \"cells\": [\n",
|
||||||
|
" {\n",
|
||||||
|
" \"cell_type\": \"markdown\",\n",
|
||||||
|
" \"id\": \"start\",\n",
|
||||||
|
" \"metadata\": {},\n",
|
||||||
|
" \"source\": [\n",
|
||||||
|
" \"# Отчёт по лабораторной работе\\n\",\n",
|
||||||
|
" \"## Тема: Сравнение производительности структур данных для телефонного справочника\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"---\"\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" \"cell_type\": \"markdown\",\n",
|
||||||
|
" \"id\": \"goal\",\n",
|
||||||
|
" \"metadata\": {},\n",
|
||||||
|
" \"source\": [\n",
|
||||||
|
" \"## 1. Цель работы\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"Реализовать три различные структуры данных «с нуля», применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций (вставка, поиск, удаление).\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"---\"\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" \"cell_type\": \"markdown\",\n",
|
||||||
|
" \"id\": \"conditions\",\n",
|
||||||
|
" \"metadata\": {},\n",
|
||||||
|
" \"source\": [\n",
|
||||||
|
" \"## 2. Условия эксперимента\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"| Параметр | Значение |\\n\",\n",
|
||||||
|
" \"|----------|----------|\\n\",\n",
|
||||||
|
" \"| Общее число записей | 10 000 |\\n\",\n",
|
||||||
|
" \"| Каждый замер повторялся | 5 раз |\\n\",\n",
|
||||||
|
" \"| Количество существующих записей для поиска | 100 |\\n\",\n",
|
||||||
|
" \"| Количество несуществующих записей для поиска | 10 |\\n\",\n",
|
||||||
|
" \"| Количество элементов для удаления | 50 |\\n\",\n",
|
||||||
|
" \"| Размер хеш-таблицы | 2003 (простое число) |\\n\",\n",
|
||||||
|
" \"| Режимы тестирования | Случайный / Отсортированный |\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"---\"\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" \"cell_type\": \"markdown\",\n",
|
||||||
|
" \"id\": \"graphs\",\n",
|
||||||
|
" \"metadata\": {},\n",
|
||||||
|
" \"source\": [\n",
|
||||||
|
" \"## 3. Практические графики\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"### Информация о тестировании\\n\",\n",
|
||||||
|
" \"- Общее число записей: 10 000\\n\",\n",
|
||||||
|
" \"- Каждый замер повторялся: 5 раз\\n\",\n",
|
||||||
|
" \"- Количество существующих записей для случайного поиска: 100\\n\",\n",
|
||||||
|
" \"- Количество несуществующих записей для поиска: 10\\n\",\n",
|
||||||
|
" \"- Количество элементов для удаления: 50\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"**Рис. 1 – Тестирование вставки (логарифмическая шкала)**\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"---\"\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" \"cell_type\": \"markdown\",\n",
|
||||||
|
" \"id\": \"analysis_bst\",\n",
|
||||||
|
" \"metadata\": {},\n",
|
||||||
|
" \"source\": [\n",
|
||||||
|
" \"## 4. Анализ результатов\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"### Как порядок входных данных влияет на скорость вставки в BST (деградация до O(n) на отсортированных данных)?\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"По определению, при вставке отсортированных данных, структура бинарного дерева поиска вырождается в связный список.\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"**Результаты тестирования:**\\n\",\n",
|
||||||
|
" \"- На случайных данных: время вставки ~0.037 секунд\\n\",\n",
|
||||||
|
" \"- На отсортированных данных: время вставки ~18.34 секунд (деградация в ~470 раз!)\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"Заметим, что при случайных данных скорость вставки в бинарное дерево почти лишь немного уступает по скорости хеш-таблице. При отсортированных данных дерево фактически превращается в связный список, и из-за рекурсивной реализации вставки бинарное дерево становится даже медленнее связного списка.\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"---\"\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" \"cell_type\": \"markdown\",\n",
|
||||||
|
" \"id\": \"analysis_hash\",\n",
|
||||||
|
" \"metadata\": {},\n",
|
||||||
|
" \"source\": [\n",
|
||||||
|
" \"### Почему хеш-таблица почти не чувствительна к порядку?\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"Хеш-таблица не чувствительна к порядку данных, так как:\\n\",\n",
|
||||||
|
" \"1. Использует для распределения элементов хеш-значения данных (сложность операции одинакова для любых однотипных данных)\\n\",\n",
|
||||||
|
" \"2. Хеш-функция равномерно распределяет ключи по корзинам независимо от их порядка\\n\",\n",
|
||||||
|
" \"3. Вставка в конкретную корзину не зависит от соседних элементов\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"**Экспериментальное подтверждение:**\\n\",\n",
|
||||||
|
" \"- Случайный порядок: вставка = 0.0369 сек, поиск = 0.000355 сек\\n\",\n",
|
||||||
|
" \"- Отсортированный порядок: вставка = 0.0356 сек, поиск = 0.000380 сек\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"Разница незначительна и находится в пределах погрешности измерений.\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"---\"\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" \"cell_type\": \"markdown\",\n",
|
||||||
|
" \"id\": \"analysis_list\",\n",
|
||||||
|
" \"metadata\": {},\n",
|
||||||
|
" \"source\": [\n",
|
||||||
|
" \"### Почему связный список всегда медленен при поиске?\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"Операция поиска в связном списке имеет линейную сложность **O(n)** независимо от порядка данных, так как:\\n\",\n",
|
||||||
|
" \"- Нет индексов для прямого доступа\\n\",\n",
|
||||||
|
" \"- Нет сортировки, позволяющей применять бинарный поиск\\n\",\n",
|
||||||
|
" \"- Приходится последовательно перебирать все элементы до найденного\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"| Структура | Сложность поиска | Время поиска (случайный) |\\n\",\n",
|
||||||
|
" \"|-----------|-----------------|--------------------------|\\n\",\n",
|
||||||
|
" \"| Связный список | O(n) | 0.0427 сек |\\n\",\n",
|
||||||
|
" \"| Хеш-таблица | O(1) средняя | 0.000355 сек |\\n\",\n",
|
||||||
|
" \"| BST (случайный) | O(log n) | 0.000527 сек |\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"---\"\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" \"cell_type\": \"markdown\",\n",
|
||||||
|
" \"id\": \"analysis_delete\",\n",
|
||||||
|
" \"metadata\": {},\n",
|
||||||
|
" \"source\": [\n",
|
||||||
|
" \"### Как удаление работает в каждой структуре?\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"#### Связный список\\n\",\n",
|
||||||
|
" \"Находим элемент перед удаляемым элементом и заменяем его поле `next` на `next.next`:\\n\",\n",
|
||||||
|
" \"```python\\n\",\n",
|
||||||
|
" \"current = head\\n\",\n",
|
||||||
|
" \"while current['next'] is not None:\\n\",\n",
|
||||||
|
" \" if current['next']['name'] == name:\\n\",\n",
|
||||||
|
" \" current['next'] = current['next']['next']\\n\",\n",
|
||||||
|
" \" return head\\n\",\n",
|
||||||
|
" \" current = current['next']\\n\",\n",
|
||||||
|
" \"```\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"#### Двоичное дерево поиска\\n\",\n",
|
||||||
|
" \"После того, как мы нашли узел, который необходимо удалить, возможны три случая:\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"**Случай 1:** У удаляемого узла нет детей → просто удаляем узел.\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"**Случай 2:** У удаляемого узла есть только один ребёнок → ребёнок занимает место удалённого узла.\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"**Случай 3:** У удаляемого узла есть оба ребёнка → находим минимальный элемент в правом поддереве (самый левый узел) и заменяем им удаляемый узел.\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"#### Хеш-таблица\\n\",\n",
|
||||||
|
" \"1. Вычисляем хеш-индекс: `index = hash_func(name, len(buckets))`\\n\",\n",
|
||||||
|
" \"2. Находим нужную корзину: `buckets[index]`\\n\",\n",
|
||||||
|
" \"3. Удаляем элемент из связного списка в этой корзине\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"**Сравнение времени удаления:**\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"| Структура | Время удаления (случайный) | Сложность |\\n\",\n",
|
||||||
|
" \"|-----------|---------------------------|-----------|\\n\",\n",
|
||||||
|
" \"| Связный список | 0.0341 сек | O(n) |\\n\",\n",
|
||||||
|
" \"| Хеш-таблица | 0.00018 сек | O(1) средняя |\\n\",\n",
|
||||||
|
" \"| BST | 0.0793 сек | O(log n) средняя |\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"---\"\n",
|
||||||
|
" ]\n",
|
||||||
|
" },\n",
|
||||||
|
" {\n",
|
||||||
|
" \"cell_type\": \"markdown\",\n",
|
||||||
|
" \"id\": \"conclusion\",\n",
|
||||||
|
" \"metadata\": {},\n",
|
||||||
|
" \"source\": [\n",
|
||||||
|
" \"## 5. Вывод\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"Мы реализовали и протестировали три различные структуры хранения данных: связный список, хеш-таблицу и двоичное дерево поиска. Сравнили скорость операций вставки, удаления и поиска для каждой структуры.\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"### Итоговая таблица производительности (случайный порядок):\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"| Структура | Вставка (сек) | Поиск (сек) | Удаление (сек) |\\n\",\n",
|
||||||
|
" \"|-----------|---------------|-------------|----------------|\\n\",\n",
|
||||||
|
" \"| Связный список | 4.6031 | 0.0427 | 0.0341 |\\n\",\n",
|
||||||
|
" \"| Хеш-таблица | **0.0369** | **0.00036** | **0.00018** |\\n\",\n",
|
||||||
|
" \"| BST | 0.0369 | 0.00053 | 0.0793 |\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"### Рекомендации по выбору структуры данных:\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"1. **Хеш-таблица** – лучший выбор для телефонного справочника:\\n\",\n",
|
||||||
|
" \" - Не важен порядок хранения и извлечения данных\\n\",\n",
|
||||||
|
" \" - Требуется максимальная скорость поиска и вставки\\n\",\n",
|
||||||
|
" \" - Результат: **победитель по всем параметрам**\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"2. **Двоичное дерево поиска** – выбираем, если:\\n\",\n",
|
||||||
|
" \" - Нужно хранить данные с возможностью быстрого отсортированного обхода\\n\",\n",
|
||||||
|
" \" - Данные поступают в случайном порядке (иначе будет деградация)\\n\",\n",
|
||||||
|
" \" - Можно использовать сбалансированную версию (AVL, красно-чёрное)\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"3. **Связный список** – выбираем, если:\\n\",\n",
|
||||||
|
" \" - Нужно хранить данные в порядке поступления (очередь, стек)\\n\",\n",
|
||||||
|
" \" - Объём данных очень маленький (< 100 записей)\\n\",\n",
|
||||||
|
" \" - Простота реализации важнее производительности\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"---\\n\",\n",
|
||||||
|
" \"\\n\",\n",
|
||||||
|
" \"**Заключение:** Для реализации телефонного справочника оптимальнее всего использовать **хеш-таблицу**, так как она обеспечивает наилучшую производительность для всех операций и не чувствительна к порядку входных данных.\"\n",
|
||||||
|
" ]\n",
|
||||||
|
" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" \"metadata\": {\n",
|
||||||
|
" \"kernelspec\": {\n",
|
||||||
|
" \"display_name\": \"Python 3\",\n",
|
||||||
|
" \"language\": \"python\",\n",
|
||||||
|
" \"name\": \"python3\"\n",
|
||||||
|
" },\n",
|
||||||
|
" \"language_info\": {\n",
|
||||||
|
" \"name\": \"python\",\n",
|
||||||
|
" \"version\": \"3.14.0\"\n",
|
||||||
|
" }\n",
|
||||||
|
" },\n",
|
||||||
|
" \"nbformat\": 4,\n",
|
||||||
|
" \"nbformat_minor\": 5\n",
|
||||||
|
"}"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"language_info": {
|
||||||
|
"name": "python"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
Структура;Режим;Операция;Замер1(с);Замер2(с);Замер3(с);Замер4(с);Замер5(с);Среднее(с)
|
|
||||||
linked_list;случайный;вставка;5.503300700000182;5.004083100000571;4.882084700000632;4.881827499999417;4.890130499999941;5.032285300000149
|
|
||||||
linked_list;случайный;поиск;0.05034929999965243;0.04795749999993859;0.046004300000277;0.04418989999976475;0.04287860000022192;0.04627591999997094
|
|
||||||
linked_list;случайный;удаление;0.03702340000018012;0.03709479999997711;0.03829469999982393;0.03841730000021926;0.03741160000026866;0.03764836000009382
|
|
||||||
hash_table;случайный;вставка;0.03724729999976262;0.036700800000289746;0.03645409999990079;0.036475899999459216;0.035486800000398944;0.03647297999996226
|
|
||||||
hash_table;случайный;поиск;0.00042500000017753337;0.00033910000001924345;0.00033829999938461697;0.0003378999999767984;0.00033820000044215703;0.00035570000000006985
|
|
||||||
hash_table;случайный;удаление;0.00018709999949351186;0.00017469999966124306;0.0001795999996829778;0.00018339999951422215;0.00017609999940759735;0.00018017999955191044
|
|
||||||
bst;случайный;вставка;0.04527770000004239;0.042043200000080105;0.04279800000040268;0.038970799999333394;0.03744349999942642;0.041306639999856995
|
|
||||||
bst;случайный;поиск;0.0005276000001686043;0.0004296000006434042;0.00043430000005173497;0.00041569999939383706;0.0004365999993751757;0.00044875999992655125
|
|
||||||
bst;случайный;удаление;0.09453469999971276;0.09244760000001406;0.10106580000046961;0.09086349999961385;0.09310050000021874;0.0944024200000058
|
|
||||||
linked_list;отсортированный;вставка;6.237431600000491;6.1635778999998365;6.183921300000293;6.150560400000359;6.1811854999996285;6.183335340000122
|
|
||||||
linked_list;отсортированный;поиск;0.05593550000048708;0.053237000000081025;0.05208490000040911;0.05022400000052585;0.049882199999956356;0.052272720000291886
|
|
||||||
linked_list;отсортированный;удаление;0.04117889999997715;0.037663099999917904;0.03757399999994959;0.04252919999998994;0.03767599999991944;0.03932423999995081
|
|
||||||
hash_table;отсортированный;вставка;0.04085130000021309;0.03589560000000347;0.03588300000046729;0.035286500000438537;0.03309669999998732;0.03620262000022194
|
|
||||||
hash_table;отсортированный;поиск;0.00044720000005327165;0.00040470000021741726;0.0003451000002314686;0.00034250000044266926;0.0003420000002734014;0.00037630000024364564
|
|
||||||
hash_table;отсортированный;удаление;0.0001863999996203347;0.00017409999964002054;0.00017500000012660166;0.00017459999980928842;0.00017379999917466193;0.00017677999967418144
|
|
||||||
bst;отсортированный;вставка;18.630878699999812;18.350701800000024;18.322985300001164;18.381200199999512;18.44051959999888;18.425257119999877
|
|
||||||
bst;отсортированный;поиск;0.16251639999973122;0.15183020000040415;0.1572033000011288;0.16128759999992326;0.16190610000012384;0.15894872000026225
|
|
||||||
bst;отсортированный;удаление;0.09546029999910388;0.09252720000040426;0.09302340000067488;0.09245310000005702;0.09305589999894437;0.09330397999983689
|
|
||||||
|
Binary file not shown.
|
Before Width: | Height: | Size: 74 KiB |
Loading…
Reference in New Issue
Block a user