develop #1

Open
FirsovAV wants to merge 1311 commits from UNN/2026-rff_mp:develop into develop
8 changed files with 405 additions and 0 deletions
Showing only changes of commit 0b2b19a2ca - Show all commits

View File

After

Width:  |  Height:  |  Size: 46 KiB

View File

After

Width:  |  Height:  |  Size: 46 KiB

View File

After

Width:  |  Height:  |  Size: 46 KiB

View File

1 Структура Режим Операция Замер Время (сек)
2 LinkedList случайный вставка 1 0.002888800110667944
3 LinkedList случайный вставка 2 0.0021659000776708126
4 LinkedList случайный вставка 3 0.0017211001832038164
5 LinkedList случайный вставка 4 0.0030869999900460243
6 LinkedList случайный вставка 5 0.001962300157174468
7 LinkedList случайный вставка среднее 0.002365020103752613
8 LinkedList случайный поиск 1 2.210005186498165e-05
9 LinkedList случайный поиск 2 2.5300076231360435e-05
10 LinkedList случайный поиск 3 7.3998235166072845e-06
11 LinkedList случайный поиск 4 6.360001862049103e-05
12 LinkedList случайный поиск 5 1.1400086805224419e-05
13 LinkedList случайный поиск среднее 2.5960011407732962e-05
14 LinkedList случайный удаление 1 3.4999102354049683e-06
15 LinkedList случайный удаление 2 3.600027412176132e-06
16 LinkedList случайный удаление 3 3.8000289350748062e-06
17 LinkedList случайный удаление 4 3.700144588947296e-06
18 LinkedList случайный удаление 5 1.2399861589074135e-05
19 LinkedList случайный удаление среднее 5.399994552135467e-06
20 HashTable случайный вставка 1 0.012187300017103553
21 HashTable случайный вставка 2 0.013890399830415845
22 HashTable случайный вставка 3 0.016815599985420704
23 HashTable случайный вставка 4 0.015115999849513173
24 HashTable случайный вставка 5 0.016828800085932016
25 HashTable случайный вставка среднее 0.014967619953677059
26 HashTable случайный поиск 1 0.00015189987607300282
27 HashTable случайный поиск 2 0.00014359992928802967
28 HashTable случайный поиск 3 0.0001275001559406519
29 HashTable случайный поиск 4 0.00013029994443058968
30 HashTable случайный поиск 5 0.00012869993224740028
31 HashTable случайный поиск среднее 0.00013639996759593487
32 HashTable случайный удаление 1 6.400002166628838e-05
33 HashTable случайный удаление 2 6.669992581009865e-05
34 HashTable случайный удаление 3 6.220000796020031e-05
35 HashTable случайный удаление 4 6.079999729990959e-05
36 HashTable случайный удаление 5 6.149988621473312e-05
37 HashTable случайный удаление среднее 6.3039967790246e-05
38 BST случайный вставка 1 0.02116320002824068
39 BST случайный вставка 2 0.030665799975395203
40 BST случайный вставка 3 0.03345289989374578
41 BST случайный вставка 4 0.024382099974900484
42 BST случайный вставка 5 0.023698499891906977
43 BST случайный вставка среднее 0.026672499952837825
44 BST случайный поиск 1 0.000593199860304594
45 BST случайный поиск 2 0.0002499001566320658
46 BST случайный поиск 3 0.00023610005155205727
47 BST случайный поиск 4 0.0002258999738842249
48 BST случайный поиск 5 0.00021369988098740578
49 BST случайный поиск среднее 0.00030375998467206954
50 BST случайный удаление 1 0.00013720011338591576
51 BST случайный удаление 2 0.00014800019562244415
52 BST случайный удаление 3 0.00013739988207817078
53 BST случайный удаление 4 0.00011579995043575764
54 BST случайный удаление 5 0.000120899872854352
55 BST случайный удаление среднее 0.00013186000287532807
56 LinkedList отсортированный вставка 1 0.001382600050419569
57 LinkedList отсортированный вставка 2 0.001325399847701192
58 LinkedList отсортированный вставка 3 0.0017267998773604631
59 LinkedList отсортированный вставка 4 0.0014553999062627554
60 LinkedList отсортированный вставка 5 0.0015736999921500683
61 LinkedList отсортированный вставка среднее 0.0014927799347788095
62 LinkedList отсортированный поиск 1 6.700167432427406e-06
63 LinkedList отсортированный поиск 2 4.440010525286198e-05
64 LinkedList отсортированный поиск 3 1.71000137925148e-05
65 LinkedList отсортированный поиск 4 1.2999866157770157e-05
66 LinkedList отсортированный поиск 5 1.309998333454132e-05
67 LinkedList отсортированный поиск среднее 1.886002719402313e-05
68 LinkedList отсортированный удаление 1 3.400025889277458e-06
69 LinkedList отсортированный удаление 2 8.100178092718124e-06
70 LinkedList отсортированный удаление 3 6.5998174250125885e-06
71 LinkedList отсортированный удаление 4 7.0999376475811005e-06
72 LinkedList отсортированный удаление 5 4.400033503770828e-06
73 LinkedList отсортированный удаление среднее 5.91999851167202e-06
74 HashTable отсортированный вставка 1 0.011284200008958578
75 HashTable отсортированный вставка 2 0.010727699846029282
76 HashTable отсортированный вставка 3 0.01438950002193451
77 HashTable отсортированный вставка 4 0.01296229986473918
78 HashTable отсортированный вставка 5 0.01131929992698133
79 HashTable отсортированный вставка среднее 0.012136599933728575
80 HashTable отсортированный поиск 1 0.0003611000720411539
81 HashTable отсортированный поиск 2 0.0001191999763250351
82 HashTable отсортированный поиск 3 9.760004468262196e-05
83 HashTable отсортированный поиск 4 9.760004468262196e-05
84 HashTable отсортированный поиск 5 9.860005229711533e-05
85 HashTable отсортированный поиск среднее 0.00015482003800570965
86 HashTable отсортированный удаление 1 4.630000330507755e-05
87 HashTable отсортированный удаление 2 7.409998215734959e-05
88 HashTable отсортированный удаление 3 5.159992724657059e-05
89 HashTable отсортированный удаление 4 4.519987851381302e-05
90 HashTable отсортированный удаление 5 4.630000330507755e-05
91 HashTable отсортированный удаление среднее 5.269995890557766e-05
92 BST отсортированный вставка 1 5.333359000040218
93 BST отсортированный вставка 2 6.843581699999049
94 BST отсортированный вставка 3 7.348331299843267
95 BST отсортированный вставка 4 6.589022800093517
96 BST отсортированный вставка 5 6.936362499836832
97 BST отсортированный вставка среднее 6.6101314599625765
98 BST отсортированный поиск 1 0.03562769992277026
99 BST отсортированный поиск 2 0.058094599982723594
100 BST отсортированный поиск 3 0.05625390005297959
101 BST отсортированный поиск 4 0.0391436000354588
102 BST отсортированный поиск 5 0.05448610009625554
103 BST отсортированный поиск среднее 0.04872118001803756
104 BST отсортированный удаление 1 0.024612600216642022
105 BST отсортированный удаление 2 0.017923400038853288
106 BST отсортированный удаление 3 0.021369999973103404
107 BST отсортированный удаление 4 0.025744799990206957
108 BST отсортированный удаление 5 0.03334249998442829
109 BST отсортированный удаление среднее 0.024598660040646793

