142 lines
4.8 KiB
Python
142 lines
4.8 KiB
Python
|
|
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)
|