добавлены: таблица, графики и финальная часть кода

This commit is contained in:
komissarovgo 2026-05-03 11:02:27 +03:00
parent a095930b97
commit e792b1ac2f
3 changed files with 220 additions and 1 deletions

View File

@ -1,7 +1,11 @@
import time
import random
import csv
import os
import matplotlib.pyplot as plt
import numpy as np
import sys
sys.setrecursionlimit(20000)
# 1. LinkedList
@ -295,4 +299,200 @@ def measure_deletion(structure_name, original_structure, delete_names):
end = time.perf_counter()
times.append(end - start)
return times
return times
# 3. Launch and save results
def run_experiment():
current_dir = os.path.dirname(__file__)
docs_dir = os.path.dirname(current_dir)
csv_file = os.path.join(docs_dir, "experiment_results.csv")
print("=" * 70)
print("ЭКСПЕРИМЕНТАЛЬНОЕ СРАВНЕНИЕ СТРУКТУР ДАННЫХ")
print("Телефонный справочник - 10000 записей")
print("=" * 70)
print(f"\n📁 Результаты будут сохранены в: {csv_file}")
print("\n1. Генерация тестовых данных...")
shuffled_records, sorted_records = generate_records(10000)
print(f" Сгенерировано 10000 записей")
existing_names = [shuffled_records[i][0] for i in random.sample(range(10000), 100)]
nonexisting_names = [f"NotExist_{i}" for i in range(10)]
search_names = existing_names + nonexisting_names
delete_names = [shuffled_records[i][0] for i in random.sample(range(10000), 50)]
results = [["Структура", "Режим", "Операция",
"Замер1(с)", "Замер2(с)", "Замер3(с)", "Замер4(с)", "Замер5(с)",
"Среднее(с)"]]
for mode_name, records in [("случайный", shuffled_records),
("отсортированный", sorted_records)]:
print(f"\n2. Тестирование режима: {mode_name}")
print("-" * 50)
for struct_name in ["linked_list", "hash_table", "bst"]:
print(f"\n {struct_name.upper()}:")
print(" Вставка 10000 записей...")
insert_times, filled_struct = measure_insertion(struct_name, records)
avg_insert = sum(insert_times) / 5
print(f" Время: {avg_insert:.4f} сек (среднее)")
print(" Поиск 110 записей...")
search_times = measure_search(struct_name, filled_struct, search_names)
avg_search = sum(search_times) / 5
print(f" Время: {avg_search:.4f} сек (среднее)")
print(" Удаление 50 записей...")
delete_times = measure_deletion(struct_name, filled_struct, delete_names)
avg_delete = sum(delete_times) / 5
print(f" Время: {avg_delete:.4f} сек (среднее)")
results.append([struct_name, mode_name, "вставка"] + insert_times + [avg_insert])
results.append([struct_name, mode_name, "поиск"] + search_times + [avg_search])
results.append([struct_name, mode_name, "удаление"] + delete_times + [avg_delete])
print("\n3. Сохранение результатов...")
with open(csv_file, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(results)
print(f" ✅ Результаты сохранены в: {csv_file}")
print("\n" + "=" * 70)
print("СВОДНАЯ ТАБЛИЦА РЕЗУЛЬТАТОВ")
print("=" * 70)
print(f"{'Структура':<15} {'Режим':<12} {'Операция':<10} {'Среднее время (сек)':<20}")
print("-" * 70)
for row in results[1:]:
struct, mode, op, t1, t2, t3, t4, t5, avg = row
print(f"{struct:<15} {mode:<12} {op:<10} {avg:<20.6f}")
return results, docs_dir
# 4. Graphics
def create_graphs(results, docs_dir):
print("\n4. Построение графиков...")
data = {}
for row in results[1:]:
struct = row[0]
mode = row[1]
op = row[2]
avg = row[8]
if struct not in data:
data[struct] = {}
if mode not in data[struct]:
data[struct][mode] = {}
data[struct][mode][op] = avg
struct_labels = {
'linked_list': 'LinkedList',
'hash_table': 'HashTable',
'bst': 'BST'
}
colors = {
'linked_list': '#3498db',
'hash_table': '#2ecc71',
'bst': '#e74c3c'
}
fig, axes = plt.subplots(1, 3, figsize=(15, 6))
fig.suptitle('Сравнение производительности структур данных', fontsize=16, fontweight='bold')
operations = ['вставка', 'поиск', 'удаление']
operation_titles = ['Вставка\n(10000 записей)', 'Поиск\n(110 запросов)', 'Удаление\n(50 записей)']
modes = ['случайный', 'отсортированный']
mode_labels = ['Случайный', 'Отсортированный']
for idx, (op, op_title) in enumerate(zip(operations, operation_titles)):
ax = axes[idx]
# Позиции для групп столбцов
x = np.arange(len(modes)) # [0, 1]
width = 0.25 # ширина одного столбца
multiplier = 0
for struct in ['linked_list', 'hash_table', 'bst']:
values = [data[struct][mode][op] for mode in modes]
offset = width * multiplier
bars = ax.bar(x + offset, values, width,
label=struct_labels[struct],
color=colors[struct],
edgecolor='black', linewidth=0.5)
for bar, val in zip(bars, values):
if val < 0.01:
ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + val*0.05,
f'{val:.5f}', ha='center', va='bottom', fontsize=8, rotation=0)
else:
ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + val*0.02,
f'{val:.4f}', ha='center', va='bottom', fontsize=8, rotation=0)
multiplier += 1
ax.set_title(op_title, fontsize=12, fontweight='bold')
ax.set_ylabel('Время (секунды)', fontsize=10)
ax.set_xlabel('Режим данных', fontsize=10)
ax.set_xticks(x + width)
ax.set_xticklabels(mode_labels)
ax.legend(loc='upper left', fontsize=8)
ax.grid(True, alpha=0.3, axis='y')
all_values = [data[s][m][op] for s in ['linked_list', 'hash_table', 'bst'] for m in modes]
if max(all_values) / min(all_values) > 100:
ax.set_yscale('log')
ax.set_ylabel('Время (секунды) - логарифмическая шкала', fontsize=9)
plt.tight_layout()
graph_path = os.path.join(docs_dir, "performance_graphs.png")
plt.savefig(graph_path, dpi=150, bbox_inches='tight')
plt.close()
print(f" ✅ Графики сохранены в: {graph_path}")
return graph_path
# 5. Main program
if __name__ == "__main__":
results, docs_dir = run_experiment()
try:
graph_file = create_graphs(results, docs_dir)
print("\n" + "=" * 70)
print("ЭКСПЕРИМЕНТ ЗАВЕРШЕН УСПЕШНО!")
print("=" * 70)
print("\n📂 СОЗДАННЫЕ ФАЙЛЫ:")
print(f" 📊 Данные: {os.path.join(docs_dir, 'experiment_results.csv')}")
print(f" 📈 Графики: {graph_file}")
except Exception as e:
print(f"\n⚠️ Ошибка при построении графиков: {e}")
print(" Убедитесь, что установлен matplotlib: pip install matplotlib")
print("\n" + "=" * 70)
print("ЭКСПЕРИМЕНТ ЗАВЕРШЕН (без графиков)")
print("=" * 70)
print(f"\n📂 CSV файл сохранен: {os.path.join(docs_dir, 'experiment_results.csv')}")