View File

@ -0,0 +1,282 @@
import random
import time
import csv
import os
from lab1.phonebook import *
def generate_test_data(n=10000):
records = [(f"User_{i:05d}", f"+7-999-{i:07d}") for i in range(n)]
records_shuffled = records.copy()
random.shuffle(records_shuffled)
records_sorted = sorted(records, key=lambda x: x[0])
return records_shuffled, records_sorted
def get_random_names(records, n=100):
return[name for name, _ in random.sample(records, min(n, len(records)))]
def run_linked_experiments(records, mode_name):
print(f"\n связный список ({mode_name}):")
print("вставка 10000 записей:")
insert_times = []
for run in range(5):
start = time.perf_counter()
head = None
for name, phone in records:
head = ll_insert(head, name, phone)
end = time.perf_counter()
insert_times.append(end - start)
print(f"Вставка {run+1}/5: {insert_times[-1]:.6f} сек")
avg_insert = sum(insert_times) / 5
print(f"среднее: {avg_insert:.6f} сек")
print("поиск 110 записей:")
exist_names = get_random_names(records, 100)
non_exist_names = [f"None_{i}" for i in range(10)]
find_times = []
for run in range(5):
start = time.perf_counter()
for name in exist_names:
ll_find(head, name)
for name in non_exist_names:
ll_find(head, name)
end = time.perf_counter()
find_times.append(end - start)
print(f"поиск {run+1}/5: {find_times[-1]:.6f} сек")
avg_find = sum(find_times) / 5
print(f"среднее: {avg_find:.6f} сек")
print("удаление 50 случайных записей:")
to_delete = get_random_names(records,50)
delete_times = []
for run in range(5):
current_head = head
start = time.perf_counter()
for name in to_delete:
current_head = ll_delete(current_head, name)
end = time.perf_counter()
delete_times.append(end - start)
print(f"удаление {run+1}/5: {delete_times[-1]:.6f} сек")
avg_delete = sum(delete_times) / 5
print(f"среднее: {avg_delete:.6f} сек")
return{
'structure': 'LinkedList',
'mode': mode_name,
'insert_avg': avg_insert,
'insert_all': insert_times,
'find_avg': avg_find,
'find_all': find_times,
'delete_avg': avg_delete,
'delete_all': delete_times
}
def run_hash_experiments(records, mode_name):
print(f"\n хеш-таблица({mode_name})")
print("вставка 10000 записей:")
insert_times = []
for run in range(5):
start = time.perf_counter()
buckets = ht_create(1000)
for name, phone in records:
buckets = ht_insert(buckets, name, phone)
end = time.perf_counter()
insert_times.append(end - start)
print(f"Вставка {run+1}/5: {insert_times[-1]:.6f} сек")
avg_insert = sum(insert_times) / 5
print(f"среднее: {avg_insert:.6f} сек")
print("поиск 110 записей:")
exist_names = get_random_names(records, 100)
non_exist_names = [f"None_{i}" for i in range(10)]
find_times = []
for run in range(5):
start = time.perf_counter()
for name in exist_names:
ht_find(buckets, name)
for name in non_exist_names:
ht_find(buckets, name)
end = time.perf_counter()
find_times.append(end - start)
print(f"поиск {run+1}/5: {find_times[-1]:.6f} сек")
avg_find = sum(find_times) / 5
print(f"среднее: {avg_find:.6f} сек")
print("удаление 50 случайных записей:")
to_delete = get_random_names(records,50)
delete_times = []
for run in range(5):
current_buckets = buckets.copy()
start = time.perf_counter()
for name in to_delete:
current_buckets = ht_delete(current_buckets, name)
end = time.perf_counter()
delete_times.append(end - start)
print(f"удаление {run+1}/5: {delete_times[-1]:.6f} сек")
avg_delete = sum(delete_times) / 5
print(f"среднее: {avg_delete:.6f} сек")
return{
'structure': 'HashTable',
'mode': mode_name,
'insert_avg': avg_insert,
'insert_all': insert_times,
'find_avg': avg_find,
'find_all': find_times,
'delete_avg': avg_delete,
'delete_all': delete_times
}
def run_bst_experiments(records, mode_name):
print(f"\n двоичное дерево({mode_name})")
print("вставка 10000 записей:")
insert_times = []
for run in range(5):
start = time.perf_counter()
root = None
for name, phone in records:
root = bst_insert(root, name, phone)
end = time.perf_counter()
insert_times.append(end - start)
print(f"Вставка {run+1}/5: {insert_times[-1]:.6f} сек")
avg_insert = sum(insert_times) / 5
print(f"среднее: {avg_insert:.6f} сек")
print("поиск 110 записей:")
exist_names = get_random_names(records, 100)
non_exist_names = [f"None_{i}" for i in range(10)]
find_times = []
for run in range(5):
start = time.perf_counter()
for name in exist_names:
bst_find(root, name)
for name in non_exist_names:
bst_find(root, name)
end = time.perf_counter()
find_times.append(end - start)
print(f"поиск {run+1}/5: {find_times[-1]:.6f} сек")
avg_find = sum(find_times) / 5
print(f"среднее: {avg_find:.6f} сек")
print("удаление 50 случайных записей:")
to_delete = get_random_names(records,50)
delete_times = []
for run in range(5):
current_root = root
start = time.perf_counter()
for name in to_delete:
current_root = bst_delete(current_root, name)
end = time.perf_counter()
delete_times.append(end - start)
print(f"удаление {run+1}/5: {delete_times[-1]:.6f} сек")
avg_delete = sum(delete_times) / 5
print(f"среднее: {avg_delete:.6f} сек")
return{
'structure': 'BST',
'mode': mode_name,
'insert_avg': avg_insert,
'insert_all': insert_times,
'find_avg': avg_find,
'find_all': find_times,
'delete_avg': avg_delete,
'delete_all': delete_times
}
def save_results_to_csv(all_results):
os.makedirs("docs/data", exist_ok=True)
with open("docs/data/results.csv", "w", encoding="utf-8") as f:
f.write("Структура, Режим, Операция, Замер, Время (сек)\n")
for res in all_results:
struct = res['structure']
mode = res['mode']
for i, t in enumerate(res['insert_all']):
f.write(f"{struct},{mode},вставка,{i+1},{t}\n")
f.write(f"{struct},{mode},вставка,среднее,{res['insert_avg']}\n")
for i, t in enumerate(res['find_all']):
f.write(f"{struct},{mode},поиск,{i+1},{t}\n")
f.write(f"{struct},{mode},поиск,среднее,{res['find_avg']}\n")
for i, t in enumerate(res['delete_all']):
f.write(f"{struct},{mode},удаление,{i+1},{t}\n")
f.write(f"{struct},{mode},удаление,среднее,{res['delete_avg']}\n")
def main():
print("эксперименты по замеру производительности")
records_shuffled, records_sorted = generate_test_data(10000)
all_results = []
print("режим: случайный порядок")
all_results.append(run_linked_experiments(records_shuffled, "случайный"))
all_results.append(run_hash_experiments(records_shuffled, "случайный"))
all_results.append(run_bst_experiments(records_shuffled, "случайный"))
print("режим: отсортированный порядок")
all_results.append(run_linked_experiments(records_sorted, "отсортированный"))
all_results.append(run_hash_experiments(records_sorted, "отсортированный"))
all_results.append(run_bst_experiments(records_sorted, "отсортированный"))
save_results_to_csv(all_results)
if __name__== "__main__":
main()

View File

@ -0,0 +1,123 @@
import matplotlib.pyplot as plt
import numpy as np
import os
os.makedirs('docs/data', exist_ok=True)
structures = ['LinkedList', 'HashTable', 'BST']
random_insert = [0.0037545, 0.015088, 0.026280]
sorted_insert = [0.0017544, 0.011369, 4.930788]
random_search = [0.00000962, 0.0001646, 0.0002592]
sorted_search = [0.00000858, 0.00014016, 0.047126]
random_delete = [0.0000079, 0.00009824, 0.00016984]
sorted_delete = [0.00000294, 0.00005878, 0.023013]
x = np.arange(len(structures))
width = 0.35
#график вставка
fig, ax = plt.subplots(figsize=(12, 7))
bars1 = ax.bar(x - width/2, random_insert, width, label='Случайный порядок', color='#3498db')
bars2 = ax.bar(x + width/2, sorted_insert, width, label='Отсортированный порядок', color='#e74c3c')
for bar in bars1:
height = bar.get_height()
ax.annotate(f'{height:.4f}', xy=(bar.get_x() + bar.get_width()/2, height),
xytext=(0, 3), textcoords="offset points", ha='center', va='bottom', fontsize=9)
for bar in bars2:
height = bar.get_height()
if height < 1:
ax.annotate(f'{height:.4f}', xy=(bar.get_x() + bar.get_width()/2, height),
xytext=(0, 3), textcoords="offset points", ha='center', va='bottom', fontsize=9)
else:
ax.annotate(f'{height:.1f} сек', xy=(bar.get_x() + bar.get_width()/2, height),
xytext=(0, 5), textcoords="offset points", ha='center', va='bottom', fontsize=10, fontweight='bold')
ax.set_ylabel('Время (сек)', fontsize=12)
ax.set_title('Время вставки 10000 записей', fontsize=14, fontweight='bold')
ax.set_xticks(x)
ax.set_xticklabels(structures, fontsize=11)
ax.legend(fontsize=11)
ax.set_yscale('log')
ax.grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.savefig('docs/data/graph_insert.png', dpi=150, bbox_inches='tight')
plt.close()
# график поиск
fig, ax = plt.subplots(figsize=(12, 7))
bars1 = ax.bar(x - width/2, random_search, width, label='Случайный порядок', color='#3498db')
bars2 = ax.bar(x + width/2, sorted_search, width, label='Отсортированный порядок', color='#e74c3c')
for bar in bars1:
height = bar.get_height()
ax.annotate(f'{height:.6f}', xy=(bar.get_x() + bar.get_width()/2, height),
xytext=(0, 3), textcoords="offset points", ha='center', va='bottom', fontsize=9)
for bar in bars2:
height = bar.get_height()
if height < 0.01:
ax.annotate(f'{height:.6f}', xy=(bar.get_x() + bar.get_width()/2, height),
xytext=(0, 3), textcoords="offset points", ha='center', va='bottom', fontsize=9)
else:
ax.annotate(f'{height:.4f}', xy=(bar.get_x() + bar.get_width()/2, height),
xytext=(0, 3), textcoords="offset points", ha='center', va='bottom', fontsize=9)
ax.set_ylabel('Время (сек)', fontsize=12)
ax.set_title('Время поиска 110 записей', fontsize=14, fontweight='bold')
ax.set_xticks(x)
ax.set_xticklabels(structures, fontsize=11)
ax.legend(fontsize=11)
ax.set_yscale('log')
ax.grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.savefig('docs/data/graph_search.png', dpi=150, bbox_inches='tight')
plt.close()
# график удаление
fig, ax = plt.subplots(figsize=(12, 7))
bars1 = ax.bar(x - width/2, random_delete, width, label='Случайный порядок', color='#3498db')
bars2 = ax.bar(x + width/2, sorted_delete, width, label='Отсортированный порядок', color='#e74c3c')
for bar in bars1:
height = bar.get_height()
ax.annotate(f'{height:.6f}', xy=(bar.get_x() + bar.get_width()/2, height),
xytext=(0, 3), textcoords="offset points", ha='center', va='bottom', fontsize=9)
for bar in bars2:
height = bar.get_height()
if height < 0.01:
ax.annotate(f'{height:.6f}', xy=(bar.get_x() + bar.get_width()/2, height),
xytext=(0, 3), textcoords="offset points", ha='center', va='bottom', fontsize=9)
else:
ax.annotate(f'{height:.4f}', xy=(bar.get_x() + bar.get_width()/2, height),
xytext=(0, 3), textcoords="offset points", ha='center', va='bottom', fontsize=9)
ax.set_ylabel('Время (сек)', fontsize=12)
ax.set_title('Время удаления 50 записей', fontsize=14, fontweight='bold')
ax.set_xticks(x)
ax.set_xticklabels(structures, fontsize=11)
ax.legend(fontsize=11)
ax.set_yscale('log')
ax.grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.savefig('docs/data/graph_delete.png', dpi=150, bbox_inches='tight')
plt.close()