diff --git a/ProninVV/aufgabe-1-data-structures/report/document.tex b/ProninVV/aufgabe-1-data-structures/report/document.tex new file mode 100644 index 0000000..3a5f6fa --- /dev/null +++ b/ProninVV/aufgabe-1-data-structures/report/document.tex @@ -0,0 +1,8 @@ +\input{preambule.tex} + + + + +\begin{document} + +\end{document} \ No newline at end of file diff --git a/ProninVV/aufgabe-1-data-structures/report/preambule.tex b/ProninVV/aufgabe-1-data-structures/report/preambule.tex new file mode 100644 index 0000000..d8dc43d --- /dev/null +++ b/ProninVV/aufgabe-1-data-structures/report/preambule.tex @@ -0,0 +1,46 @@ +%\documentclass[a4paper, 12pt]{article} +\documentclass[a4paper, 14pt]{extarticle} + +\usepackage[english, russian]{babel} +\usepackage[T2A]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{comment} + + +\usepackage{fontspec} +\setmainfont{Times New Roman} + +\usepackage{amsmath} +\usepackage{amssymb} + +\usepackage{geometry} +\usepackage{titleps} +\usepackage{graphicx} +\DeclareGraphicsExtensions{.pdf, .jpg} +\usepackage{wrapfig} + + +\usepackage{indentfirst} + + +\geometry{top=20mm} +\geometry{bottom=25mm} +\geometry{left=30mm} +\geometry{right=10mm} + +\usepackage{float} +\usepackage{wrapfig} + +\newpagestyle{main}{ + \setheadrule{0.4pt} + \sethead{ННГУ им Н.И. Лобачесвкого}{}{В. В. Пронин} + + \setfoot{}{\thepage}{} +} +\pagestyle{main} +%\setcounter{page}{2} + +\linespread{1.5} +\setlength{\parindent}{10mm} +\setlength{\parskip}{1ex} + diff --git a/ProninVV/aufgabe-1-data-structures/test.py b/ProninVV/aufgabe-1-data-structures/test.py new file mode 100644 index 0000000..c12d590 --- /dev/null +++ b/ProninVV/aufgabe-1-data-structures/test.py @@ -0,0 +1,142 @@ +from aufg1 import * +import time +import random +import sys +import csv + +sys.setrecursionlimit(20000) + +def phone_number_generate(): + number = "8" + text = "0123456789" + for i in range(10): + char = random.choice(text) + number += char + return number + +def create_data(n=100): + + """ создаем сразу обычный массив и остортированный """ + + records_sorted = [] + for i in range(n): + name = f"User_{i:05d}" + phone = phone_number_generate() + records_sorted.append((name, phone)) + + records_shuffled = records_sorted + random.shuffle(records_shuffled) + return records_sorted, records_shuffled + + +def run_expirement(epoch=1, elements=100): + + """ распределяем данные по трем структурам данных + тестируем время операций (вставки, удаления, перебора) и записываем полученные результаты в файл """ + + + # создаем данные + records_sorted, records_shuffled = create_data(100) + + datasets = [ + ("shuffled", records_shuffled), + ("sorted", records_sorted)] + + # режим - случайный, соритрованный + + header = ["Структура", "Режим", "Операция", "Время (сек)"] + results = [header] + + linklist = None + hashtab = hash_table(elements) + bintree = None + + # сразу будем обрабатывать и случайны и отсортированный данные + for label, arr in datasets: + + # заполнение связного списка + start = time.perf_counter() + for p in arr: + linklist = ll_insert(linklist, p[0], p[1]) + end = time.perf_counter() + results.append(["linklist", label, "insert", end-start]) + + # поиск 110 имен в связном списке + # несуществующие данные + nonedata = [(f"None_{i}", phone_number_generate()) for i in range(10)] + # случайная комбинация + chaossample = random.sample(arr, 100) + nonedata + start = time.perf_counter() + for p in chaossample: + ll_find(linklist, p[0]) + end = time.perf_counter() + results.append(["linklist", label, "find", end-start]) + + # удаление 50 имен в св писке + deldata = random.sample(arr, 50) + start = time.perf_counter() + for p in arr: + ll_delete(linklist, p[0]) + end = time.perf_counter() + results.append(["linklist", label, "delete", end-start]) + + # заполнение хэш-тфблицы + start = time.perf_counter() + for p in records_shuffled: + hashtab = ht_insert(hashtab, p[0], p[1]) + end = time.perf_counter() + results.append(["hashtable", label, "insert", end-start]) + + # поиск 110 имен в хэш таблице + # несуществующие данные + nonedata = [(f"None_{i}", phone_number_generate()) for i in range(10)] + # случайная комбинация + chaossample = random.sample(arr, 100) + nonedata + start = time.perf_counter() + for p in chaossample: + ht_find(hashtab, p[0]) + end = time.perf_counter() + results.append(["hashtable", label, "find", end-start]) + + # удаление 50 имен в хэш таблице + deldata = random.sample(arr, 50) + start = time.perf_counter() + for p in arr: + ht_delete(hashtab, p[0]) + end = time.perf_counter() + results.append(["hashtable", label, "delete", end-start]) + + # заполнение дерева + start = time.perf_counter() + for p in records_shuffled: + bintree = bst_insert(bintree, p[0], p[1]) + end = time.perf_counter() + results.append(["bintree", label, "insert", end-start]) + + # поиск 110 имен в дереве + # несуществующие данные + nonedata = [(f"None_{i}", phone_number_generate()) for i in range(10)] + # случайная комбинация + chaossample = random.sample(arr, 100) + nonedata + start = time.perf_counter() + for p in chaossample: + bst_find(bintree, p[0]) + end = time.perf_counter() + results.append(["bintree", label, "find", end-start]) + + # удаление 50 имен в дереве + deldata = random.sample(arr, 50) + start = time.perf_counter() + for p in arr: + bst_delete(bintree, p[0]) + end = time.perf_counter() + results.append(["bintree", label, "delete", end-start]) + + + with open('timedata.csv', mode='w', encoding='utf-8', newline='') as file: + writer = csv.writer(file) + writer.writerows(results) + + + +run_expirement(1) \ No newline at end of file