Начат отчёт
This commit is contained in:
parent
dd4eca8407
commit
7026ad395d
126
MusinAA/docs/Report 1.ipynb
Normal file
126
MusinAA/docs/Report 1.ipynb
Normal file
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
0
MusinAA/task1/util/__init__.py
Normal file
0
MusinAA/task1/util/__init__.py
Normal file
47
MusinAA/task1/util/randomNames.py
Normal file
47
MusinAA/task1/util/randomNames.py
Normal file
|
|
@ -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
|
||||
24
MusinAA/task1/util/timeTester.py
Normal file
24
MusinAA/task1/util/timeTester.py
Normal file
|
|
@ -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
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user