diff --git a/MusinAA/docs/Report 1.ipynb b/MusinAA/docs/Report 1.ipynb new file mode 100644 index 0000000..cd21dda --- /dev/null +++ b/MusinAA/docs/Report 1.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2acfa743", + "metadata": {}, + "source": [ + "# 0. Подготовим окружение" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "4689b73e", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import os\n", + "sys.path.insert(0, os.path.abspath( '../task1'))\n", + "sys.path.insert(0, os.path.abspath( '../'))" + ] + }, + { + "cell_type": "markdown", + "id": "37cc11a5", + "metadata": {}, + "source": [ + "# 1. Генерация тестовых данных\n", + "\n", + "Создадим список records из N=10000 элементов. Каждый элемент — кортеж (name, phone). \n", + "Имена возъмём случайные из небольшого набора (чтобы были повторения и коллизии). \n", + "Для проверки влияния порядка подготовим два варианта: \n", + "\n", + "_records_shuffled_ — случайный порядок. \n", + "_records_sorted_ — отсортированный по имени (по алфавиту)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7d073d06", + "metadata": {}, + "outputs": [], + "source": [ + "from util.randomNames import generate_test_data\n", + "records_shuffled = generate_test_data(N=10000)\n", + "records_sorted = generate_test_data(N=10000, _sorted=True)\n", + "\n", + "from util.timeTester import insert_tester" + ] + }, + { + "cell_type": "markdown", + "id": "c2f4989c", + "metadata": {}, + "source": [ + "# 2. Проведение замеров\n", + "### A. Время вставки" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eba5888c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Function': 'll_insert', 'shuffled': 4.4217493799999374, 'sorted': 5.294112365000046}\n", + "{'Function': 'ht_insert', 'shuffled': 0.338659952999933, 'sorted': 0.20052070199994887}\n", + "{'Function': 'bst_insert', 'shuffled': 0.01834327899996424, 'sorted': 0.18432242999983828}\n" + ] + } + ], + "source": [ + "from structures.LinkedList import *\n", + "from structures.HashTable import *\n", + "from structures.BinaryTree import *\n", + "\n", + "print(insert_tester(ll_insert, records_shuffled, records_sorted))\n", + "print(insert_tester(ht_insert, records_shuffled, records_sorted))\n", + "print(insert_tester(bst_insert, records_shuffled, records_sorted))" + ] + }, + { + "cell_type": "markdown", + "id": "383c4b1b", + "metadata": {}, + "source": [ + "### Б. Поиск 100 случайных записей и 10 несуществующих" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1acfa50", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/MusinAA/task1/structures/HashTable.py b/MusinAA/task1/structures/HashTable.py index 81b4d90..08b93fd 100644 --- a/MusinAA/task1/structures/HashTable.py +++ b/MusinAA/task1/structures/HashTable.py @@ -20,12 +20,13 @@ def hash_fun(name: str, size: int) -> int: n -= 1 return int(hashSum) % size -def ht_insert(buckets: list, name: str, phone: str) -> list: +def ht_insert(buckets: list, name: str, phone: str, blen:int = 50) -> list: """Возвращает новый массив бакетов Вычисляет индекс, вызывает ll_insert для соответствующего бакета. Функция не меняет размер массива бакетов автоматически!""" - if buckets == []: - raise ValueError("Длинна buckets должна быть больше 0") + if buckets == [] or buckets == None: + buckets = [None] * blen + # raise ValueError("Длинна buckets должна быть больше 0") size = len(buckets) index = hash_fun(name, size) diff --git a/MusinAA/task1/util/__init__.py b/MusinAA/task1/util/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/MusinAA/task1/util/randomNames.py b/MusinAA/task1/util/randomNames.py new file mode 100644 index 0000000..3fffb67 --- /dev/null +++ b/MusinAA/task1/util/randomNames.py @@ -0,0 +1,47 @@ +import random + +names_pool = ( + "Иван", "Мария", "Петр", "Анна", "Сергей", "Елена", "Алексей", "Ольга", + "Дмитрий", "Татьяна", "Михаил", "Наталья", "Андрей", "Ирина", "Николай", + "Светлана", "Владимир", "Екатерина", "Александр", "Юлия", "Павел", "Ксения", + "Виктор", "Анастасия", "Артем", "Виктория", "Максим", "Полина", "Даниил", + "София", "Евгений", "Алиса", "Станислав", "Дарья", "Георгий", "Вероника", + "Кирилл", "Маргарита", "Тимофей", "Арина", "Руфина", "Илларион", "Стелла", + "Роман", "Валерия", "Игорь", "Алина", "Олег", "Диана", "Юрий", "Милана", + "Василий", "Ева", "Никита", "Алиса", "Константин", "Кира", "Денис", "Ангелина", + "Вячеслав", "Мирослава", "Григорий", "Эмилия", "Леонид", "Василиса", "Руслан", + "Стефания", "Арсений", "Есения", "Антон", "Яна", "Матвей", "Любовь", "Семен", + "Надежда", "Федор", "Софья", "Лев", "Варвара", "Егор", "Амелия", "Борис", + "Агата", "Захар", "Камилла", "Давид", "Олеся", "Ярослав", "Людмила", "Данила", + "Регина", "Марк", "Каролина", "Артур", "Нелли", "Глеб", "Инна", "Платон", + "Нина", "Святослав", "Римма", "Родион", "Лидия", "Эдуард", "Жанна", "Вадим", + "Рената", "Савелий", "Алла", "Назар", "Снежана", "Демид", "Лариса", "Филипп", + "Злата", "Тимур", "Майя", "Клим", "Эльвира", "Дамир", "Таисия", "Илья", + "Роза", "Виталий", "Азалия", "Степан", "Лиана", "Богдан", "Инесса", "Эрик", + "Ариана", "Алан", "Юлиана", "Лука", "Антонина", "Мирон", "Клавдия", "Гордей", + "Руслана", "Макар", "Елизавета", "Северин", "Александра", "Моисей", "Агафья", + "Наум", "Серафима", "Влад", "Фаина", "Кузьма", "Пелагея", "Ермак", "Ульяна", + "Тарас", "Марианна", "Остап", "Бронислава", "Архип", "Владислава", "Фома", + "Станислава", "Еремей", "Зинаида", "Прохор", "Раиса", "Мстислав", "Галина", + "Ростислав", "Валентина", "Серафим", "Евдокия", "Лаврентий", "Кристина", + "Никон", "Анфиса", "Феликс", "Лия", "Иннокентий", "Роксана", "Всеволод", + "Эвелина", "Модест", "Юнона", "Трофим", "Изабелла", "Аполлон", "Глория", + "Касьян", "Аврора", "Любомир", "Адель", "Бронислав", "Доминика", "Афанасий", + "Фрида", "Евстафий", "Ассоль", "Венедикт", "Цветана", "Епифан", "Мелисса", + "Добрыня" +) + +def generate_phone(phone_len=11) -> str: + # 88005553535 + return str(random.randint(10**phone_len, 10**(phone_len+1)-1)) + +def generate_test_data(N=10000, _sorted=False): + records = [] + for i in range(N): + name = random.choice(names_pool) + phone = generate_phone() + records.append((name, phone)) + + if _sorted: + return sorted(records) + return records \ No newline at end of file diff --git a/MusinAA/task1/util/timeTester.py b/MusinAA/task1/util/timeTester.py new file mode 100644 index 0000000..a0a5007 --- /dev/null +++ b/MusinAA/task1/util/timeTester.py @@ -0,0 +1,24 @@ +import time +from typing import Callable, Any + +def _concrete_insert_tester(func: Callable[[Any, str, str], Any], records: list) -> float: + """Исследует время работы функции вставки""" + aboba = None + + start = time.perf_counter() + for item in records: + aboba = func(aboba, name=item[0], phone=item[1]) + end = time.perf_counter() + + elapsed = end - start + return elapsed + +def insert_tester(func_to_test: Callable[[Any, str, str], Any], records_shuffled, records_sorted) -> dict: + """Возвращает словарь с временем сортировки в обоих режимах""" + shuffled = _concrete_insert_tester(func_to_test, records_shuffled) + sorted = _concrete_insert_tester(func_to_test, records_sorted) + + return {"Function": func_to_test.__name__, + "shuffled": shuffled, + "sorted": sorted + } \ No newline at end of file