View File

@ -0,0 +1,19 @@
Структура;Режим;Операция;Замер1(с);Замер2(с);Замер3(с);Замер4(с);Замер5(с);Среднее(с)
linked_list;случайный;вставка;3.0067851000931114;2.9344012999208644;3.009651300031692;2.8879009999800473;2.9411771999439225;2.9559831799939276
linked_list;случайный;поиск;0.024209000053815544;0.023271000012755394;0.023459300049580634;0.02291749999858439;0.023009900003671646;0.02337334002368152
linked_list;случайный;удаление;0.012298299930989742;0.01275830005761236;0.011870200047269464;0.012219499913044274;0.013008400099352002;0.012430940009653568
hash_table;случайный;вставка;0.17963590007275343;0.18678270000964403;0.17841749999206513;0.1837999999988824;0.17311319999862462;0.18034986001439393
hash_table;случайный;поиск;0.0014747000532224774;0.0015627999091520905;0.0013960000360384583;0.001387899974361062;0.001381400041282177;0.001440560002811253
hash_table;случайный;удаление;0.0009544000495225191;0.0009586999658495188;0.0010158000513911247;0.0010519999777898192;0.001128499978221953;0.001021880004554987
bst;случайный;вставка;0.018539699958637357;0.017916599987074733;0.018017600057646632;0.017920599901117384;0.01831700000911951;0.018142299982719122
bst;случайный;поиск;0.00027920003049075603;0.00013049994595348835;0.00012059998698532581;0.00011999998241662979;0.00011970009654760361;0.00015400000847876072
bst;случайный;удаление;0.0400237999856472;0.03904950001742691;0.039472199976444244;0.0423756999662146;0.03944469999987632;0.040073179989121854
linked_list;отсортированный;вставка;2.5939184998860583;2.554054999956861;2.5894857000093907;2.566357500036247;2.5988647000631317;2.580536279990338
linked_list;отсортированный;поиск;0.018984199967235327;0.018922099960036576;0.02011869999114424;0.020203600055538118;0.02154539991170168;0.019954799977131187
linked_list;отсортированный;удаление;0.012979999999515712;0.024571599904447794;0.026229599956423044;0.02633849997073412;0.026505499961785972;0.023325039958581328
hash_table;отсортированный;вставка;0.3214672999456525;0.2974235999863595;0.35363279993180186;0.34583120001479983;0.3114031999139115;0.325951619958505
hash_table;отсортированный;поиск;0.003038999973796308;0.002823399961926043;0.0025683999992907047;0.0026236000703647733;0.0026538000674918294;0.0027416400145739315
hash_table;отсортированный;удаление;0.001505899941548705;0.0021319000516086817;0.0018970000091940165;0.002289100084453821;0.0023582999128848314;0.002036439999938011
bst;отсортированный;вставка;15.045550499926321;14.59828589996323;14.894693300011568;14.86575580004137;14.965904699987732;14.874038039986043
bst;отсортированный;поиск;0.06217839999590069;0.059592399979010224;0.05906949995551258;0.0523872000630945;0.04597519990056753;0.055840539978817105
bst;отсортированный;удаление;0.039540500030852854;0.03835180005989969;0.03920200001448393;0.03961219999473542;0.03951310005504638;0.03924392003100365
1 Структура Режим Операция Замер1(с) Замер2(с) Замер3(с) Замер4(с) Замер5(с) Среднее(с)
2 linked_list случайный вставка 3.0067851000931114 2.9344012999208644 3.009651300031692 2.8879009999800473 2.9411771999439225 2.9559831799939276
3 linked_list случайный поиск 0.024209000053815544 0.023271000012755394 0.023459300049580634 0.02291749999858439 0.023009900003671646 0.02337334002368152
4 linked_list случайный удаление 0.012298299930989742 0.01275830005761236 0.011870200047269464 0.012219499913044274 0.013008400099352002 0.012430940009653568
5 hash_table случайный вставка 0.17963590007275343 0.18678270000964403 0.17841749999206513 0.1837999999988824 0.17311319999862462 0.18034986001439393
6 hash_table случайный поиск 0.0014747000532224774 0.0015627999091520905 0.0013960000360384583 0.001387899974361062 0.001381400041282177 0.001440560002811253
7 hash_table случайный удаление 0.0009544000495225191 0.0009586999658495188 0.0010158000513911247 0.0010519999777898192 0.001128499978221953 0.001021880004554987
8 bst случайный вставка 0.018539699958637357 0.017916599987074733 0.018017600057646632 0.017920599901117384 0.01831700000911951 0.018142299982719122
9 bst случайный поиск 0.00027920003049075603 0.00013049994595348835 0.00012059998698532581 0.00011999998241662979 0.00011970009654760361 0.00015400000847876072
10 bst случайный удаление 0.0400237999856472 0.03904950001742691 0.039472199976444244 0.0423756999662146 0.03944469999987632 0.040073179989121854
11 linked_list отсортированный вставка 2.5939184998860583 2.554054999956861 2.5894857000093907 2.566357500036247 2.5988647000631317 2.580536279990338
12 linked_list отсортированный поиск 0.018984199967235327 0.018922099960036576 0.02011869999114424 0.020203600055538118 0.02154539991170168 0.019954799977131187
13 linked_list отсортированный удаление 0.012979999999515712 0.024571599904447794 0.026229599956423044 0.02633849997073412 0.026505499961785972 0.023325039958581328
14 hash_table отсортированный вставка 0.3214672999456525 0.2974235999863595 0.35363279993180186 0.34583120001479983 0.3114031999139115 0.325951619958505
15 hash_table отсортированный поиск 0.003038999973796308 0.002823399961926043 0.0025683999992907047 0.0026236000703647733 0.0026538000674918294 0.0027416400145739315
16 hash_table отсортированный удаление 0.001505899941548705 0.0021319000516086817 0.0018970000091940165 0.002289100084453821 0.0023582999128848314 0.002036439999938011
17 bst отсортированный вставка 15.045550499926321 14.59828589996323 14.894693300011568 14.86575580004137 14.965904699987732 14.874038039986043
18 bst отсортированный поиск 0.06217839999590069 0.059592399979010224 0.05906949995551258 0.0523872000630945 0.04597519990056753 0.055840539978817105
19 bst отсортированный удаление 0.039540500030852854 0.03835180005989969 0.03920200001448393 0.03961219999473542 0.03951310005504638 0.03924392003100365

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB