diff --git a/SimonovaMS/analyz_1.py b/SimonovaMS/analyz_1.py index 80531f8..5a65ae3 100644 --- a/SimonovaMS/analyz_1.py +++ b/SimonovaMS/analyz_1.py @@ -5,12 +5,11 @@ from collections import defaultdict import os report_file = open("analysis_report.txt", "w", encoding="utf-8") -# Читаем файл data = defaultdict(lambda: defaultdict(dict)) with open("C:/Users/Honor/Documents/dep2k/lab_inf_1/data/results.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) - header = next(reader) # пропускаем заголовок + header = next(reader) print(f"{header}") report_file.write(f"{header}\n") @@ -25,19 +24,16 @@ with open("C:/Users/Honor/Documents/dep2k/lab_inf_1/data/results.csv", "r", enco print(f"{struct} | {mode} | {op} | {time_val:.6f}") report_file.write(f"{struct} | {mode} | {op} | {time_val:.6f}\n") -# Словарь для нормальных названий операций op_names = { 'insert': 'вставка', 'find': 'поиск', 'delete': 'удаление' } -# Структуры и режимы structures = ["LinkedList", "HashTable", "Bst"] modes = ["shuffled", "sorted"] operations = ["insert", "find", "delete"] -# Вывод таблицы результатов print("Результаты:") report_file.write("\nРезультаты:\n") print(f"{'Структура':<15} {'Режим':<10} {'вставка':<15} {'поиск':<15} {'удаление':<15}") @@ -51,7 +47,7 @@ for struct in structures: print(f"{struct:<15} {mode:<10} {insert_time:<15.6f} {find_time:<15.6f} {delete_time:<15.6f}") report_file.write(f"{struct:<15} {mode:<10} {insert_time:<15.6f} {find_time:<15.6f} {delete_time:<15.6f}\n") -# Создаём графики +#графики fig, axes = plt.subplots(1, 3, figsize=(15, 5)) for idx, op in enumerate(operations): @@ -74,7 +70,6 @@ for idx, op in enumerate(operations): ax.legend() ax.set_yscale('log') - # Добавляем значения for bar in bars1: height = bar.get_height() ax.text(bar.get_x() + bar.get_width()/2, height, @@ -91,11 +86,10 @@ plt.show() report_file.write("График\n") report_file.write(f"График сохранён в файл: {plot_filename}\n") -# Анализ + print("Анализ:") report_file.write("\nАнализ:\n") -# Для каждой операции определяем лучшую структуру for op in operations: print(f"\n{op_names[op].upper()}:") report_file.write(f"\n{op_names[op].upper()}:\n") @@ -111,15 +105,8 @@ for op in operations: print(f" Худшая: {avg_times[-1][0]} ({avg_times[-1][1]:.6f} сек)") report_file.write(f" Лучшая: {avg_times[0][0]} ({avg_times[0][1]:.6f} сек)\n") report_file.write(f" Худшая: {avg_times[-1][0]} ({avg_times[-1][1]:.6f} сек)\n") -# Влияние порядка на BST -# print("ВЛИЯНИЕ ПОРЯДКА ДАННЫХ НА BST:") -# bst_insert_shuffled = data["Bst"]["shuffled"]["insert"] -# bst_insert_sorted = data["Bst"]["sorted"]["insert"] -# print(f" Вставка shuffled: {bst_insert_shuffled:.6f} сек") -# print(f" Вставка sorted: {bst_insert_sorted:.6f} сек") -# print(f" Разница: {bst_insert_sorted/bst_insert_shuffled:.1f} раз") -# Итоговый вывод + print("Вывод:") report_file.write("\nВывод:\n") print("Для вставок, поиска и удаления лучше всего использовать HashTable как для отсортированных, так и для неотсортированных данных") diff --git a/SimonovaMS/generator_1.py b/SimonovaMS/generator_1.py index afd6958..4907297 100644 --- a/SimonovaMS/generator_1.py +++ b/SimonovaMS/generator_1.py @@ -26,23 +26,4 @@ def generate_delete(records, count=50): names = [name for name, _ in records] return random.sample(names, min(count, len(names))) -## Генерируем данные -# shuffled, sorted_records = generate_data(10) # 10 записей для примера -# -# print("=== Перемешанные записи (первые 5) ===") -# for record in shuffled[:5]: -# print(f" {record}") -# -# print("\n=== Отсортированные записи (первые 5) ===") -# for record in sorted_records[:5]: -# print(f" {record}") -# -# # Генерируем поисковые запросы -# search_queries = generate_search(sorted_records, exist_count=5, no_exist_count=3) -# print(f"\n=== Поисковые запросы (всего {len(search_queries)}) ===") -# print(search_queries) -# -# # Генерируем запросы на удаление -# delete_queries = generate_delete(sorted_records, count=5) -# print(f"\n=== Запросы на удаление (всего {len(delete_queries)}) ===") -# print(delete_queries) + diff --git a/SimonovaMS/phonebook_1_2.py b/SimonovaMS/phonebook_1_2.py index 713e410..ac33ef1 100644 --- a/SimonovaMS/phonebook_1_2.py +++ b/SimonovaMS/phonebook_1_2.py @@ -14,9 +14,6 @@ def ll_insert(head, name, phone): if head is None: return new_node - # if head['name'] == name: - # new_node['next']=head['next'] - # return new_node current = head while current['next'] is not None: if current['next']['name'] == name: @@ -119,8 +116,6 @@ def bst_insert(root, name, phone): def bst_find(root, name): -# if root is None: -# return None current = root while current is not None: if name == current['name']: @@ -139,34 +134,26 @@ def bst_find_min(node): def bst_delete(root, name): - """ИТЕРАТИВНОЕ удаление (без рекурсии)""" if root is None: return None - # Специальный случай: удаляем корень if root['name'] == name: - # Нет потомков if root['left'] is None and root['right'] is None: return None - # Только правый потомок if root['left'] is None: return root['right'] - # Только левый потомок if root['right'] is None: return root['left'] - # Есть оба потомка - # Находим минимальный узел в правом поддереве parent = root min_node = root['right'] while min_node['left']: parent = min_node min_node = min_node['left'] - # Копируем данные root['name'] = min_node['name'] root['phone'] = min_node['phone'] - # Удаляем минимальный узел + if parent == root: parent['right'] = min_node['right'] else: @@ -174,7 +161,6 @@ def bst_delete(root, name): return root - # Ищем узел для удаления и его родителя parent = None current = root while current and current['name'] != name: @@ -184,45 +170,42 @@ def bst_delete(root, name): else: current = current['right'] - # Если не нашли if current is None: return root - # Случай 1: нет потомков + if current['left'] is None and current['right'] is None: if parent['left'] == current: parent['left'] = None else: parent['right'] = None - # Случай 2: только правый потомок + elif current['left'] is None: if parent['left'] == current: parent['left'] = current['right'] else: parent['right'] = current['right'] - # Случай 3: только левый потомок + elif current['right'] is None: if parent['left'] == current: parent['left'] = current['left'] else: parent['right'] = current['left'] - # Случай 4: есть оба потомка else: - # Находим минимальный узел в правом поддереве min_parent = current min_node = current['right'] while min_node['left']: min_parent = min_node min_node = min_node['left'] - # Копируем данные + current['name'] = min_node['name'] current['phone'] = min_node['phone'] - # Удаляем минимальный узел + if min_parent == current: min_parent['right'] = min_node['right'] else: @@ -232,7 +215,6 @@ def bst_delete(root, name): def bst_list_all(root): - """Центрированный обход с использованием стека""" records = [] stack = [] current = root