[1] task 1 #180

Open
yanyaevaa wants to merge 7 commits from yanyaevaa/2026-rff_mp:task-1 into develop
4 changed files with 349 additions and 132 deletions
Showing only changes of commit dec46dcc0a - Show all commits

View File

@ -1,132 +0,0 @@
def ll_insert(head, name, phone):
current = head
while current:
if current['name'] == name:
current['phone'] = phone
return head
current = current['next']
new_node = {'name': name, 'phone': phone, 'next': None}
new_node['next'] = head
return new_node
def ll_find(head, name):
current = head
while current:
if current['name'] == name:
return current['phone']
current = current['next']
return None
def ll_delete(head, name):
if head['name'] == name:
return head['next']
current = head
while current['next']:
if current['next']['name'] == name:
current['next'] = current['next']['next']
break
current = current['next']
return head
def quick_sort(arr):
if len(arr) <= 1:
return arr
left = []
middle = []
right = []
pivot = arr[len(arr) // 2][0]
for x in arr:
if x[0]<pivot:
left.append(x)
elif x[0]==pivot:
middle.append(x)
else:
right.append(x)
return quick_sort(left) + middle + quick_sort(right)
def ll_list_all(head):
data= []
current = head
while current:
data.append((current['name'], current['phone']))
current = current['next']
return quick_sort(data)
#хэш-таблица
def ht_insert(buckets, name, phone):
id=hash(name)%len(buckets)
buckets[id] = ll_insert(buckets[id], name, phone)
def ht_find(buckets, name):
id= hash(name)%len(buckets)
return ll_find(buckets[id], name)
def ht_delete(buckets, name):
id= hash(name)%len(buckets)
buckets[id] = ll_delete(buckets[id], name)
def ht_list_all(buckets):
data = []
for head in buckets:
current = head
while current:
data.append((current['name'], current['phone']))
current = current['next']
return quick_sort(data)
#Двоичное дерево поиска
def bst_insert(root, name, phone):
if root is None:
return {'name': name, 'phone': phone, 'left': None, 'right': None}
if root['name'] == name:
root['phone'] = phone
elif name<root['name']:
root['left'] = bst_insert(root['left'], name, phone)
else:
root['right'] = bst_insert(root['right'], name, phone)
return root
def bst_find(root, name):
if root is None:
return None
if root['name'] == name:
return root['phone']
elif name<root['name']:
return bst_find(root['left'], name)
else:
return bst_find(root['right'], name)
def minimum(node):
current = node
while current['left'] is True:
current = current['left']
return current
def bst_delete(root, name):
if root is None:
return None
if name < root['name']:
root['left'] = bst_delete(root['left'], name)
elif name > root['name']:
root['right'] = bst_delete(root['right'], name)
else:
if root['left'] is None:
return root['right']
elif root['right'] is None:
return root['left']
min=minimum(root['right'])
root['name']=min['name']
root['phone']=min['phone']
root['right']=bst_delete(root['right'], min['name'])
return root
def bst_list_all(root):
result=[]
if root:
result.extend(bst_list_all(root['left']))
result.append((root['name'], root['phone']))
result.extend(bst_list_all(root['right']))
return result

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

View File

@ -0,0 +1,91 @@
Структура,Режим,Операция,Время (сек)
LinkedList,Случайный,Вставка,1.3571506999942358
LinkedList,Отсортированный,Вставка,1.3104410000014468
LinkedList,Случайный,Вставка,1.370557700000063
LinkedList,Отсортированный,Вставка,1.3163567000010516
LinkedList,Случайный,Вставка,1.3726127999980235
LinkedList,Отсортированный,Вставка,1.3090860000011162
LinkedList,Случайный,Вставка,1.4184881000037421
LinkedList,Отсортированный,Вставка,1.3065769000022556
LinkedList,Случайный,Вставка,1.4324161999975331
LinkedList,Отсортированный,Вставка,1.302870300001814
HashTable,Случайный,Вставка,0.005242100000032224
HashTable,Отсортированный,Вставка,0.004384200001368299
HashTable,Случайный,Вставка,0.004452300003322307
HashTable,Отсортированный,Вставка,0.004285000002710149
HashTable,Случайный,Вставка,0.0043441999951028265
HashTable,Отсортированный,Вставка,0.004188300001260359
HashTable,Случайный,Вставка,0.031318500004999805
HashTable,Отсортированный,Вставка,0.004467499995371327
HashTable,Случайный,Вставка,0.004497000001720153
HashTable,Отсортированный,Вставка,0.00432149999687681
BinarySearchTree,Случайный,Вставка,0.016076799998700153
BinarySearchTree,Отсортированный,Вставка,6.949058300000615
BinarySearchTree,Случайный,Вставка,0.015741900002467446
BinarySearchTree,Отсортированный,Вставка,7.462577500002226
BinarySearchTree,Случайный,Вставка,0.0162205999949947
BinarySearchTree,Отсортированный,Вставка,7.46889309999824
BinarySearchTree,Случайный,Вставка,0.016196600001421757
BinarySearchTree,Отсортированный,Вставка,7.423307500001101
BinarySearchTree,Случайный,Вставка,0.015813499994692393
BinarySearchTree,Отсортированный,Вставка,7.387505999999121
LinkedList,Случайный,Поиск,0.016872100000909995
LinkedList,Отсортированный,Поиск,0.016344399999070447
LinkedList,Случайный,Поиск,0.017215699997905176
LinkedList,Отсортированный,Поиск,0.016057599998021033
LinkedList,Случайный,Поиск,0.017128699997556396
LinkedList,Отсортированный,Поиск,0.016144599998369813
LinkedList,Случайный,Поиск,0.01743249999708496
LinkedList,Отсортированный,Поиск,0.016194900003029034
LinkedList,Случайный,Поиск,0.017249500000616536
LinkedList,Отсортированный,Поиск,0.01595439999800874
HashTable,Случайный,Поиск,0.00018319999799132347
HashTable,Отсортированный,Поиск,0.0001588000013725832
HashTable,Случайный,Поиск,3.9999998989515007e-05
HashTable,Отсортированный,Поиск,3.5400000342633575e-05
HashTable,Случайный,Поиск,3.580000338843092e-05
HashTable,Отсортированный,Поиск,3.4199998481199145e-05
HashTable,Случайный,Поиск,3.5099998058285564e-05
HashTable,Отсортированный,Поиск,3.4199998481199145e-05
HashTable,Случайный,Поиск,3.5099998058285564e-05
HashTable,Отсортированный,Поиск,3.409999771974981e-05
BinarySearchTree,Случайный,Поиск,0.00023979999969014898
BinarySearchTree,Отсортированный,Поиск,0.06078229999548057
BinarySearchTree,Случайный,Поиск,0.0002549999990151264
BinarySearchTree,Отсортированный,Поиск,0.05937499999708962
BinarySearchTree,Случайный,Поиск,0.0005522999999811873
BinarySearchTree,Отсортированный,Поиск,0.057940200000302866
BinarySearchTree,Случайный,Поиск,0.00025070000265259296
BinarySearchTree,Отсортированный,Поиск,0.060181100001500454
BinarySearchTree,Случайный,Поиск,0.0002657000004546717
BinarySearchTree,Отсортированный,Поиск,0.05845009999757167
LinkedList,Случайный,Удаление,0.010934500001894776
LinkedList,Отсортированный,Удаление,0.011079000003519468
LinkedList,Случайный,Удаление,0.021408699998573866
LinkedList,Отсортированный,Удаление,0.01955590000579832
LinkedList,Случайный,Удаление,0.020861200006038416
LinkedList,Отсортированный,Удаление,0.020471800002269447
LinkedList,Случайный,Удаление,0.02055800000380259
LinkedList,Отсортированный,Удаление,0.01997020000271732
LinkedList,Случайный,Удаление,0.021316799997293856
LinkedList,Отсортированный,Удаление,0.02057559999957448
HashTable,Случайный,Удаление,9.029999637277797e-05
HashTable,Отсортированный,Удаление,8.179999713320285e-05
HashTable,Случайный,Удаление,6.199999916134402e-05
HashTable,Отсортированный,Удаление,5.950000195298344e-05
HashTable,Случайный,Удаление,2.6599998818710446e-05
HashTable,Отсортированный,Удаление,2.6399997295811772e-05
HashTable,Случайный,Удаление,2.6500005333218724e-05
HashTable,Отсортированный,Удаление,2.630000381032005e-05
HashTable,Случайный,Удаление,2.630000381032005e-05
HashTable,Отсортированный,Удаление,2.6200003048870713e-05
BinarySearchTree,Случайный,Удаление,0.00017410000145900995
BinarySearchTree,Отсортированный,Удаление,0.03420480000204407
BinarySearchTree,Случайный,Удаление,0.00016069999401224777
BinarySearchTree,Отсортированный,Удаление,0.03399109999736538
BinarySearchTree,Случайный,Удаление,0.00016940000205067918
BinarySearchTree,Отсортированный,Удаление,0.03377170000021579
BinarySearchTree,Случайный,Удаление,0.00018689999706111848
BinarySearchTree,Отсортированный,Удаление,0.033754900003259536
BinarySearchTree,Случайный,Удаление,0.0001664000010350719
BinarySearchTree,Отсортированный,Удаление,0.03359389999968698
1 Структура Режим Операция Время (сек)
2 LinkedList Случайный Вставка 1.3571506999942358
3 LinkedList Отсортированный Вставка 1.3104410000014468
4 LinkedList Случайный Вставка 1.370557700000063
5 LinkedList Отсортированный Вставка 1.3163567000010516
6 LinkedList Случайный Вставка 1.3726127999980235
7 LinkedList Отсортированный Вставка 1.3090860000011162
8 LinkedList Случайный Вставка 1.4184881000037421
9 LinkedList Отсортированный Вставка 1.3065769000022556
10 LinkedList Случайный Вставка 1.4324161999975331
11 LinkedList Отсортированный Вставка 1.302870300001814
12 HashTable Случайный Вставка 0.005242100000032224
13 HashTable Отсортированный Вставка 0.004384200001368299
14 HashTable Случайный Вставка 0.004452300003322307
15 HashTable Отсортированный Вставка 0.004285000002710149
16 HashTable Случайный Вставка 0.0043441999951028265
17 HashTable Отсортированный Вставка 0.004188300001260359
18 HashTable Случайный Вставка 0.031318500004999805
19 HashTable Отсортированный Вставка 0.004467499995371327
20 HashTable Случайный Вставка 0.004497000001720153
21 HashTable Отсортированный Вставка 0.00432149999687681
22 BinarySearchTree Случайный Вставка 0.016076799998700153
23 BinarySearchTree Отсортированный Вставка 6.949058300000615
24 BinarySearchTree Случайный Вставка 0.015741900002467446
25 BinarySearchTree Отсортированный Вставка 7.462577500002226
26 BinarySearchTree Случайный Вставка 0.0162205999949947
27 BinarySearchTree Отсортированный Вставка 7.46889309999824
28 BinarySearchTree Случайный Вставка 0.016196600001421757
29 BinarySearchTree Отсортированный Вставка 7.423307500001101
30 BinarySearchTree Случайный Вставка 0.015813499994692393
31 BinarySearchTree Отсортированный Вставка 7.387505999999121
32 LinkedList Случайный Поиск 0.016872100000909995
33 LinkedList Отсортированный Поиск 0.016344399999070447
34 LinkedList Случайный Поиск 0.017215699997905176
35 LinkedList Отсортированный Поиск 0.016057599998021033
36 LinkedList Случайный Поиск 0.017128699997556396
37 LinkedList Отсортированный Поиск 0.016144599998369813
38 LinkedList Случайный Поиск 0.01743249999708496
39 LinkedList Отсортированный Поиск 0.016194900003029034
40 LinkedList Случайный Поиск 0.017249500000616536
41 LinkedList Отсортированный Поиск 0.01595439999800874
42 HashTable Случайный Поиск 0.00018319999799132347
43 HashTable Отсортированный Поиск 0.0001588000013725832
44 HashTable Случайный Поиск 3.9999998989515007e-05
45 HashTable Отсортированный Поиск 3.5400000342633575e-05
46 HashTable Случайный Поиск 3.580000338843092e-05
47 HashTable Отсортированный Поиск 3.4199998481199145e-05
48 HashTable Случайный Поиск 3.5099998058285564e-05
49 HashTable Отсортированный Поиск 3.4199998481199145e-05
50 HashTable Случайный Поиск 3.5099998058285564e-05
51 HashTable Отсортированный Поиск 3.409999771974981e-05
52 BinarySearchTree Случайный Поиск 0.00023979999969014898
53 BinarySearchTree Отсортированный Поиск 0.06078229999548057
54 BinarySearchTree Случайный Поиск 0.0002549999990151264
55 BinarySearchTree Отсортированный Поиск 0.05937499999708962
56 BinarySearchTree Случайный Поиск 0.0005522999999811873
57 BinarySearchTree Отсортированный Поиск 0.057940200000302866
58 BinarySearchTree Случайный Поиск 0.00025070000265259296
59 BinarySearchTree Отсортированный Поиск 0.060181100001500454
60 BinarySearchTree Случайный Поиск 0.0002657000004546717
61 BinarySearchTree Отсортированный Поиск 0.05845009999757167
62 LinkedList Случайный Удаление 0.010934500001894776
63 LinkedList Отсортированный Удаление 0.011079000003519468
64 LinkedList Случайный Удаление 0.021408699998573866
65 LinkedList Отсортированный Удаление 0.01955590000579832
66 LinkedList Случайный Удаление 0.020861200006038416
67 LinkedList Отсортированный Удаление 0.020471800002269447
68 LinkedList Случайный Удаление 0.02055800000380259
69 LinkedList Отсортированный Удаление 0.01997020000271732
70 LinkedList Случайный Удаление 0.021316799997293856
71 LinkedList Отсортированный Удаление 0.02057559999957448
72 HashTable Случайный Удаление 9.029999637277797e-05
73 HashTable Отсортированный Удаление 8.179999713320285e-05
74 HashTable Случайный Удаление 6.199999916134402e-05
75 HashTable Отсортированный Удаление 5.950000195298344e-05
76 HashTable Случайный Удаление 2.6599998818710446e-05
77 HashTable Отсортированный Удаление 2.6399997295811772e-05
78 HashTable Случайный Удаление 2.6500005333218724e-05
79 HashTable Отсортированный Удаление 2.630000381032005e-05
80 HashTable Случайный Удаление 2.630000381032005e-05
81 HashTable Отсортированный Удаление 2.6200003048870713e-05
82 BinarySearchTree Случайный Удаление 0.00017410000145900995
83 BinarySearchTree Отсортированный Удаление 0.03420480000204407
84 BinarySearchTree Случайный Удаление 0.00016069999401224777
85 BinarySearchTree Отсортированный Удаление 0.03399109999736538
86 BinarySearchTree Случайный Удаление 0.00016940000205067918
87 BinarySearchTree Отсортированный Удаление 0.03377170000021579
88 BinarySearchTree Случайный Удаление 0.00018689999706111848
89 BinarySearchTree Отсортированный Удаление 0.033754900003259536
90 BinarySearchTree Случайный Удаление 0.0001664000010350719
91 BinarySearchTree Отсортированный Удаление 0.03359389999968698

258
YanyaevAA/task1/[1].py Normal file
View File

@ -0,0 +1,258 @@
import time
import random
import csv
import sys
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sys.setrecursionlimit(12000)
#Связный список
def ll_insert(head, name, phone):
current = head
while current:
if current['name'] == name:
current['phone'] = phone
return head
current = current['next']
new_node = {'name': name, 'phone': phone, 'next': None}
new_node['next'] = head
return new_node
def ll_find(head, name):
current = head
while current:
if current['name'] == name:
return current['phone']
current = current['next']
return None
def ll_delete(head, name):
if head['name'] == name:
return head['next']
current = head
while current['next']:
if current['next']['name'] == name:
current['next'] = current['next']['next']
break
current = current['next']
return head
def ll_list_all(head):
data= []
current = head
while current:
data.append((current['name'], current['phone']))
current = current['next']
return sorted(data)
#хэш-таблица
def ht_insert(buckets, name, phone):
id=hash(name)%len(buckets)
buckets[id] = ll_insert(buckets[id], name, phone)
def ht_find(buckets, name):
id= hash(name)%len(buckets)
return ll_find(buckets[id], name)
def ht_delete(buckets, name):
id= hash(name)%len(buckets)
buckets[id] = ll_delete(buckets[id], name)
def ht_list_all(buckets):
data = []
for head in buckets:
current = head
while current:
data.append((current['name'], current['phone']))
current = current['next']
return sorted(data)
#Двоичное дерево поиска
def bst_insert(root, name, phone):
if root is None:
return {'name': name, 'phone': phone, 'left': None, 'right': None}
if name == root['name']:
root['phone'] = phone
elif name < root['name']:
root['left'] = bst_insert(root['left'], name, phone)
else:
root['right'] = bst_insert(root['right'], name, phone)
return root
def bst_find(root, name):
if root is None:
return None
if root['name'] == name:
return root['phone']
elif name<root['name']:
return bst_find(root['left'], name)
else:
return bst_find(root['right'], name)
def minimum(node):
current = node
while current['left'] is not None:
current = current['left']
return current
def bst_delete(root, name):
if root is None:
return None
if name < root['name']:
root['left'] = bst_delete(root['left'], name)
elif name > root['name']:
root['right'] = bst_delete(root['right'], name)
else:
if root['left'] is None:
return root['right']
elif root['right'] is None:
return root['left']
min=minimum(root['right'])
root['name']=min['name']
root['phone']=min['phone']
root['right']=bst_delete(root['right'], min['name'])
return root
def bst_list_all(root):
result=[]
if root:
result.extend(bst_list_all(root['left']))
result.append((root['name'], root['phone']))
result.extend(bst_list_all(root['right']))
return result
#1. Генерация тестовых данных
def generate(n=10000):
records = [(f"User_{i:05d}", f"+7 ({random.randint(100, 999)}) {random.randint(100, 999)}-{random.randint(00, 99):02}-{random.randint(00, 99):02}") for i in range(n)]
records_sorted =records.copy()
records_shuffled=records.copy()
random.shuffle(records_shuffled)
return records_sorted, records_shuffled
#3.Проведение замеров
#А. Вставка всех записей
def task_A(structure_name, data):
start =time.perf_counter()
if structure_name=="LinkedList":
head=None
for name, phone in data:
head = ll_insert(head, name, phone)
container=head
elif structure_name=="HashTable":
buckets=[None]*1000
for name, phone in data:
ht_insert(buckets, name, phone)
container=buckets
elif structure_name=="BinarySearchTree":
root=None
for name, phone in data:
root = bst_insert(root, name, phone)
container=root
end = time.perf_counter()
elapsed = end - start
return elapsed, container
results=[["Структура", "Режим", "Операция", "Время (сек)"]]
structures_name=["LinkedList", "HashTable", "BinarySearchTree"]
experiment_name=["Вставка", "Поиск", "Удаление"]
mode_of_data=["Случайный", "Отсортированный"]
records_sorted, records_shuffled = generate()
container_shuffled=[]
container_sorted=[]
for i in range(3):
container_shuffled.append(task_A(structures_name[i], records_shuffled)[1])
container_sorted.append(task_A(structures_name[i], records_sorted)[1])
for j in range(5):
result_shuffled = task_A(structures_name[i], records_shuffled)[0]
results.append([structures_name[i], mode_of_data[0], experiment_name[0], result_shuffled])
result_sorted= task_A(structures_name[i], records_sorted)[0]
results.append([structures_name[i], mode_of_data[1], experiment_name[0], result_sorted])
print(f"{structures_name[i]}: Время вставки всех записей {mode_of_data[0]}: {result_shuffled} {mode_of_data[1]}: {result_sorted}")
#Б. Поиск 100 случайных записей
def task_B(structure_name,container, data):
start=time.perf_counter()
if structure_name=="LinkedList":
for name in data:
ll_find(container, name)
elif structure_name=="HashTable":
for name in data:
ht_find(container, name)
elif structure_name=="BinarySearchTree":
for name in data:
bst_find(container, name)
end=time.perf_counter()
elapsed = end - start
return elapsed
names=[record[0] for record in records_shuffled]
random_names=random.sample(names, 100)
missing_names=[f"None_{i}" for i in range(10)]
names_for_test=random_names+missing_names
print("Результаты задания Б")
for i in range(3):
for j in range(5):
result_shuffled = task_B(structures_name[i], container_shuffled[i], names_for_test)
results.append([structures_name[i], mode_of_data[0], experiment_name[1], result_shuffled])
result_sorted=task_B(structures_name[i], container_sorted[i], names_for_test)
results.append([structures_name[i], mode_of_data[1], experiment_name[1], result_sorted])
print(f"{structures_name[i]}: Время выполнения для 110 записей для {mode_of_data[0]}: {result_shuffled} {mode_of_data[1]}: {result_sorted} ")
#В. Удаление 50 случайных чисел
def task_C(structure_name,container, data):
start=time.perf_counter()
if structure_name=="LinkedList":
for name in data:
container=ll_delete(container, name)
elif structure_name=="HashTable":
for name in data:
ht_delete(container, name)
elif structure_name=="BinarySearchTree":
for name in data:
container = bst_delete(container, name)
end=time.perf_counter()
elapsed = end - start
return elapsed
names_to_delete=random.sample(names,50)
print("Результаты задания В")
for i in range(3):
for j in range(5):
shuffled=container_shuffled[i]
sorted=container_sorted[i]
result_shuffled=task_C(structures_name[i], shuffled, names_to_delete)
results.append([structures_name[i], mode_of_data[0], experiment_name[2], result_shuffled])
result_sorted = task_C(structures_name[i], sorted, names_to_delete)
results.append([structures_name[i], mode_of_data[1], experiment_name[2], result_sorted])
print(f"{structures_name[i]}: Время удаления 50 записей для {mode_of_data[0]}: {result_shuffled} {mode_of_data[1]}: {result_sorted}")
#4. Сохранение результатов
csv_file=r"C:\Users\Андрей\Desktop\2026-rff_mp\YanyaevAA\docs\data\results.csv"
with open(r"C:\Users\Андрей\Desktop\2026-rff_mp\YanyaevAA\docs\data\results.csv", "w", newline="",encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(results)
#Построение графиков
df = pd.read_csv(csv_file)
df_avg = df.groupby(["Структура", "Режим", "Операция"])["Время (сек)"].mean().reset_index()
fig, axes = plt.subplots(1, 3, figsize=(18, 6))
for i, experiment in enumerate(experiment_name):
data_experiment = df_avg[df_avg["Операция"] == experiment]
sns.barplot(ax=axes[i],data=data_experiment, x="Структура",y="Время (сек)",hue="Режим")
axes[i].set_title(experiment)
axes[i].set_ylabel("Среднее время (сек)")
axes[i].set_yscale("log")
plt.tight_layout()
plt.savefig(r"C:\Users\Андрей\Desktop\2026-rff_mp\YanyaevAA\docs\data\graphics.png", dpi=300, bbox_inches='tight')
plt.show()