add experiment and plots

This commit is contained in:
kirill 2026-04-20 18:41:33 +03:00
parent da3aad1c55
commit d232cc536d
8 changed files with 275 additions and 0 deletions

View File

@ -0,0 +1,101 @@
import random
import time
import csv
import sys
sys.setrecursionlimit(20000)
from codes.LL import ll_insert, ll_find, ll_delete
from codes.HT import ht_insert, ht_delete, ht_find
from codes.BST import bst_delete, bst_find, bst_insert
# Экспериментальная часть
def generate_records(N):
records =[]
for i in range(N):
name = f"User_{i:05d}"
phone =str(random.randint(100000,999999))
records.append((name,phone))
return records
def run_test(structure_name, mode, input_data, search_names, delete_names):
print(f"Тест {structure_name} в режиме {mode}")
ins_times = []
find_times = []
del_times = []
for _ in range(5):
if structure_name == "LL":
container = None
elif structure_name == "BST":
container = None
elif structure_name == "HT":
container = [None]*150
#А
start = time.perf_counter()
for name, phone in input_data:
if structure_name == "LL":
container = ll_insert(container, name, phone)
elif structure_name == "BST":
container = bst_insert(container, name, phone)
elif structure_name == "HT":
ht_insert(container, name, phone)
ins_times.append(time.perf_counter() - start)
start = time.perf_counter()
for name in search_names:
if structure_name == "LL": ll_find(container, name)
elif structure_name == "BST": bst_find(container, name)
else: ht_find(container, name)
find_times.append(time.perf_counter() - start)
#В
start = time.perf_counter()
for name in delete_names:
if structure_name == "LL": container = ll_delete(container, name)
elif structure_name == "BST": container = bst_delete(container, name)
else: ht_delete(container, name)
del_times.append(time.perf_counter() - start)
results = []
for i in range(5):
results.append([structure_name, mode, f"Вставка (попытка {i+1})", ins_times[i]])
results.append([structure_name, mode, "Вставка СРЕДНЕЕ", sum(ins_times) / 5])
for i in range(5):
results.append([structure_name, mode, f"Поиск (попытка {i+1})", find_times[i]])
results.append([structure_name, mode, "Поиск СРЕДНЕЕ", sum(find_times) / 5])
for i in range(5):
results.append([structure_name, mode, f"Удаление (попытка {i+1})", del_times[i]])
results.append([structure_name, mode, "Удаление СРЕДНЕЕ", sum(del_times) / 5])
return results
def main_experiment():
N = 10000
data = generate_records(N)
random.shuffle(data)
data_sort = sorted(data, key = lambda x: x[0])
search_names = [r[0] for r in random.sample(data, 100)] + [f"None_{i}" for i in range(10)]
delete_names = [r[0] for r in random.sample(data, 50)]
results = [["Structure", "Mode", "Operation", "Time"]]
for mode_name, mode_data in [("shufled", data), ("sorted", data_sort)]:
results += run_test("LL", mode_name, mode_data, search_names, delete_names)
results += run_test("BST", mode_name, mode_data, search_names, delete_names)
results += run_test("HT", mode_name, mode_data, search_names, delete_names)
with open("results.csv", "w", newline = "") as f:
writer = csv.writer(f)
writer.writerows(results)
print("Результаты сохранены в файл")
if __name__ == "__main__":
main_experiment()

View File

@ -0,0 +1,59 @@
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Графики
def plot_all(df: pd.DataFrame):
structures = ["BST", "HT", "LL"]
operations = ["Вставка", "Поиск", "Удаление"]
op_keys = ["Вставка СРЕДНЕЕ", "Поиск СРЕДНЕЕ", "Удаление СРЕДНЕЕ"]
filenames = ["./insert_plot.png", "./search_plot.png", "./delete_plot.png"]
avg = df[df["Operation"].isin(op_keys)]
data = {
(row.Structure, row.Mode, row.Operation): row.Time
for row in avg.itertuples(index=False)
}
x = np.arange(len(structures))
width = 0.35
for op_label, op_key, filename in zip(operations, op_keys, filenames):
fig, ax = plt.subplots(figsize=(8, 5))
times_shuffled = [data.get((s, "shufled", op_key), float('nan')) for s in structures]
times_sorted = [data.get((s, "sorted", op_key), 0) for s in structures]
bars1 = ax.bar(x - width/2, times_shuffled, width, label="Случайный", color="steelblue")
bars2 = ax.bar(x + width/2, times_sorted, width, label="Отсортированный", color="red")
for bar in bars1:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width() / 2, height,
f"{height:.6f}", ha="center", va="bottom", fontsize=8)
for bar in bars2:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width() / 2, height,
f"{height:.6f}", ha="center", va="bottom", fontsize=8)
ax.set_yscale("log")
ax.set_title(op_label)
ax.set_ylabel("Время (сек)")
ax.set_xticks(x)
ax.set_xticklabels(structures)
ax.legend()
ax.grid(axis="y", linestyle="--", alpha=0.7)
plt.tight_layout()
plt.savefig(filename)
print(f"График сохранён: {filename}")
def main_plot():
results = pd.read_csv("./results.csv")
plot_all(results)
if __name__ == "__main__":
main_plot()

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,6 @@
from codes.plot import main_plot
from codes.experiment import main_experiment
if __name__ == "__main__":
main_experiment()
main_plot()

View File

@ -0,0 +1,109 @@
Structure,Mode,Operation,Time
LL,shufled,Вставка (попытка 1),2.4339829910004482
LL,shufled,Вставка (попытка 2),2.4039403810002113
LL,shufled,Вставка (попытка 3),2.458547864999673
LL,shufled,Вставка (попытка 4),2.413923469999645
LL,shufled,Вставка (попытка 5),2.4440171969999938
LL,shufled,Вставка СРЕДНЕЕ,2.430882380799994
LL,shufled,Поиск (попытка 1),0.031343970999841986
LL,shufled,Поиск (попытка 2),0.03304426499926194
LL,shufled,Поиск (попытка 3),0.03239262500028417
LL,shufled,Поиск (попытка 4),0.03132577799988212
LL,shufled,Поиск (попытка 5),0.03151892799996858
LL,shufled,Поиск СРЕДНЕЕ,0.03192511339984776
LL,shufled,Удаление (попытка 1),0.01929760500024713
LL,shufled,Удаление (попытка 2),0.019222485999307537
LL,shufled,Удаление (попытка 3),0.019446178000180225
LL,shufled,Удаление (попытка 4),0.019156967000526492
LL,shufled,Удаление (попытка 5),0.019182482000360324
LL,shufled,Удаление СРЕДНЕЕ,0.01926114360012434
BST,shufled,Вставка (попытка 1),0.02289151100012532
BST,shufled,Вставка (попытка 2),0.0229584500002602
BST,shufled,Вставка (попытка 3),0.02520326100056991
BST,shufled,Вставка (попытка 4),0.03390770399983012
BST,shufled,Вставка (попытка 5),0.022019966999323515
BST,shufled,Вставка СРЕДНЕЕ,0.025396178600021812
BST,shufled,Поиск (попытка 1),0.000189066000530147
BST,shufled,Поиск (попытка 2),0.00023037999926600605
BST,shufled,Поиск (попытка 3),0.00018933499995910097
BST,shufled,Поиск (попытка 4),0.0001907400001073256
BST,shufled,Поиск (попытка 5),0.00024124399988068035
BST,shufled,Поиск СРЕДНЕЕ,0.000208152999948652
BST,shufled,Удаление (попытка 1),0.00011542900028871372
BST,shufled,Удаление (попытка 2),0.0001963419999810867
BST,shufled,Удаление (попытка 3),0.00011738299963326426
BST,shufled,Удаление (попытка 4),0.00011437200009822845
BST,shufled,Удаление (попытка 5),0.00015602500025124755
BST,shufled,Удаление СРЕДНЕЕ,0.00013991020005050815
HT,shufled,Вставка (попытка 1),0.0291972099994382
HT,shufled,Вставка (попытка 2),0.02882972299994435
HT,shufled,Вставка (попытка 3),0.028241992999937793
HT,shufled,Вставка (попытка 4),0.02896075100034068
HT,shufled,Вставка (попытка 5),0.029606111000248347
HT,shufled,Вставка СРЕДНЕЕ,0.028967157599981874
HT,shufled,Поиск (попытка 1),0.0014172729997881106
HT,shufled,Поиск (попытка 2),0.0003571010001905961
HT,shufled,Поиск (попытка 3),0.0004458979992705281
HT,shufled,Поиск (попытка 4),0.0005671679991792189
HT,shufled,Поиск (попытка 5),0.0004517190000115079
HT,shufled,Поиск СРЕДНЕЕ,0.0006478317996879923
HT,shufled,Удаление (попытка 1),0.000430808000601246
HT,shufled,Удаление (попытка 2),0.000223173999984283
HT,shufled,Удаление (попытка 3),0.0001869629995780997
HT,shufled,Удаление (попытка 4),0.00021918600032222457
HT,shufled,Удаление (попытка 5),0.00026948999948217534
HT,shufled,Удаление СРЕДНЕЕ,0.0002659241999936057
LL,sorted,Вставка (попытка 1),2.546284423999168
LL,sorted,Вставка (попытка 2),2.527255480000349
LL,sorted,Вставка (попытка 3),2.4814426879993334
LL,sorted,Вставка (попытка 4),2.501784361999853
LL,sorted,Вставка (попытка 5),2.480424575000143
LL,sorted,Вставка СРЕДНЕЕ,2.507438305799769
LL,sorted,Поиск (попытка 1),0.030172253000273486
LL,sorted,Поиск (попытка 2),0.030333151999911934
LL,sorted,Поиск (попытка 3),0.030028871000467916
LL,sorted,Поиск (попытка 4),0.032277871000587766
LL,sorted,Поиск (попытка 5),0.030364938999809965
LL,sorted,Поиск СРЕДНЕЕ,0.030635417200210215
LL,sorted,Удаление (попытка 1),0.02085002199964947
LL,sorted,Удаление (попытка 2),0.021086609999656503
LL,sorted,Удаление (попытка 3),0.02087502099948324
LL,sorted,Удаление (попытка 4),0.021417887000097835
LL,sorted,Удаление (попытка 5),0.020822566000788356
LL,sorted,Удаление СРЕДНЕЕ,0.02101042119993508
BST,sorted,Вставка (попытка 1),11.841748112999994
BST,sorted,Вставка (попытка 2),11.75695861999975
BST,sorted,Вставка (попытка 3),11.649890955999581
BST,sorted,Вставка (попытка 4),11.535229737999543
BST,sorted,Вставка (попытка 5),11.569677194999713
BST,sorted,Вставка СРЕДНЕЕ,11.670700924399716
BST,sorted,Поиск (попытка 1),0.08916782800042711
BST,sorted,Поиск (попытка 2),0.09862517000055959
BST,sorted,Поиск (попытка 3),0.08865728399996442
BST,sorted,Поиск (попытка 4),0.08748506499978248
BST,sorted,Поиск (попытка 5),0.08942283200030943
BST,sorted,Поиск СРЕДНЕЕ,0.09067163580020861
BST,sorted,Удаление (попытка 1),0.046499003000462835
BST,sorted,Удаление (попытка 2),0.04566383200017299
BST,sorted,Удаление (попытка 3),0.04534191499988083
BST,sorted,Удаление (попытка 4),0.04480698100087466
BST,sorted,Удаление (попытка 5),0.045543646000623994
BST,sorted,Удаление СРЕДНЕЕ,0.04557107540040306
HT,sorted,Вставка (попытка 1),0.03348540300066816
HT,sorted,Вставка (попытка 2),0.03959386299993639
HT,sorted,Вставка (попытка 3),0.026414189000206534
HT,sorted,Вставка (попытка 4),0.028397822999977507
HT,sorted,Вставка (попытка 5),0.0283703630002492
HT,sorted,Вставка СРЕДНЕЕ,0.031252328200207555
HT,sorted,Поиск (попытка 1),0.00092922399926465
HT,sorted,Поиск (попытка 2),0.0005907800004933961
HT,sorted,Поиск (попытка 3),0.00031636099993193056
HT,sorted,Поиск (попытка 4),0.00034901999970315956
HT,sorted,Поиск (попытка 5),0.0003578830001060851
HT,sorted,Поиск СРЕДНЕЕ,0.0005086535998998443
HT,sorted,Удаление (попытка 1),0.0003968310002164799
HT,sorted,Удаление (попытка 2),0.0009146930005954346
HT,sorted,Удаление (попытка 3),0.000194480000573094
HT,sorted,Удаление (попытка 4),0.00020164000034128549
HT,sorted,Удаление (попытка 5),0.00023484999928768957
HT,sorted,Удаление СРЕДНЕЕ,0.0003884988002027967
1 Structure Mode Operation Time
2 LL shufled Вставка (попытка 1) 2.4339829910004482
3 LL shufled Вставка (попытка 2) 2.4039403810002113
4 LL shufled Вставка (попытка 3) 2.458547864999673
5 LL shufled Вставка (попытка 4) 2.413923469999645
6 LL shufled Вставка (попытка 5) 2.4440171969999938
7 LL shufled Вставка СРЕДНЕЕ 2.430882380799994
8 LL shufled Поиск (попытка 1) 0.031343970999841986
9 LL shufled Поиск (попытка 2) 0.03304426499926194
10 LL shufled Поиск (попытка 3) 0.03239262500028417
11 LL shufled Поиск (попытка 4) 0.03132577799988212
12 LL shufled Поиск (попытка 5) 0.03151892799996858
13 LL shufled Поиск СРЕДНЕЕ 0.03192511339984776
14 LL shufled Удаление (попытка 1) 0.01929760500024713
15 LL shufled Удаление (попытка 2) 0.019222485999307537
16 LL shufled Удаление (попытка 3) 0.019446178000180225
17 LL shufled Удаление (попытка 4) 0.019156967000526492
18 LL shufled Удаление (попытка 5) 0.019182482000360324
19 LL shufled Удаление СРЕДНЕЕ 0.01926114360012434
20 BST shufled Вставка (попытка 1) 0.02289151100012532
21 BST shufled Вставка (попытка 2) 0.0229584500002602
22 BST shufled Вставка (попытка 3) 0.02520326100056991
23 BST shufled Вставка (попытка 4) 0.03390770399983012
24 BST shufled Вставка (попытка 5) 0.022019966999323515
25 BST shufled Вставка СРЕДНЕЕ 0.025396178600021812
26 BST shufled Поиск (попытка 1) 0.000189066000530147
27 BST shufled Поиск (попытка 2) 0.00023037999926600605
28 BST shufled Поиск (попытка 3) 0.00018933499995910097
29 BST shufled Поиск (попытка 4) 0.0001907400001073256
30 BST shufled Поиск (попытка 5) 0.00024124399988068035
31 BST shufled Поиск СРЕДНЕЕ 0.000208152999948652
32 BST shufled Удаление (попытка 1) 0.00011542900028871372
33 BST shufled Удаление (попытка 2) 0.0001963419999810867
34 BST shufled Удаление (попытка 3) 0.00011738299963326426
35 BST shufled Удаление (попытка 4) 0.00011437200009822845
36 BST shufled Удаление (попытка 5) 0.00015602500025124755
37 BST shufled Удаление СРЕДНЕЕ 0.00013991020005050815
38 HT shufled Вставка (попытка 1) 0.0291972099994382
39 HT shufled Вставка (попытка 2) 0.02882972299994435
40 HT shufled Вставка (попытка 3) 0.028241992999937793
41 HT shufled Вставка (попытка 4) 0.02896075100034068
42 HT shufled Вставка (попытка 5) 0.029606111000248347
43 HT shufled Вставка СРЕДНЕЕ 0.028967157599981874
44 HT shufled Поиск (попытка 1) 0.0014172729997881106
45 HT shufled Поиск (попытка 2) 0.0003571010001905961
46 HT shufled Поиск (попытка 3) 0.0004458979992705281
47 HT shufled Поиск (попытка 4) 0.0005671679991792189
48 HT shufled Поиск (попытка 5) 0.0004517190000115079
49 HT shufled Поиск СРЕДНЕЕ 0.0006478317996879923
50 HT shufled Удаление (попытка 1) 0.000430808000601246
51 HT shufled Удаление (попытка 2) 0.000223173999984283
52 HT shufled Удаление (попытка 3) 0.0001869629995780997
53 HT shufled Удаление (попытка 4) 0.00021918600032222457
54 HT shufled Удаление (попытка 5) 0.00026948999948217534
55 HT shufled Удаление СРЕДНЕЕ 0.0002659241999936057
56 LL sorted Вставка (попытка 1) 2.546284423999168
57 LL sorted Вставка (попытка 2) 2.527255480000349
58 LL sorted Вставка (попытка 3) 2.4814426879993334
59 LL sorted Вставка (попытка 4) 2.501784361999853
60 LL sorted Вставка (попытка 5) 2.480424575000143
61 LL sorted Вставка СРЕДНЕЕ 2.507438305799769
62 LL sorted Поиск (попытка 1) 0.030172253000273486
63 LL sorted Поиск (попытка 2) 0.030333151999911934
64 LL sorted Поиск (попытка 3) 0.030028871000467916
65 LL sorted Поиск (попытка 4) 0.032277871000587766
66 LL sorted Поиск (попытка 5) 0.030364938999809965
67 LL sorted Поиск СРЕДНЕЕ 0.030635417200210215
68 LL sorted Удаление (попытка 1) 0.02085002199964947
69 LL sorted Удаление (попытка 2) 0.021086609999656503
70 LL sorted Удаление (попытка 3) 0.02087502099948324
71 LL sorted Удаление (попытка 4) 0.021417887000097835
72 LL sorted Удаление (попытка 5) 0.020822566000788356
73 LL sorted Удаление СРЕДНЕЕ 0.02101042119993508
74 BST sorted Вставка (попытка 1) 11.841748112999994
75 BST sorted Вставка (попытка 2) 11.75695861999975
76 BST sorted Вставка (попытка 3) 11.649890955999581
77 BST sorted Вставка (попытка 4) 11.535229737999543
78 BST sorted Вставка (попытка 5) 11.569677194999713
79 BST sorted Вставка СРЕДНЕЕ 11.670700924399716
80 BST sorted Поиск (попытка 1) 0.08916782800042711
81 BST sorted Поиск (попытка 2) 0.09862517000055959
82 BST sorted Поиск (попытка 3) 0.08865728399996442
83 BST sorted Поиск (попытка 4) 0.08748506499978248
84 BST sorted Поиск (попытка 5) 0.08942283200030943
85 BST sorted Поиск СРЕДНЕЕ 0.09067163580020861
86 BST sorted Удаление (попытка 1) 0.046499003000462835
87 BST sorted Удаление (попытка 2) 0.04566383200017299
88 BST sorted Удаление (попытка 3) 0.04534191499988083
89 BST sorted Удаление (попытка 4) 0.04480698100087466
90 BST sorted Удаление (попытка 5) 0.045543646000623994
91 BST sorted Удаление СРЕДНЕЕ 0.04557107540040306
92 HT sorted Вставка (попытка 1) 0.03348540300066816
93 HT sorted Вставка (попытка 2) 0.03959386299993639
94 HT sorted Вставка (попытка 3) 0.026414189000206534
95 HT sorted Вставка (попытка 4) 0.028397822999977507
96 HT sorted Вставка (попытка 5) 0.0283703630002492
97 HT sorted Вставка СРЕДНЕЕ 0.031252328200207555
98 HT sorted Поиск (попытка 1) 0.00092922399926465
99 HT sorted Поиск (попытка 2) 0.0005907800004933961
100 HT sorted Поиск (попытка 3) 0.00031636099993193056
101 HT sorted Поиск (попытка 4) 0.00034901999970315956
102 HT sorted Поиск (попытка 5) 0.0003578830001060851
103 HT sorted Поиск СРЕДНЕЕ 0.0005086535998998443
104 HT sorted Удаление (попытка 1) 0.0003968310002164799
105 HT sorted Удаление (попытка 2) 0.0009146930005954346
106 HT sorted Удаление (попытка 3) 0.000194480000573094
107 HT sorted Удаление (попытка 4) 0.00020164000034128549
108 HT sorted Удаление (попытка 5) 0.00023484999928768957
109 HT sorted Удаление СРЕДНЕЕ 0.0003884988002027967

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB