From b4f085d0f9d22e1de996e748153ea72c645844f3 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 19 Apr 2026 19:38:18 +0300 Subject: [PATCH 01/32] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=20=D1=81=D0=B2=D1=8F=D0=B7=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/phonebook.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 konnovaea/phonebook.py diff --git a/konnovaea/phonebook.py b/konnovaea/phonebook.py new file mode 100644 index 0000000..2064305 --- /dev/null +++ b/konnovaea/phonebook.py @@ -0,0 +1,40 @@ +def ll_insert(head, name, phone): + current = head + while current is not None: + if current['name'] == name: + current['phone'] = phone + return head + current = current['next'] + + new_node = {'name': name, 'phone': phone, 'next': head} + return new_node + +def ll_find(head, name): + current = head + while current is not None: + if current['name'] == name: + return current['phone'] + current = current['next'] + return None + +def ll_delete(head, name): + if head is None: + return None + if head['name'] == name: + return head['next'] + current = head + while current['next'] is not None: + if current['next']['name'] == name: + current['next'] = current['naext']['next'] + return head + current = current['next'] + return head +def ll_list_all(head): + records = [] + current = head + + while current is not None: + records.append((current['name'], current['phine'])) + current = current['next'] + records.sort(key=lambda x: x[0]) + return records From 798e9ae052ff07195f4524e215d819b9ef8bfa62 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 19 Apr 2026 20:19:23 +0300 Subject: [PATCH 02/32] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=85=D0=B5=D1=88-=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/phonebook.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/konnovaea/phonebook.py b/konnovaea/phonebook.py index 2064305..46461f9 100644 --- a/konnovaea/phonebook.py +++ b/konnovaea/phonebook.py @@ -29,6 +29,7 @@ def ll_delete(head, name): return head current = current['next'] return head + def ll_list_all(head): records = [] current = head @@ -38,3 +39,37 @@ def ll_list_all(head): current = current['next'] records.sort(key=lambda x: x[0]) return records + +def hash_function(name, table_size): + total = 0 + for ch in name: + total = (total*31 + ord(ch)) % table_size + return total + +def ht_create(size=1000): + return [None]*size + +def ht_insert(buckets, name, phone): + idx = hash_function(name, len(buckets)) + buckets[idx] = ll_insert(buckets[idx], name, phone) + return buckets + +def ht_find(buckets, name): + idx = hash_function(name, len(buckets)) + return ll_find(buckets[idx], name) + +def ht_delete(buckets, name): + idx = hash_function(name, len(buckets)) + buckets[idx] = ll_delete(buckets[idx], name) + return buckets + +def ht_list_all(buckets): + records = [] + for bucket in buckets: + current = bucket + while current is not None: + records.append((current['name'], current['phone'])) + current = current['next'] + records.sort(key=lambda x: x[0]) + return records + From d43389ec5e475de402b0f2df1fec4c5046f2e40a Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 19 Apr 2026 20:57:51 +0300 Subject: [PATCH 03/32] =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=8B=20=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/phonebook.py | 61 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/konnovaea/phonebook.py b/konnovaea/phonebook.py index 46461f9..6a02ec7 100644 --- a/konnovaea/phonebook.py +++ b/konnovaea/phonebook.py @@ -73,3 +73,64 @@ def ht_list_all(buckets): records.sort(key=lambda x: x[0]) return records +def bst_insert(root, name, phone): + if root is None: + return {'name': name, 'phone': phone, 'left': None, 'right': None} + if name < root['name']: + root['left'] = bst_insert(root['left'], name, phone) + elif name > root['name']: + root['right'] = bst_insert(root['right'], name, phone) + else: + root['phone'] = phone + return root + +def bst_find(root, name): + current = root + while current is not None: + if name == current['name']: + return current['phone'] + elif name < current['name']: + current = current['left'] + else: + current = current['right'] + return None + +def _bst_find_mine(node): + current = node + while current and 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'] + + successor = _bst_find_mine(root['right']) + root['name'] = successor['name'] + root['phone'] = successor['phone'] + root['right'] = bst_delete(root['right'], successor['name']) + + return root + +def bst_list_all(root): + + records = [] + + def inorder(node): + if node is None: + return + inorder(node['left']) + records.append((node['name'], node['phone'])) + inorder(node['right']) + + inorder(root) + return records \ No newline at end of file From 274784ea0ae9c5ec9af0cc5c58fd976d501c486f Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 16:39:00 +0300 Subject: [PATCH 04/32] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=84=D0=B0=D0=B9=D0=BB=20=D1=81=20=D0=B3=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B5=D0=B9=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B2=D1=8B=D1=85=20=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/experiments.py | 0 konnovaea/phonebook.py | 23 +++++++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) create mode 100644 konnovaea/experiments.py diff --git a/konnovaea/experiments.py b/konnovaea/experiments.py new file mode 100644 index 0000000..e69de29 diff --git a/konnovaea/phonebook.py b/konnovaea/phonebook.py index 6a02ec7..1204fb7 100644 --- a/konnovaea/phonebook.py +++ b/konnovaea/phonebook.py @@ -1,13 +1,16 @@ def ll_insert(head, name, phone): - current = head - while current is not None: - if current['name'] == name: - current['phone'] = phone - return head - current = current['next'] + + new_node = {'name': name, 'phone': phone, 'next': None} - new_node = {'name': name, 'phone': phone, 'next': head} - return new_node + if head is None: + return new_node + + current = head + while current['next'] is not None: + current = current['next'] + + current['next'] = new_node + return head def ll_find(head, name): current = head @@ -25,7 +28,7 @@ def ll_delete(head, name): current = head while current['next'] is not None: if current['next']['name'] == name: - current['next'] = current['naext']['next'] + current['next'] = current['next']['next'] return head current = current['next'] return head @@ -35,7 +38,7 @@ def ll_list_all(head): current = head while current is not None: - records.append((current['name'], current['phine'])) + records.append((current['name'], current['phone'])) current = current['next'] records.sort(key=lambda x: x[0]) return records From 1d224e6171755c12afabb9844da2f513b38d65c2 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 17:52:13 +0300 Subject: [PATCH 05/32] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D1=80=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B2=D1=8F=D0=B7=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/experiments.py | 94 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/konnovaea/experiments.py b/konnovaea/experiments.py index e69de29..9f54f95 100644 --- a/konnovaea/experiments.py +++ b/konnovaea/experiments.py @@ -0,0 +1,94 @@ +import random +import time +import csv +import os +from 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_experiment(records, mode_name): + + print(f"\n связный список ({mode_name}):") + + print("вставка 10000 записей:") + + insert_time = [] + 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_time.append(end - start) + print(f"Вставка {run+1}/5: {insert_time[-1]:.6f} сек") + + avg_insert = sum(insert_time) / 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.pref_cointer() + 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_time, + 'find_avg': avg_find, + 'find_all': find_times, + 'delete_avg': avg_delete, + 'delete_all': delete_times + } + + + + + + + From eeb0e16665a38179771ff193f770956c59378b27 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 18:28:36 +0300 Subject: [PATCH 06/32] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D1=80=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=85=D0=B5=D1=88-=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/experiments.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/konnovaea/experiments.py b/konnovaea/experiments.py index 9f54f95..8929578 100644 --- a/konnovaea/experiments.py +++ b/konnovaea/experiments.py @@ -24,17 +24,17 @@ def run_linked_experiment(records, mode_name): print("вставка 10000 записей:") - insert_time = [] + 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_time.append(end - start) - print(f"Вставка {run+1}/5: {insert_time[-1]:.6f} сек") + insert_times.append(end - start) + print(f"Вставка {run+1}/5: {insert_times[-1]:.6f} сек") - avg_insert = sum(insert_time) / 5 + avg_insert = sum(insert_times) / 5 print(f"среднее: {avg_insert:.6f} сек") print("поиск 110 записей:") @@ -79,7 +79,7 @@ def run_linked_experiment(records, mode_name): 'structure': 'LinkedList', 'mode': mode_name, 'insert_avg': avg_insert, - 'insert_all': insert_time, + 'insert_all': insert_times, 'find_avg': avg_find, 'find_all': find_times, 'delete_avg': avg_delete, @@ -90,5 +90,3 @@ def run_linked_experiment(records, mode_name): - - From 409b7dde52291aab8a52e1ae88d4cd481a373723 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 18:44:51 +0300 Subject: [PATCH 07/32] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D1=80=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=B2=D0=BE=D0=B8=D1=87=D0=BD=D0=BE=D0=B5=20=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B2=D0=BE=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/experiments.py | 142 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 141 insertions(+), 1 deletion(-) diff --git a/konnovaea/experiments.py b/konnovaea/experiments.py index 8929578..295f53c 100644 --- a/konnovaea/experiments.py +++ b/konnovaea/experiments.py @@ -18,7 +18,7 @@ def generate_test_data(n=10000): def get_random_names(records, n=100): return[name for name, _ in random.sample(records, min(n, len(records)))] -def run_linked_experiment(records, mode_name): +def run_linked_experiments(records, mode_name): print(f"\n связный список ({mode_name}):") @@ -86,6 +86,146 @@ def run_linked_experiment(records, mode_name): 'delete_all': delete_times } +def run_hash_experiments(records, mode_name): + + print(f"хеш-таблица({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.pref_cointer() + 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"двоичное дерево({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.pref_cointer() + 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 + } + From be927fd028ed8ff288563c33bd29aeba695b246d Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 19:31:21 +0300 Subject: [PATCH 08/32] =?UTF-8?q?=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20csv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/experiments.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/konnovaea/experiments.py b/konnovaea/experiments.py index 295f53c..a09364b 100644 --- a/konnovaea/experiments.py +++ b/konnovaea/experiments.py @@ -225,8 +225,34 @@ def run_bst_experiments(records, mode_name): 'delete_avg': avg_delete, 'delete_all': delete_times } +def save_result_to_csv(all_results): + os.makedirs("docs/data", exist_ok=True) + + csv_rows = [] + csv_rows.append(["Структура", "Режим", "Операция", "Номер_замера", "Время(сек)"]) + for res in all_results: + struct = res['structure'] + mode = res['mode'] + for i, t in enumerate(res['insert_all']): + csv_rows.append([struct, mode, "вставка", i+1, t]) + csv_rows.append([struct, "вставка", "среднее", res['insert_avg']]) + + for i, t in enumerate(res['find_all']): + csv_rows.append([struct, mode, "поиск", i+1, t]) + + csv_rows.append([struct, "поиск", "среднее", res['find_avg']]) + + for i, t in enumerate(res['delete_all']): + csv_rows.append([struct, mode, "удаление", i+1, t]) + + csv_rows.append([struct, "удаление", "среднее", res['delete_avg']]) + + with open("docs/data/resurts.csv", "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f) + writer.writerow(csv_rows) + print(f"\nрезультаты сохранены") \ No newline at end of file From 0046bde7598b8ebcacf6a3855f81ae8977d9ecab Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 20:41:45 +0300 Subject: [PATCH 09/32] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B4=D0=B2=D0=BE=D0=B8=D1=87=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=B4=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=20=D0=B8=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/experiments.py | 35 +++++++++++++++++++++++++++++++---- konnovaea/phonebook.py | 29 ++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/konnovaea/experiments.py b/konnovaea/experiments.py index a09364b..474b77a 100644 --- a/konnovaea/experiments.py +++ b/konnovaea/experiments.py @@ -51,7 +51,7 @@ def run_linked_experiments(records, mode_name): for name in non_exist_names: ll_find(head, name) - end = time.pref_cointer() + end = time.perf_counter() find_times.append(end - start) print(f"поиск {run+1}/5: {find_times[-1]:.6f} сек") @@ -121,7 +121,7 @@ def run_hash_experiments(records, mode_name): for name in non_exist_names: ht_find(buckets, name) - end = time.pref_cointer() + end = time.perf_counter() find_times.append(end - start) print(f"поиск {run+1}/5: {find_times[-1]:.6f} сек") @@ -191,7 +191,7 @@ def run_bst_experiments(records, mode_name): for name in non_exist_names: bst_find(root, name) - end = time.pref_cointer() + end = time.perf_counter() find_times.append(end - start) print(f"поиск {run+1}/5: {find_times[-1]:.6f} сек") @@ -255,4 +255,31 @@ def save_result_to_csv(all_results): with open("docs/data/resurts.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(csv_rows) - print(f"\nрезультаты сохранены") \ No newline at end of file + print(f"\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_result_to_csv(all_results) + +if __name__== "__main__": + main() + + + diff --git a/konnovaea/phonebook.py b/konnovaea/phonebook.py index 1204fb7..d38d076 100644 --- a/konnovaea/phonebook.py +++ b/konnovaea/phonebook.py @@ -77,16 +77,31 @@ def ht_list_all(buckets): return records def bst_insert(root, name, phone): + + new_node = {'name': name, 'phone': phone, 'left': None, 'right': None} + if root is None: - return {'name': name, 'phone': phone, 'left': None, 'right': None} - if name < root['name']: - root['left'] = bst_insert(root['left'], name, phone) - elif name > root['name']: - root['right'] = bst_insert(root['right'], name, phone) - else: - root['phone'] = phone + return new_node + + current = root + while True: + if name < current['name']: + if current['left'] is None: + current['left'] = new_node + break + current = current['left'] + elif name > current['name']: + if current['right'] is None: + current['right'] = new_node + break + current = current['right'] + else: + current['phone'] = phone + break + return root + def bst_find(root, name): current = root while current is not None: From c76eb6f91b187ce026bd74dc937d528e0d577c63 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 20:49:48 +0300 Subject: [PATCH 10/32] =?UTF-8?q?=D0=B4=D0=B2=D0=BE=D0=B8=D1=87=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=B4=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=202.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/phonebook.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/konnovaea/phonebook.py b/konnovaea/phonebook.py index d38d076..169190e 100644 --- a/konnovaea/phonebook.py +++ b/konnovaea/phonebook.py @@ -120,22 +120,29 @@ def _bst_find_mine(node): 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'] + return root + + if root['left'] is None: + return root['right'] + elif root['right'] is None: + return root['left'] - successor = _bst_find_mine(root['right']) - root['name'] = successor['name'] - root['phone'] = successor['phone'] - root['right'] = bst_delete(root['right'], successor['name']) + current = root['right'] + while current['left'] is not None: + current = current['left'] + + root['name'] = current['name'] + root['phone'] = current['phone'] + + root['right'] = bst_delete(root['right'], current['name']) return root From c32fd836b5ff10d8f6b0be1bfee3574c23bd8392 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 21:17:46 +0300 Subject: [PATCH 11/32] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B4=D0=B2=D0=BE=D0=B8=D1=87=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=B4=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=203.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/docs/data/resurts.csv | 1 + konnovaea/experiments.py | 4 +- konnovaea/phonebook.py | 86 +++++++++++++++++++++++---------- 3 files changed, 63 insertions(+), 28 deletions(-) create mode 100644 konnovaea/docs/data/resurts.csv diff --git a/konnovaea/docs/data/resurts.csv b/konnovaea/docs/data/resurts.csv new file mode 100644 index 0000000..3f4d630 --- /dev/null +++ b/konnovaea/docs/data/resurts.csv @@ -0,0 +1 @@ +"['Структура', 'Режим', 'Операция', 'Номер_замера', 'Время(сек)']","['LinkedList', 'случайный', 'вставка', 1, 0.0011547999965841882]","['LinkedList', 'случайный', 'вставка', 2, 0.0011316000018268824]","['LinkedList', 'случайный', 'вставка', 3, 0.0010395000026619527]","['LinkedList', 'случайный', 'вставка', 4, 0.0011436999993748032]","['LinkedList', 'случайный', 'вставка', 5, 0.0011493999991216697]","['LinkedList', 'вставка', 'среднее', 0.0011237999999138993]","['LinkedList', 'случайный', 'поиск', 1, 5.199999577598646e-06]","['LinkedList', 'случайный', 'поиск', 2, 7.399998139590025e-06]","['LinkedList', 'случайный', 'поиск', 3, 4.900000931229442e-06]","['LinkedList', 'случайный', 'поиск', 4, 7.599999662488699e-06]","['LinkedList', 'случайный', 'поиск', 5, 4.2000028770416975e-06]","['LinkedList', 'поиск', 'среднее', 5.860000237589702e-06]","['LinkedList', 'случайный', 'удаление', 1, 3.2999996619764715e-06]","['LinkedList', 'случайный', 'удаление', 2, 4.300000000512227e-06]","['LinkedList', 'случайный', 'удаление', 3, 3.9000005926936865e-06]","['LinkedList', 'случайный', 'удаление', 4, 6.199999916134402e-06]","['LinkedList', 'случайный', 'удаление', 5, 4.399997123982757e-06]","['LinkedList', 'удаление', 'среднее', 4.419999459059909e-06]","['HashTable', 'случайный', 'вставка', 1, 0.008097199999610893]","['HashTable', 'случайный', 'вставка', 2, 0.008438500000920612]","['HashTable', 'случайный', 'вставка', 3, 0.008065199999691686]","['HashTable', 'случайный', 'вставка', 4, 0.008227499998611165]","['HashTable', 'случайный', 'вставка', 5, 0.008147000000462867]","['HashTable', 'вставка', 'среднее', 0.008195079999859444]","['HashTable', 'случайный', 'поиск', 1, 9.560000034980476e-05]","['HashTable', 'случайный', 'поиск', 2, 7.389999882434495e-05]","['HashTable', 'случайный', 'поиск', 3, 7.959999857121147e-05]","['HashTable', 'случайный', 'поиск', 4, 8.250000246334821e-05]","['HashTable', 'случайный', 'поиск', 5, 7.859999823267572e-05]","['HashTable', 'поиск', 'среднее', 8.203999968827702e-05]","['HashTable', 'случайный', 'удаление', 1, 3.870000000461005e-05]","['HashTable', 'случайный', 'удаление', 2, 4.199999966658652e-05]","['HashTable', 'случайный', 'удаление', 3, 3.809999907389283e-05]","['HashTable', 'случайный', 'удаление', 4, 3.479999941191636e-05]","['HashTable', 'случайный', 'удаление', 5, 3.9200000173877925e-05]","['HashTable', 'удаление', 'среднее', 3.8559999666176736e-05]","['BST', 'случайный', 'вставка', 1, 0.016606600001978222]","['BST', 'случайный', 'вставка', 2, 0.016405900001700502]","['BST', 'случайный', 'вставка', 3, 0.015124699999432778]","['BST', 'случайный', 'вставка', 4, 0.01577959999849554]","['BST', 'случайный', 'вставка', 5, 0.015012600000773091]","['BST', 'вставка', 'среднее', 0.015785880000476028]","['BST', 'случайный', 'поиск', 1, 0.000170899998920504]","['BST', 'случайный', 'поиск', 2, 0.00016369999866583385]","['BST', 'случайный', 'поиск', 3, 0.00017529999968246557]","['BST', 'случайный', 'поиск', 4, 0.00016730000061215833]","['BST', 'случайный', 'поиск', 5, 0.00015029999849502929]","['BST', 'поиск', 'среднее', 0.0001654999992751982]","['BST', 'случайный', 'удаление', 1, 0.00011929999891435727]","['BST', 'случайный', 'удаление', 2, 8.449999950244091e-05]","['BST', 'случайный', 'удаление', 3, 7.879999975557439e-05]","['BST', 'случайный', 'удаление', 4, 7.829999958630651e-05]","['BST', 'случайный', 'удаление', 5, 7.74000000092201e-05]","['BST', 'удаление', 'среднее', 8.765999955357983e-05]","['LinkedList', 'отсортированный', 'вставка', 1, 0.0009006000000226777]","['LinkedList', 'отсортированный', 'вставка', 2, 0.0009030000001075678]","['LinkedList', 'отсортированный', 'вставка', 3, 0.0008481000004394446]","['LinkedList', 'отсортированный', 'вставка', 4, 0.0008976999997685198]","['LinkedList', 'отсортированный', 'вставка', 5, 0.0008912999983294867]","['LinkedList', 'вставка', 'среднее', 0.0008881399997335393]","['LinkedList', 'отсортированный', 'поиск', 1, 7.200000254670158e-06]","['LinkedList', 'отсортированный', 'поиск', 2, 7.399998139590025e-06]","['LinkedList', 'отсортированный', 'поиск', 3, 4.099998477613553e-06]","['LinkedList', 'отсортированный', 'поиск', 4, 1.7399997886968777e-05]","['LinkedList', 'отсортированный', 'поиск', 5, 2.059999678749591e-05]","['LinkedList', 'поиск', 'среднее', 1.1339998309267685e-05]","['LinkedList', 'отсортированный', 'удаление', 1, 2.1999985619913787e-06]","['LinkedList', 'отсортированный', 'удаление', 2, 2.0000006770715117e-06]","['LinkedList', 'отсортированный', 'удаление', 3, 1.8999999156221747e-06]","['LinkedList', 'отсортированный', 'удаление', 4, 2.9000002541579306e-06]","['LinkedList', 'отсортированный', 'удаление', 5, 1.1899999663000926e-05]","['LinkedList', 'удаление', 'среднее', 4.179999814368785e-06]","['HashTable', 'отсортированный', 'вставка', 1, 0.007498599999962607]","['HashTable', 'отсортированный', 'вставка', 2, 0.007766099999571452]","['HashTable', 'отсортированный', 'вставка', 3, 0.00698970000303234]","['HashTable', 'отсортированный', 'вставка', 4, 0.007400300000881543]","['HashTable', 'отсортированный', 'вставка', 5, 0.007057499999064021]","['HashTable', 'вставка', 'среднее', 0.007342440000502393]","['HashTable', 'отсортированный', 'поиск', 1, 7.79999973019585e-05]","['HashTable', 'отсортированный', 'поиск', 2, 0.0001480999999330379]","['HashTable', 'отсортированный', 'поиск', 3, 7.76999986555893e-05]","['HashTable', 'отсортированный', 'поиск', 4, 9.620000128052197e-05]","['HashTable', 'отсортированный', 'поиск', 5, 7.760000153211877e-05]","['HashTable', 'поиск', 'среднее', 9.55199997406453e-05]","['HashTable', 'отсортированный', 'удаление', 1, 3.97000003431458e-05]","['HashTable', 'отсортированный', 'удаление', 2, 4.070000068168156e-05]","['HashTable', 'отсортированный', 'удаление', 3, 3.979999746661633e-05]","['HashTable', 'отсортированный', 'удаление', 4, 3.9999998989515007e-05]","['HashTable', 'отсортированный', 'удаление', 5, 3.5799999750452116e-05]","['HashTable', 'удаление', 'среднее', 3.9199999446282166e-05]","['BST', 'отсортированный', 'вставка', 1, 3.4188253000029363]","['BST', 'отсортированный', 'вставка', 2, 3.422452200000407]","['BST', 'отсортированный', 'вставка', 3, 3.390677199997299]","['BST', 'отсортированный', 'вставка', 4, 3.405736100001377]","['BST', 'отсортированный', 'вставка', 5, 3.400910500000464]","['BST', 'вставка', 'среднее', 3.4077202600004965]","['BST', 'отсортированный', 'поиск', 1, 0.03228080000189948]","['BST', 'отсортированный', 'поиск', 2, 0.0310687000019243]","['BST', 'отсортированный', 'поиск', 3, 0.032134100001712795]","['BST', 'отсортированный', 'поиск', 4, 0.03154340000037337]","['BST', 'отсортированный', 'поиск', 5, 0.031875300002866425]","['BST', 'поиск', 'среднее', 0.03178046000175527]","['BST', 'отсортированный', 'удаление', 1, 0.018500899997889064]","['BST', 'отсортированный', 'удаление', 2, 0.018966899999213638]","['BST', 'отсортированный', 'удаление', 3, 0.018654799998330418]","['BST', 'отсортированный', 'удаление', 4, 0.019049999998969724]","['BST', 'отсортированный', 'удаление', 5, 0.018512599999667145]","['BST', 'удаление', 'среднее', 0.018737039998813997]" diff --git a/konnovaea/experiments.py b/konnovaea/experiments.py index 474b77a..a8f72a3 100644 --- a/konnovaea/experiments.py +++ b/konnovaea/experiments.py @@ -88,7 +88,7 @@ def run_linked_experiments(records, mode_name): def run_hash_experiments(records, mode_name): - print(f"хеш-таблица({mode_name})") + print(f"\n хеш-таблица({mode_name})") print("вставка 10000 записей:") @@ -158,7 +158,7 @@ def run_hash_experiments(records, mode_name): def run_bst_experiments(records, mode_name): - print(f"двоичное дерево({mode_name})") + print(f"\n двоичное дерево({mode_name})") print("вставка 10000 записей:") diff --git a/konnovaea/phonebook.py b/konnovaea/phonebook.py index 169190e..2676b26 100644 --- a/konnovaea/phonebook.py +++ b/konnovaea/phonebook.py @@ -77,7 +77,7 @@ def ht_list_all(buckets): return records def bst_insert(root, name, phone): - + new_node = {'name': name, 'phone': phone, 'left': None, 'right': None} if root is None: @@ -98,11 +98,12 @@ def bst_insert(root, name, phone): else: current['phone'] = phone break - + return root def bst_find(root, name): + current = root while current is not None: if name == current['name']: @@ -113,49 +114,82 @@ def bst_find(root, name): current = current['right'] return None -def _bst_find_mine(node): + +def _bst_find_min(node): + current = node - while current and current['left'] is not None: + while current['left'] is not None: current = current['left'] return current -def bst_delete(root, name): +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) + parent = None + current = root + + while current is not None and current['name'] != name: + parent = current + if name < current['name']: + current = current['left'] + else: + current = current['right'] + + if current is None: return root - if root['left'] is None: - return root['right'] - elif root['right'] is None: - return root['left'] + if current['left'] is None and current['right'] is None: + if parent is None: + return None + if parent['left'] == current: + parent['left'] = None + else: + parent['right'] = None + return root + + if current['left'] is None: + child = current['right'] + elif current['right'] is None: + child = current['left'] + else: + successor_parent = current + successor = current['right'] + while successor['left'] is not None: + successor_parent = successor + successor = successor['left'] - current = root['right'] - while current['left'] is not None: - current = current['left'] - - root['name'] = current['name'] - root['phone'] = current['phone'] - - root['right'] = bst_delete(root['right'], current['name']) - + current['name'] = successor['name'] + current['phone'] = successor['phone'] + + if successor_parent['left'] == successor: + successor_parent['left'] = successor['right'] + else: + successor_parent['right'] = successor['right'] + + return root + + if parent is None: + return child + if parent['left'] == current: + parent['left'] = child + else: + parent['right'] = child + return root + def bst_list_all(root): - records = [] - + def inorder(node): - if node is None: + if node is None: return inorder(node['left']) records.append((node['name'], node['phone'])) inorder(node['right']) - + inorder(root) return records \ No newline at end of file From f914a177a52bddd67f422db99389d481af76ed9f Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 21:24:23 +0300 Subject: [PATCH 12/32] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=20csv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/docs/data/resurts.csv | 2 +- konnovaea/experiments.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/konnovaea/docs/data/resurts.csv b/konnovaea/docs/data/resurts.csv index 3f4d630..cf27ee1 100644 --- a/konnovaea/docs/data/resurts.csv +++ b/konnovaea/docs/data/resurts.csv @@ -1 +1 @@ -"['Структура', 'Режим', 'Операция', 'Номер_замера', 'Время(сек)']","['LinkedList', 'случайный', 'вставка', 1, 0.0011547999965841882]","['LinkedList', 'случайный', 'вставка', 2, 0.0011316000018268824]","['LinkedList', 'случайный', 'вставка', 3, 0.0010395000026619527]","['LinkedList', 'случайный', 'вставка', 4, 0.0011436999993748032]","['LinkedList', 'случайный', 'вставка', 5, 0.0011493999991216697]","['LinkedList', 'вставка', 'среднее', 0.0011237999999138993]","['LinkedList', 'случайный', 'поиск', 1, 5.199999577598646e-06]","['LinkedList', 'случайный', 'поиск', 2, 7.399998139590025e-06]","['LinkedList', 'случайный', 'поиск', 3, 4.900000931229442e-06]","['LinkedList', 'случайный', 'поиск', 4, 7.599999662488699e-06]","['LinkedList', 'случайный', 'поиск', 5, 4.2000028770416975e-06]","['LinkedList', 'поиск', 'среднее', 5.860000237589702e-06]","['LinkedList', 'случайный', 'удаление', 1, 3.2999996619764715e-06]","['LinkedList', 'случайный', 'удаление', 2, 4.300000000512227e-06]","['LinkedList', 'случайный', 'удаление', 3, 3.9000005926936865e-06]","['LinkedList', 'случайный', 'удаление', 4, 6.199999916134402e-06]","['LinkedList', 'случайный', 'удаление', 5, 4.399997123982757e-06]","['LinkedList', 'удаление', 'среднее', 4.419999459059909e-06]","['HashTable', 'случайный', 'вставка', 1, 0.008097199999610893]","['HashTable', 'случайный', 'вставка', 2, 0.008438500000920612]","['HashTable', 'случайный', 'вставка', 3, 0.008065199999691686]","['HashTable', 'случайный', 'вставка', 4, 0.008227499998611165]","['HashTable', 'случайный', 'вставка', 5, 0.008147000000462867]","['HashTable', 'вставка', 'среднее', 0.008195079999859444]","['HashTable', 'случайный', 'поиск', 1, 9.560000034980476e-05]","['HashTable', 'случайный', 'поиск', 2, 7.389999882434495e-05]","['HashTable', 'случайный', 'поиск', 3, 7.959999857121147e-05]","['HashTable', 'случайный', 'поиск', 4, 8.250000246334821e-05]","['HashTable', 'случайный', 'поиск', 5, 7.859999823267572e-05]","['HashTable', 'поиск', 'среднее', 8.203999968827702e-05]","['HashTable', 'случайный', 'удаление', 1, 3.870000000461005e-05]","['HashTable', 'случайный', 'удаление', 2, 4.199999966658652e-05]","['HashTable', 'случайный', 'удаление', 3, 3.809999907389283e-05]","['HashTable', 'случайный', 'удаление', 4, 3.479999941191636e-05]","['HashTable', 'случайный', 'удаление', 5, 3.9200000173877925e-05]","['HashTable', 'удаление', 'среднее', 3.8559999666176736e-05]","['BST', 'случайный', 'вставка', 1, 0.016606600001978222]","['BST', 'случайный', 'вставка', 2, 0.016405900001700502]","['BST', 'случайный', 'вставка', 3, 0.015124699999432778]","['BST', 'случайный', 'вставка', 4, 0.01577959999849554]","['BST', 'случайный', 'вставка', 5, 0.015012600000773091]","['BST', 'вставка', 'среднее', 0.015785880000476028]","['BST', 'случайный', 'поиск', 1, 0.000170899998920504]","['BST', 'случайный', 'поиск', 2, 0.00016369999866583385]","['BST', 'случайный', 'поиск', 3, 0.00017529999968246557]","['BST', 'случайный', 'поиск', 4, 0.00016730000061215833]","['BST', 'случайный', 'поиск', 5, 0.00015029999849502929]","['BST', 'поиск', 'среднее', 0.0001654999992751982]","['BST', 'случайный', 'удаление', 1, 0.00011929999891435727]","['BST', 'случайный', 'удаление', 2, 8.449999950244091e-05]","['BST', 'случайный', 'удаление', 3, 7.879999975557439e-05]","['BST', 'случайный', 'удаление', 4, 7.829999958630651e-05]","['BST', 'случайный', 'удаление', 5, 7.74000000092201e-05]","['BST', 'удаление', 'среднее', 8.765999955357983e-05]","['LinkedList', 'отсортированный', 'вставка', 1, 0.0009006000000226777]","['LinkedList', 'отсортированный', 'вставка', 2, 0.0009030000001075678]","['LinkedList', 'отсортированный', 'вставка', 3, 0.0008481000004394446]","['LinkedList', 'отсортированный', 'вставка', 4, 0.0008976999997685198]","['LinkedList', 'отсортированный', 'вставка', 5, 0.0008912999983294867]","['LinkedList', 'вставка', 'среднее', 0.0008881399997335393]","['LinkedList', 'отсортированный', 'поиск', 1, 7.200000254670158e-06]","['LinkedList', 'отсортированный', 'поиск', 2, 7.399998139590025e-06]","['LinkedList', 'отсортированный', 'поиск', 3, 4.099998477613553e-06]","['LinkedList', 'отсортированный', 'поиск', 4, 1.7399997886968777e-05]","['LinkedList', 'отсортированный', 'поиск', 5, 2.059999678749591e-05]","['LinkedList', 'поиск', 'среднее', 1.1339998309267685e-05]","['LinkedList', 'отсортированный', 'удаление', 1, 2.1999985619913787e-06]","['LinkedList', 'отсортированный', 'удаление', 2, 2.0000006770715117e-06]","['LinkedList', 'отсортированный', 'удаление', 3, 1.8999999156221747e-06]","['LinkedList', 'отсортированный', 'удаление', 4, 2.9000002541579306e-06]","['LinkedList', 'отсортированный', 'удаление', 5, 1.1899999663000926e-05]","['LinkedList', 'удаление', 'среднее', 4.179999814368785e-06]","['HashTable', 'отсортированный', 'вставка', 1, 0.007498599999962607]","['HashTable', 'отсортированный', 'вставка', 2, 0.007766099999571452]","['HashTable', 'отсортированный', 'вставка', 3, 0.00698970000303234]","['HashTable', 'отсортированный', 'вставка', 4, 0.007400300000881543]","['HashTable', 'отсортированный', 'вставка', 5, 0.007057499999064021]","['HashTable', 'вставка', 'среднее', 0.007342440000502393]","['HashTable', 'отсортированный', 'поиск', 1, 7.79999973019585e-05]","['HashTable', 'отсортированный', 'поиск', 2, 0.0001480999999330379]","['HashTable', 'отсортированный', 'поиск', 3, 7.76999986555893e-05]","['HashTable', 'отсортированный', 'поиск', 4, 9.620000128052197e-05]","['HashTable', 'отсортированный', 'поиск', 5, 7.760000153211877e-05]","['HashTable', 'поиск', 'среднее', 9.55199997406453e-05]","['HashTable', 'отсортированный', 'удаление', 1, 3.97000003431458e-05]","['HashTable', 'отсортированный', 'удаление', 2, 4.070000068168156e-05]","['HashTable', 'отсортированный', 'удаление', 3, 3.979999746661633e-05]","['HashTable', 'отсортированный', 'удаление', 4, 3.9999998989515007e-05]","['HashTable', 'отсортированный', 'удаление', 5, 3.5799999750452116e-05]","['HashTable', 'удаление', 'среднее', 3.9199999446282166e-05]","['BST', 'отсортированный', 'вставка', 1, 3.4188253000029363]","['BST', 'отсортированный', 'вставка', 2, 3.422452200000407]","['BST', 'отсортированный', 'вставка', 3, 3.390677199997299]","['BST', 'отсортированный', 'вставка', 4, 3.405736100001377]","['BST', 'отсортированный', 'вставка', 5, 3.400910500000464]","['BST', 'вставка', 'среднее', 3.4077202600004965]","['BST', 'отсортированный', 'поиск', 1, 0.03228080000189948]","['BST', 'отсортированный', 'поиск', 2, 0.0310687000019243]","['BST', 'отсортированный', 'поиск', 3, 0.032134100001712795]","['BST', 'отсортированный', 'поиск', 4, 0.03154340000037337]","['BST', 'отсортированный', 'поиск', 5, 0.031875300002866425]","['BST', 'поиск', 'среднее', 0.03178046000175527]","['BST', 'отсортированный', 'удаление', 1, 0.018500899997889064]","['BST', 'отсортированный', 'удаление', 2, 0.018966899999213638]","['BST', 'отсортированный', 'удаление', 3, 0.018654799998330418]","['BST', 'отсортированный', 'удаление', 4, 0.019049999998969724]","['BST', 'отсортированный', 'удаление', 5, 0.018512599999667145]","['BST', 'удаление', 'среднее', 0.018737039998813997]" +"['Структура', 'Режим', 'Операция', 'Номер_замера', 'Время(сек)']","['LinkedList', 'случайный', 'вставка', 1, 0.0019962000005762093]","['LinkedList', 'случайный', 'вставка', 2, 0.002358600002480671]","['LinkedList', 'случайный', 'вставка', 3, 0.00338009999904898]","['LinkedList', 'случайный', 'вставка', 4, 0.0017534999969939236]","['LinkedList', 'случайный', 'вставка', 5, 0.001513299997895956]","['LinkedList', 'вставка', 'среднее', 0.002200339999399148]","['LinkedList', 'случайный', 'поиск', 1, 7.200000254670158e-06]","['LinkedList', 'случайный', 'поиск', 2, 8.099999831756577e-06]","['LinkedList', 'случайный', 'поиск', 3, 5.800000508315861e-06]","['LinkedList', 'случайный', 'поиск', 4, 1.4799999917158857e-05]","['LinkedList', 'случайный', 'поиск', 5, 8.800001523923129e-06]","['LinkedList', 'поиск', 'среднее', 8.940000407164917e-06]","['LinkedList', 'случайный', 'удаление', 1, 3.5000011848751456e-06]","['LinkedList', 'случайный', 'удаление', 2, 4.1000021155923605e-06]","['LinkedList', 'случайный', 'удаление', 3, 5.500000042957254e-05]","['LinkedList', 'случайный', 'удаление', 4, 2.7999994927085936e-06]","['LinkedList', 'случайный', 'удаление', 5, 2.6000016077887267e-06]","['LinkedList', 'удаление', 'среднее', 1.3600000966107472e-05]","['HashTable', 'случайный', 'вставка', 1, 0.016466400000354042]","['HashTable', 'случайный', 'вставка', 2, 0.01572669999950449]","['HashTable', 'случайный', 'вставка', 3, 0.012243599998328136]","['HashTable', 'случайный', 'вставка', 4, 0.012327000000368571]","['HashTable', 'случайный', 'вставка', 5, 0.01224759999968228]","['HashTable', 'вставка', 'среднее', 0.013802259999647504]","['HashTable', 'случайный', 'поиск', 1, 0.0003924999982700683]","['HashTable', 'случайный', 'поиск', 2, 0.00015640000128769316]","['HashTable', 'случайный', 'поиск', 3, 0.00021699999706470408]","['HashTable', 'случайный', 'поиск', 4, 0.0001894999986689072]","['HashTable', 'случайный', 'поиск', 5, 0.00010560000009718351]","['HashTable', 'поиск', 'среднее', 0.00021219999907771126]","['HashTable', 'случайный', 'удаление', 1, 5.8900001022266224e-05]","['HashTable', 'случайный', 'удаление', 2, 5.48999996681232e-05]","['HashTable', 'случайный', 'удаление', 3, 5.3499999921768904e-05]","['HashTable', 'случайный', 'удаление', 4, 5.569999848376028e-05]","['HashTable', 'случайный', 'удаление', 5, 5.270000110613182e-05]","['HashTable', 'удаление', 'среднее', 5.514000004041009e-05]","['BST', 'случайный', 'вставка', 1, 0.02389969999785535]","['BST', 'случайный', 'вставка', 2, 0.0244684999997844]","['BST', 'случайный', 'вставка', 3, 0.026340499996877043]","['BST', 'случайный', 'вставка', 4, 0.02651980000155163]","['BST', 'случайный', 'вставка', 5, 0.023325299996940885]","['BST', 'вставка', 'среднее', 0.024910759998601862]","['BST', 'случайный', 'поиск', 1, 0.0002482999989297241]","['BST', 'случайный', 'поиск', 2, 0.0002702000019780826]","['BST', 'случайный', 'поиск', 3, 0.0002458000017213635]","['BST', 'случайный', 'поиск', 4, 0.00024990000019897707]","['BST', 'случайный', 'поиск', 5, 0.00025649999952293]","['BST', 'поиск', 'среднее', 0.0002541400004702155]","['BST', 'случайный', 'удаление', 1, 0.00017699999807518907]","['BST', 'случайный', 'удаление', 2, 0.00020430000222404487]","['BST', 'случайный', 'удаление', 3, 0.00013140000010025688]","['BST', 'случайный', 'удаление', 4, 0.00014169999849400483]","['BST', 'случайный', 'удаление', 5, 0.00016059999688877724]","['BST', 'удаление', 'среднее', 0.00016299999915645458]","['LinkedList', 'отсортированный', 'вставка', 1, 0.002340299997740658]","['LinkedList', 'отсортированный', 'вставка', 2, 0.001320899998972891]","['LinkedList', 'отсортированный', 'вставка', 3, 0.001245399998879293]","['LinkedList', 'отсортированный', 'вставка', 4, 0.001359599998977501]","['LinkedList', 'отсортированный', 'вставка', 5, 0.0013001999977859668]","['LinkedList', 'вставка', 'среднее', 0.001513279998471262]","['LinkedList', 'отсортированный', 'поиск', 1, 8.799997885944322e-06]","['LinkedList', 'отсортированный', 'поиск', 2, 7.90000194683671e-06]","['LinkedList', 'отсортированный', 'поиск', 3, 5.49999822396785e-06]","['LinkedList', 'отсортированный', 'поиск', 4, 5.40000110049732e-06]","['LinkedList', 'отсортированный', 'поиск', 5, 5.300000339047983e-06]","['LinkedList', 'поиск', 'среднее', 6.5799998992588374e-06]","['LinkedList', 'отсортированный', 'удаление', 1, 4.2400002712383866e-05]","['LinkedList', 'отсортированный', 'удаление', 2, 3.5000011848751456e-06]","['LinkedList', 'отсортированный', 'удаление', 3, 2.9000002541579306e-06]","['LinkedList', 'отсортированный', 'удаление', 4, 5.800000508315861e-06]","['LinkedList', 'отсортированный', 'удаление', 5, 4.800000169780105e-06]","['LinkedList', 'удаление', 'среднее', 1.1880000965902581e-05]","['HashTable', 'отсортированный', 'вставка', 1, 0.01072819999899366]","['HashTable', 'отсортированный', 'вставка', 2, 0.010679200000595301]","['HashTable', 'отсортированный', 'вставка', 3, 0.010472300000401447]","['HashTable', 'отсортированный', 'вставка', 4, 0.011017800003173761]","['HashTable', 'отсортированный', 'вставка', 5, 0.010098599999764701]","['HashTable', 'вставка', 'среднее', 0.010599220000585774]","['HashTable', 'отсортированный', 'поиск', 1, 0.00010120000297320075]","['HashTable', 'отсортированный', 'поиск', 2, 0.0003209000024071429]","['HashTable', 'отсортированный', 'поиск', 3, 0.00010620000102790073]","['HashTable', 'отсортированный', 'поиск', 4, 0.00013010000111535192]","['HashTable', 'отсортированный', 'поиск', 5, 0.00011129999984405003]","['HashTable', 'поиск', 'среднее', 0.00015394000147352926]","['HashTable', 'отсортированный', 'удаление', 1, 5.6400000175926834e-05]","['HashTable', 'отсортированный', 'удаление', 2, 5.2999999752501026e-05]","['HashTable', 'отсортированный', 'удаление', 3, 5.6499997299397364e-05]","['HashTable', 'отсортированный', 'удаление', 4, 9.620000128052197e-05]","['HashTable', 'отсортированный', 'удаление', 5, 4.959999932907522e-05]","['HashTable', 'удаление', 'среднее', 6.233999956748449e-05]","['BST', 'отсортированный', 'вставка', 1, 5.633519200000592]","['BST', 'отсортированный', 'вставка', 2, 5.523590500000864]","['BST', 'отсортированный', 'вставка', 3, 5.242755499999475]","['BST', 'отсортированный', 'вставка', 4, 5.394866700000421]","['BST', 'отсортированный', 'вставка', 5, 5.2476690000003146]","['BST', 'вставка', 'среднее', 5.408480180000334]","['BST', 'отсортированный', 'поиск', 1, 0.047546699999656994]","['BST', 'отсортированный', 'поиск', 2, 0.049641900001006434]","['BST', 'отсортированный', 'поиск', 3, 0.04535329999998794]","['BST', 'отсортированный', 'поиск', 4, 0.04351699999824632]","['BST', 'отсортированный', 'поиск', 5, 0.04374180000013439]","['BST', 'поиск', 'среднее', 0.045960139999806415]","['BST', 'отсортированный', 'удаление', 1, 0.02838540000084322]","['BST', 'отсортированный', 'удаление', 2, 0.028794899997592438]","['BST', 'отсортированный', 'удаление', 3, 0.027610299999651033]","['BST', 'отсортированный', 'удаление', 4, 0.03072009999959846]","['BST', 'отсортированный', 'удаление', 5, 0.0289465999994718]","['BST', 'удаление', 'среднее', 0.02889145999943139]" diff --git a/konnovaea/experiments.py b/konnovaea/experiments.py index a8f72a3..c1ea7ea 100644 --- a/konnovaea/experiments.py +++ b/konnovaea/experiments.py @@ -252,7 +252,7 @@ def save_result_to_csv(all_results): csv_rows.append([struct, "удаление", "среднее", res['delete_avg']]) - with open("docs/data/resurts.csv", "w", newline="", encoding="utf-8") as f: + with open("docs/data/results.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(csv_rows) print(f"\nрезультаты сохранены") From 09e7e59f5521df55bdc4c391e53a0e3ff3f33e68 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 22:04:01 +0300 Subject: [PATCH 13/32] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20csv=202.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/docs/data/results.csv | 109 ++++++++++++++++++++++++++++++++ konnovaea/docs/data/resurts.csv | 1 - konnovaea/experiments.py | 57 ++++++++--------- 3 files changed, 136 insertions(+), 31 deletions(-) create mode 100644 konnovaea/docs/data/results.csv delete mode 100644 konnovaea/docs/data/resurts.csv diff --git a/konnovaea/docs/data/results.csv b/konnovaea/docs/data/results.csv new file mode 100644 index 0000000..d02feb5 --- /dev/null +++ b/konnovaea/docs/data/results.csv @@ -0,0 +1,109 @@ +Структура, Режим, Операция, Замер, Время (сек) +LinkedList,случайный,вставка,1,0.0026327000014134683 +LinkedList,случайный,вставка,2,0.002111699999659322 +LinkedList,случайный,вставка,3,0.0032677000017429236 +LinkedList,случайный,вставка,4,0.001870000000053551 +LinkedList,случайный,вставка,5,0.0015884999993431848 +LinkedList,случайный,вставка,среднее,0.00229412000044249 +LinkedList,случайный,поиск,1,6.800000846851617e-06 +LinkedList,случайный,поиск,2,8.099999831756577e-06 +LinkedList,случайный,поиск,3,5.40000110049732e-06 +LinkedList,случайный,поиск,4,7.99999907030724e-06 +LinkedList,случайный,поиск,5,8.600000001024455e-06 +LinkedList,случайный,поиск,среднее,7.380000170087442e-06 +LinkedList,случайный,удаление,1,4.499997885432094e-06 +LinkedList,случайный,удаление,2,4.19999923906289e-06 +LinkedList,случайный,удаление,3,4.599998646881431e-06 +LinkedList,случайный,удаление,4,3.5999983083456755e-06 +LinkedList,случайный,удаление,5,5.800000508315861e-06 +LinkedList,случайный,удаление,среднее,4.53999891760759e-06 +HashTable,случайный,вставка,1,0.013042499998846324 +HashTable,случайный,вставка,2,0.010821200001373654 +HashTable,случайный,вставка,3,0.01149979999900097 +HashTable,случайный,вставка,4,0.012371500000881497 +HashTable,случайный,вставка,5,0.01258369999777642 +HashTable,случайный,вставка,среднее,0.012063739999575773 +HashTable,случайный,поиск,1,0.00011100000119768083 +HashTable,случайный,поиск,2,0.00012829999832320027 +HashTable,случайный,поиск,3,0.00010610000026645139 +HashTable,случайный,поиск,4,0.00015050000001792796 +HashTable,случайный,поиск,5,0.00011000000085914508 +HashTable,случайный,поиск,среднее,0.00012118000013288111 +HashTable,случайный,удаление,1,5.6700002460274845e-05 +HashTable,случайный,удаление,2,5.410000085248612e-05 +HashTable,случайный,удаление,3,0.000103599999420112 +HashTable,случайный,удаление,4,5.430000237538479e-05 +HashTable,случайный,удаление,5,0.00012520000018412247 +HashTable,случайный,удаление,среднее,7.878000105847605e-05 +BST,случайный,вставка,1,0.022040200001356425 +BST,случайный,вставка,2,0.02033830000073067 +BST,случайный,вставка,3,0.023025400001642993 +BST,случайный,вставка,4,0.021383999999670777 +BST,случайный,вставка,5,0.028112400003010407 +BST,случайный,вставка,среднее,0.022980060001282256 +BST,случайный,поиск,1,0.0003209000024071429 +BST,случайный,поиск,2,0.0002975999996124301 +BST,случайный,поиск,3,0.0002946999993582722 +BST,случайный,поиск,4,0.00029429999995045364 +BST,случайный,поиск,5,0.0003305000027467031 +BST,случайный,поиск,среднее,0.0003076000008150004 +BST,случайный,удаление,1,0.00019420000171521679 +BST,случайный,удаление,2,0.00015970000094966963 +BST,случайный,удаление,3,0.00017920000027515925 +BST,случайный,удаление,4,0.00023010000222711824 +BST,случайный,удаление,5,0.00015329999951063655 +BST,случайный,удаление,среднее,0.0001833000009355601 +LinkedList,отсортированный,вставка,1,0.001523099999758415 +LinkedList,отсортированный,вставка,2,0.0014689999989059288 +LinkedList,отсортированный,вставка,3,0.0020084999996470287 +LinkedList,отсортированный,вставка,4,0.001334699998551514 +LinkedList,отсортированный,вставка,5,0.0013204000024416018 +LinkedList,отсортированный,вставка,среднее,0.0015311399998608976 +LinkedList,отсортированный,поиск,1,6.199999916134402e-06 +LinkedList,отсортированный,поиск,2,7.699996785959229e-06 +LinkedList,отсортированный,поиск,3,1.049999991664663e-05 +LinkedList,отсортированный,поиск,4,1.6500001947861165e-05 +LinkedList,отсортированный,поиск,5,5.999998393235728e-06 +LinkedList,отсортированный,поиск,среднее,9.379999391967431e-06 +LinkedList,отсортированный,удаление,1,2.8000031306874007e-06 +LinkedList,отсортированный,удаление,2,4.300000000512227e-06 +LinkedList,отсортированный,удаление,3,3.2999996619764715e-06 +LinkedList,отсортированный,удаление,4,2.4999972083605826e-06 +LinkedList,отсортированный,удаление,5,1.179999890155159e-05 +LinkedList,отсортированный,удаление,среднее,4.9399997806176545e-06 +HashTable,отсортированный,вставка,1,0.00991520000025048 +HashTable,отсортированный,вставка,2,0.010728299999755109 +HashTable,отсортированный,вставка,3,0.010542399999394547 +HashTable,отсортированный,вставка,4,0.009933500001352513 +HashTable,отсортированный,вставка,5,0.010409299997263588 +HashTable,отсортированный,вставка,среднее,0.010305739999603247 +HashTable,отсортированный,поиск,1,0.0002734000008786097 +HashTable,отсортированный,поиск,2,0.00026509999952395447 +HashTable,отсортированный,поиск,3,0.00010439999823574908 +HashTable,отсортированный,поиск,4,0.00015179999900283292 +HashTable,отсортированный,поиск,5,0.0002571000004536472 +HashTable,отсортированный,поиск,среднее,0.00021035999961895868 +HashTable,отсортированный,удаление,1,5.560000136028975e-05 +HashTable,отсортированный,удаление,2,0.00011499999891384505 +HashTable,отсортированный,удаление,3,7.330000153160654e-05 +HashTable,отсортированный,удаление,4,0.00010929999916697852 +HashTable,отсортированный,удаление,5,5.330000203684904e-05 +HashTable,отсортированный,удаление,среднее,8.130000060191378e-05 +BST,отсортированный,вставка,1,7.89803430000029 +BST,отсортированный,вставка,2,10.66406199999983 +BST,отсортированный,вставка,3,4.9183209000002535 +BST,отсортированный,вставка,4,4.762505400001828 +BST,отсортированный,вставка,5,4.723310599998513 +BST,отсортированный,вставка,среднее,6.593246640000143 +BST,отсортированный,поиск,1,0.04402579999805312 +BST,отсортированный,поиск,2,0.04447000000072876 +BST,отсортированный,поиск,3,0.04556789999696775 +BST,отсортированный,поиск,4,0.04493789999833098 +BST,отсортированный,поиск,5,0.04496440000002622 +BST,отсортированный,поиск,среднее,0.044793199998821365 +BST,отсортированный,удаление,1,0.021394800001871772 +BST,отсортированный,удаление,2,0.02051940000092145 +BST,отсортированный,удаление,3,0.021468799997819588 +BST,отсортированный,удаление,4,0.02171239999734098 +BST,отсортированный,удаление,5,0.01968499999929918 +BST,отсортированный,удаление,среднее,0.020956079999450594 diff --git a/konnovaea/docs/data/resurts.csv b/konnovaea/docs/data/resurts.csv deleted file mode 100644 index cf27ee1..0000000 --- a/konnovaea/docs/data/resurts.csv +++ /dev/null @@ -1 +0,0 @@ -"['Структура', 'Режим', 'Операция', 'Номер_замера', 'Время(сек)']","['LinkedList', 'случайный', 'вставка', 1, 0.0019962000005762093]","['LinkedList', 'случайный', 'вставка', 2, 0.002358600002480671]","['LinkedList', 'случайный', 'вставка', 3, 0.00338009999904898]","['LinkedList', 'случайный', 'вставка', 4, 0.0017534999969939236]","['LinkedList', 'случайный', 'вставка', 5, 0.001513299997895956]","['LinkedList', 'вставка', 'среднее', 0.002200339999399148]","['LinkedList', 'случайный', 'поиск', 1, 7.200000254670158e-06]","['LinkedList', 'случайный', 'поиск', 2, 8.099999831756577e-06]","['LinkedList', 'случайный', 'поиск', 3, 5.800000508315861e-06]","['LinkedList', 'случайный', 'поиск', 4, 1.4799999917158857e-05]","['LinkedList', 'случайный', 'поиск', 5, 8.800001523923129e-06]","['LinkedList', 'поиск', 'среднее', 8.940000407164917e-06]","['LinkedList', 'случайный', 'удаление', 1, 3.5000011848751456e-06]","['LinkedList', 'случайный', 'удаление', 2, 4.1000021155923605e-06]","['LinkedList', 'случайный', 'удаление', 3, 5.500000042957254e-05]","['LinkedList', 'случайный', 'удаление', 4, 2.7999994927085936e-06]","['LinkedList', 'случайный', 'удаление', 5, 2.6000016077887267e-06]","['LinkedList', 'удаление', 'среднее', 1.3600000966107472e-05]","['HashTable', 'случайный', 'вставка', 1, 0.016466400000354042]","['HashTable', 'случайный', 'вставка', 2, 0.01572669999950449]","['HashTable', 'случайный', 'вставка', 3, 0.012243599998328136]","['HashTable', 'случайный', 'вставка', 4, 0.012327000000368571]","['HashTable', 'случайный', 'вставка', 5, 0.01224759999968228]","['HashTable', 'вставка', 'среднее', 0.013802259999647504]","['HashTable', 'случайный', 'поиск', 1, 0.0003924999982700683]","['HashTable', 'случайный', 'поиск', 2, 0.00015640000128769316]","['HashTable', 'случайный', 'поиск', 3, 0.00021699999706470408]","['HashTable', 'случайный', 'поиск', 4, 0.0001894999986689072]","['HashTable', 'случайный', 'поиск', 5, 0.00010560000009718351]","['HashTable', 'поиск', 'среднее', 0.00021219999907771126]","['HashTable', 'случайный', 'удаление', 1, 5.8900001022266224e-05]","['HashTable', 'случайный', 'удаление', 2, 5.48999996681232e-05]","['HashTable', 'случайный', 'удаление', 3, 5.3499999921768904e-05]","['HashTable', 'случайный', 'удаление', 4, 5.569999848376028e-05]","['HashTable', 'случайный', 'удаление', 5, 5.270000110613182e-05]","['HashTable', 'удаление', 'среднее', 5.514000004041009e-05]","['BST', 'случайный', 'вставка', 1, 0.02389969999785535]","['BST', 'случайный', 'вставка', 2, 0.0244684999997844]","['BST', 'случайный', 'вставка', 3, 0.026340499996877043]","['BST', 'случайный', 'вставка', 4, 0.02651980000155163]","['BST', 'случайный', 'вставка', 5, 0.023325299996940885]","['BST', 'вставка', 'среднее', 0.024910759998601862]","['BST', 'случайный', 'поиск', 1, 0.0002482999989297241]","['BST', 'случайный', 'поиск', 2, 0.0002702000019780826]","['BST', 'случайный', 'поиск', 3, 0.0002458000017213635]","['BST', 'случайный', 'поиск', 4, 0.00024990000019897707]","['BST', 'случайный', 'поиск', 5, 0.00025649999952293]","['BST', 'поиск', 'среднее', 0.0002541400004702155]","['BST', 'случайный', 'удаление', 1, 0.00017699999807518907]","['BST', 'случайный', 'удаление', 2, 0.00020430000222404487]","['BST', 'случайный', 'удаление', 3, 0.00013140000010025688]","['BST', 'случайный', 'удаление', 4, 0.00014169999849400483]","['BST', 'случайный', 'удаление', 5, 0.00016059999688877724]","['BST', 'удаление', 'среднее', 0.00016299999915645458]","['LinkedList', 'отсортированный', 'вставка', 1, 0.002340299997740658]","['LinkedList', 'отсортированный', 'вставка', 2, 0.001320899998972891]","['LinkedList', 'отсортированный', 'вставка', 3, 0.001245399998879293]","['LinkedList', 'отсортированный', 'вставка', 4, 0.001359599998977501]","['LinkedList', 'отсортированный', 'вставка', 5, 0.0013001999977859668]","['LinkedList', 'вставка', 'среднее', 0.001513279998471262]","['LinkedList', 'отсортированный', 'поиск', 1, 8.799997885944322e-06]","['LinkedList', 'отсортированный', 'поиск', 2, 7.90000194683671e-06]","['LinkedList', 'отсортированный', 'поиск', 3, 5.49999822396785e-06]","['LinkedList', 'отсортированный', 'поиск', 4, 5.40000110049732e-06]","['LinkedList', 'отсортированный', 'поиск', 5, 5.300000339047983e-06]","['LinkedList', 'поиск', 'среднее', 6.5799998992588374e-06]","['LinkedList', 'отсортированный', 'удаление', 1, 4.2400002712383866e-05]","['LinkedList', 'отсортированный', 'удаление', 2, 3.5000011848751456e-06]","['LinkedList', 'отсортированный', 'удаление', 3, 2.9000002541579306e-06]","['LinkedList', 'отсортированный', 'удаление', 4, 5.800000508315861e-06]","['LinkedList', 'отсортированный', 'удаление', 5, 4.800000169780105e-06]","['LinkedList', 'удаление', 'среднее', 1.1880000965902581e-05]","['HashTable', 'отсортированный', 'вставка', 1, 0.01072819999899366]","['HashTable', 'отсортированный', 'вставка', 2, 0.010679200000595301]","['HashTable', 'отсортированный', 'вставка', 3, 0.010472300000401447]","['HashTable', 'отсортированный', 'вставка', 4, 0.011017800003173761]","['HashTable', 'отсортированный', 'вставка', 5, 0.010098599999764701]","['HashTable', 'вставка', 'среднее', 0.010599220000585774]","['HashTable', 'отсортированный', 'поиск', 1, 0.00010120000297320075]","['HashTable', 'отсортированный', 'поиск', 2, 0.0003209000024071429]","['HashTable', 'отсортированный', 'поиск', 3, 0.00010620000102790073]","['HashTable', 'отсортированный', 'поиск', 4, 0.00013010000111535192]","['HashTable', 'отсортированный', 'поиск', 5, 0.00011129999984405003]","['HashTable', 'поиск', 'среднее', 0.00015394000147352926]","['HashTable', 'отсортированный', 'удаление', 1, 5.6400000175926834e-05]","['HashTable', 'отсортированный', 'удаление', 2, 5.2999999752501026e-05]","['HashTable', 'отсортированный', 'удаление', 3, 5.6499997299397364e-05]","['HashTable', 'отсортированный', 'удаление', 4, 9.620000128052197e-05]","['HashTable', 'отсортированный', 'удаление', 5, 4.959999932907522e-05]","['HashTable', 'удаление', 'среднее', 6.233999956748449e-05]","['BST', 'отсортированный', 'вставка', 1, 5.633519200000592]","['BST', 'отсортированный', 'вставка', 2, 5.523590500000864]","['BST', 'отсортированный', 'вставка', 3, 5.242755499999475]","['BST', 'отсортированный', 'вставка', 4, 5.394866700000421]","['BST', 'отсортированный', 'вставка', 5, 5.2476690000003146]","['BST', 'вставка', 'среднее', 5.408480180000334]","['BST', 'отсортированный', 'поиск', 1, 0.047546699999656994]","['BST', 'отсортированный', 'поиск', 2, 0.049641900001006434]","['BST', 'отсортированный', 'поиск', 3, 0.04535329999998794]","['BST', 'отсортированный', 'поиск', 4, 0.04351699999824632]","['BST', 'отсортированный', 'поиск', 5, 0.04374180000013439]","['BST', 'поиск', 'среднее', 0.045960139999806415]","['BST', 'отсортированный', 'удаление', 1, 0.02838540000084322]","['BST', 'отсортированный', 'удаление', 2, 0.028794899997592438]","['BST', 'отсортированный', 'удаление', 3, 0.027610299999651033]","['BST', 'отсортированный', 'удаление', 4, 0.03072009999959846]","['BST', 'отсортированный', 'удаление', 5, 0.0289465999994718]","['BST', 'удаление', 'среднее', 0.02889145999943139]" diff --git a/konnovaea/experiments.py b/konnovaea/experiments.py index c1ea7ea..349e57b 100644 --- a/konnovaea/experiments.py +++ b/konnovaea/experiments.py @@ -225,37 +225,34 @@ def run_bst_experiments(records, mode_name): 'delete_avg': avg_delete, 'delete_all': delete_times } -def save_result_to_csv(all_results): +def save_results_to_csv(all_results): + os.makedirs("docs/data", exist_ok=True) - - csv_rows = [] - - csv_rows.append(["Структура", "Режим", "Операция", "Номер_замера", "Время(сек)"]) - - for res in all_results: - struct = res['structure'] - mode = res['mode'] - - for i, t in enumerate(res['insert_all']): - csv_rows.append([struct, mode, "вставка", i+1, t]) - - csv_rows.append([struct, "вставка", "среднее", res['insert_avg']]) - - for i, t in enumerate(res['find_all']): - csv_rows.append([struct, mode, "поиск", i+1, t]) - - csv_rows.append([struct, "поиск", "среднее", res['find_avg']]) - - for i, t in enumerate(res['delete_all']): - csv_rows.append([struct, mode, "удаление", i+1, t]) - - csv_rows.append([struct, "удаление", "среднее", res['delete_avg']]) - - with open("docs/data/results.csv", "w", newline="", encoding="utf-8") as f: - writer = csv.writer(f) - writer.writerow(csv_rows) - print(f"\nрезультаты сохранены") + + 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("эксперименты по замеру производительности") @@ -276,7 +273,7 @@ def main(): all_results.append(run_hash_experiments(records_sorted, "отсортированный")) all_results.append(run_bst_experiments(records_sorted, "отсортированный")) - save_result_to_csv(all_results) + save_results_to_csv(all_results) if __name__== "__main__": main() From cfa44a996c4c41352b790acbbe56122432fe6167 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Mon, 4 May 2026 19:09:16 +0300 Subject: [PATCH 14/32] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D1=88?= =?UTF-8?q?=D0=BB=D0=BE=20=D1=83=D1=81=D0=BF=D0=B5=D1=88=D0=BD=D0=BE,=20?= =?UTF-8?q?=D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D1=80=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B7=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/docs/data/results.csv | 214 ++++++++++++++++---------------- 1 file changed, 107 insertions(+), 107 deletions(-) diff --git a/konnovaea/docs/data/results.csv b/konnovaea/docs/data/results.csv index d02feb5..9664ef7 100644 --- a/konnovaea/docs/data/results.csv +++ b/konnovaea/docs/data/results.csv @@ -1,109 +1,109 @@ Структура, Режим, Операция, Замер, Время (сек) -LinkedList,случайный,вставка,1,0.0026327000014134683 -LinkedList,случайный,вставка,2,0.002111699999659322 -LinkedList,случайный,вставка,3,0.0032677000017429236 -LinkedList,случайный,вставка,4,0.001870000000053551 -LinkedList,случайный,вставка,5,0.0015884999993431848 -LinkedList,случайный,вставка,среднее,0.00229412000044249 -LinkedList,случайный,поиск,1,6.800000846851617e-06 -LinkedList,случайный,поиск,2,8.099999831756577e-06 -LinkedList,случайный,поиск,3,5.40000110049732e-06 -LinkedList,случайный,поиск,4,7.99999907030724e-06 -LinkedList,случайный,поиск,5,8.600000001024455e-06 -LinkedList,случайный,поиск,среднее,7.380000170087442e-06 -LinkedList,случайный,удаление,1,4.499997885432094e-06 -LinkedList,случайный,удаление,2,4.19999923906289e-06 -LinkedList,случайный,удаление,3,4.599998646881431e-06 -LinkedList,случайный,удаление,4,3.5999983083456755e-06 -LinkedList,случайный,удаление,5,5.800000508315861e-06 -LinkedList,случайный,удаление,среднее,4.53999891760759e-06 -HashTable,случайный,вставка,1,0.013042499998846324 -HashTable,случайный,вставка,2,0.010821200001373654 -HashTable,случайный,вставка,3,0.01149979999900097 -HashTable,случайный,вставка,4,0.012371500000881497 -HashTable,случайный,вставка,5,0.01258369999777642 -HashTable,случайный,вставка,среднее,0.012063739999575773 -HashTable,случайный,поиск,1,0.00011100000119768083 -HashTable,случайный,поиск,2,0.00012829999832320027 -HashTable,случайный,поиск,3,0.00010610000026645139 -HashTable,случайный,поиск,4,0.00015050000001792796 -HashTable,случайный,поиск,5,0.00011000000085914508 -HashTable,случайный,поиск,среднее,0.00012118000013288111 -HashTable,случайный,удаление,1,5.6700002460274845e-05 -HashTable,случайный,удаление,2,5.410000085248612e-05 -HashTable,случайный,удаление,3,0.000103599999420112 -HashTable,случайный,удаление,4,5.430000237538479e-05 -HashTable,случайный,удаление,5,0.00012520000018412247 -HashTable,случайный,удаление,среднее,7.878000105847605e-05 -BST,случайный,вставка,1,0.022040200001356425 -BST,случайный,вставка,2,0.02033830000073067 -BST,случайный,вставка,3,0.023025400001642993 -BST,случайный,вставка,4,0.021383999999670777 -BST,случайный,вставка,5,0.028112400003010407 -BST,случайный,вставка,среднее,0.022980060001282256 -BST,случайный,поиск,1,0.0003209000024071429 -BST,случайный,поиск,2,0.0002975999996124301 -BST,случайный,поиск,3,0.0002946999993582722 -BST,случайный,поиск,4,0.00029429999995045364 -BST,случайный,поиск,5,0.0003305000027467031 -BST,случайный,поиск,среднее,0.0003076000008150004 -BST,случайный,удаление,1,0.00019420000171521679 -BST,случайный,удаление,2,0.00015970000094966963 -BST,случайный,удаление,3,0.00017920000027515925 -BST,случайный,удаление,4,0.00023010000222711824 -BST,случайный,удаление,5,0.00015329999951063655 -BST,случайный,удаление,среднее,0.0001833000009355601 -LinkedList,отсортированный,вставка,1,0.001523099999758415 -LinkedList,отсортированный,вставка,2,0.0014689999989059288 -LinkedList,отсортированный,вставка,3,0.0020084999996470287 -LinkedList,отсортированный,вставка,4,0.001334699998551514 -LinkedList,отсортированный,вставка,5,0.0013204000024416018 -LinkedList,отсортированный,вставка,среднее,0.0015311399998608976 -LinkedList,отсортированный,поиск,1,6.199999916134402e-06 -LinkedList,отсортированный,поиск,2,7.699996785959229e-06 -LinkedList,отсортированный,поиск,3,1.049999991664663e-05 -LinkedList,отсортированный,поиск,4,1.6500001947861165e-05 -LinkedList,отсортированный,поиск,5,5.999998393235728e-06 -LinkedList,отсортированный,поиск,среднее,9.379999391967431e-06 -LinkedList,отсортированный,удаление,1,2.8000031306874007e-06 +LinkedList,случайный,вставка,1,0.011328999999932421 +LinkedList,случайный,вставка,2,0.0023913999993965263 +LinkedList,случайный,вставка,3,0.0017174000004160916 +LinkedList,случайный,вставка,4,0.0017204000005222042 +LinkedList,случайный,вставка,5,0.0016142999993462581 +LinkedList,случайный,вставка,среднее,0.0037544999999227003 +LinkedList,случайный,поиск,1,7.3999999585794285e-06 +LinkedList,случайный,поиск,2,1.1699999959091656e-05 +LinkedList,случайный,поиск,3,8.099999831756577e-06 +LinkedList,случайный,поиск,4,5.899999450775795e-06 +LinkedList,случайный,поиск,5,1.500000053056283e-05 +LinkedList,случайный,поиск,среднее,9.619999946153258e-06 +LinkedList,случайный,удаление,1,5.199999577598646e-06 +LinkedList,случайный,удаление,2,3.4000004234258085e-06 +LinkedList,случайный,удаление,3,3.9000005926936865e-06 +LinkedList,случайный,удаление,4,4.399999852466863e-06 +LinkedList,случайный,удаление,5,2.2599999283556826e-05 +LinkedList,случайный,удаление,среднее,7.899999945948367e-06 +HashTable,случайный,вставка,1,0.013529500000004191 +HashTable,случайный,вставка,2,0.017691199999717355 +HashTable,случайный,вставка,3,0.016795400000773952 +HashTable,случайный,вставка,4,0.015214900000501075 +HashTable,случайный,вставка,5,0.012209399999846937 +HashTable,случайный,вставка,среднее,0.015088080000168702 +HashTable,случайный,поиск,1,0.00028960000054212287 +HashTable,случайный,поиск,2,0.0001171000003523659 +HashTable,случайный,поиск,3,0.00013169999965612078 +HashTable,случайный,поиск,4,0.00011999999969702912 +HashTable,случайный,поиск,5,0.00016460000006190967 +HashTable,случайный,поиск,среднее,0.00016460000006190967 +HashTable,случайный,удаление,1,0.0001094999997803825 +HashTable,случайный,удаление,2,0.00011030000041500898 +HashTable,случайный,удаление,3,6.83999996908824e-05 +HashTable,случайный,удаление,4,6.479999956354732e-05 +HashTable,случайный,удаление,5,0.0001382000000376138 +HashTable,случайный,удаление,среднее,9.8239999897487e-05 +BST,случайный,вставка,1,0.02586410000003525 +BST,случайный,вставка,2,0.023826999999982945 +BST,случайный,вставка,3,0.028718300000036834 +BST,случайный,вставка,4,0.02642329999980575 +BST,случайный,вставка,5,0.026569300000119256 +BST,случайный,вставка,среднее,0.026280399999996006 +BST,случайный,поиск,1,0.00024870000015653204 +BST,случайный,поиск,2,0.00022480000006908085 +BST,случайный,поиск,3,0.00033259999963775044 +BST,случайный,поиск,4,0.00025629999981902074 +BST,случайный,поиск,5,0.00023359999977401458 +BST,случайный,поиск,среднее,0.00025919999989127974 +BST,случайный,удаление,1,0.00018809999983204762 +BST,случайный,удаление,2,0.00015689999963797163 +BST,случайный,удаление,3,0.00014709999959450215 +BST,случайный,удаление,4,0.0001754000004439149 +BST,случайный,удаление,5,0.00018170000021200394 +BST,случайный,удаление,среднее,0.00016983999994408806 +LinkedList,отсортированный,вставка,1,0.0013518000005205977 +LinkedList,отсортированный,вставка,2,0.0014992999995229184 +LinkedList,отсортированный,вставка,3,0.0033320000002277084 +LinkedList,отсортированный,вставка,4,0.001253299999916635 +LinkedList,отсортированный,вставка,5,0.0013355999999475898 +LinkedList,отсортированный,вставка,среднее,0.0017544000000270898 +LinkedList,отсортированный,поиск,1,6.299999768089037e-06 +LinkedList,отсортированный,поиск,2,5.800000508315861e-06 +LinkedList,отсортированный,поиск,3,5.699999746866524e-06 +LinkedList,отсортированный,поиск,4,5.500000042957254e-06 +LinkedList,отсортированный,поиск,5,1.9600000086938962e-05 +LinkedList,отсортированный,поиск,среднее,8.580000030633528e-06 +LinkedList,отсортированный,удаление,1,2.8000004022032954e-06 LinkedList,отсортированный,удаление,2,4.300000000512227e-06 -LinkedList,отсортированный,удаление,3,3.2999996619764715e-06 -LinkedList,отсортированный,удаление,4,2.4999972083605826e-06 -LinkedList,отсортированный,удаление,5,1.179999890155159e-05 -LinkedList,отсортированный,удаление,среднее,4.9399997806176545e-06 -HashTable,отсортированный,вставка,1,0.00991520000025048 -HashTable,отсортированный,вставка,2,0.010728299999755109 -HashTable,отсортированный,вставка,3,0.010542399999394547 -HashTable,отсортированный,вставка,4,0.009933500001352513 -HashTable,отсортированный,вставка,5,0.010409299997263588 -HashTable,отсортированный,вставка,среднее,0.010305739999603247 -HashTable,отсортированный,поиск,1,0.0002734000008786097 -HashTable,отсортированный,поиск,2,0.00026509999952395447 -HashTable,отсортированный,поиск,3,0.00010439999823574908 -HashTable,отсортированный,поиск,4,0.00015179999900283292 -HashTable,отсортированный,поиск,5,0.0002571000004536472 -HashTable,отсортированный,поиск,среднее,0.00021035999961895868 -HashTable,отсортированный,удаление,1,5.560000136028975e-05 -HashTable,отсортированный,удаление,2,0.00011499999891384505 -HashTable,отсортированный,удаление,3,7.330000153160654e-05 -HashTable,отсортированный,удаление,4,0.00010929999916697852 -HashTable,отсортированный,удаление,5,5.330000203684904e-05 -HashTable,отсортированный,удаление,среднее,8.130000060191378e-05 -BST,отсортированный,вставка,1,7.89803430000029 -BST,отсортированный,вставка,2,10.66406199999983 -BST,отсортированный,вставка,3,4.9183209000002535 -BST,отсортированный,вставка,4,4.762505400001828 -BST,отсортированный,вставка,5,4.723310599998513 -BST,отсортированный,вставка,среднее,6.593246640000143 -BST,отсортированный,поиск,1,0.04402579999805312 -BST,отсортированный,поиск,2,0.04447000000072876 -BST,отсортированный,поиск,3,0.04556789999696775 -BST,отсортированный,поиск,4,0.04493789999833098 -BST,отсортированный,поиск,5,0.04496440000002622 -BST,отсортированный,поиск,среднее,0.044793199998821365 -BST,отсортированный,удаление,1,0.021394800001871772 -BST,отсортированный,удаление,2,0.02051940000092145 -BST,отсортированный,удаление,3,0.021468799997819588 -BST,отсортированный,удаление,4,0.02171239999734098 -BST,отсортированный,удаление,5,0.01968499999929918 -BST,отсортированный,удаление,среднее,0.020956079999450594 +LinkedList,отсортированный,удаление,3,2.6999996407539584e-06 +LinkedList,отсортированный,удаление,4,2.499999936844688e-06 +LinkedList,отсортированный,удаление,5,2.4000000848900527e-06 +LinkedList,отсортированный,удаление,среднее,2.9400000130408445e-06 +HashTable,отсортированный,вставка,1,0.013422199999695295 +HashTable,отсортированный,вставка,2,0.011119499999949767 +HashTable,отсортированный,вставка,3,0.01018590000057884 +HashTable,отсортированный,вставка,4,0.011275699999714561 +HashTable,отсортированный,вставка,5,0.010843500000191852 +HashTable,отсортированный,вставка,среднее,0.011369360000026063 +HashTable,отсортированный,поиск,1,0.0001083999995898921 +HashTable,отсортированный,поиск,2,0.00013240000043879263 +HashTable,отсортированный,поиск,3,0.0002434999996694387 +HashTable,отсортированный,поиск,4,0.0001129000002038083 +HashTable,отсортированный,поиск,5,0.0001036000003296067 +HashTable,отсортированный,поиск,среднее,0.0001401600000463077 +HashTable,отсортированный,удаление,1,5.670000064128544e-05 +HashTable,отсортированный,удаление,2,7.49000000723754e-05 +HashTable,отсортированный,удаление,3,5.3699999625678174e-05 +HashTable,отсортированный,удаление,4,5.450000026030466e-05 +HashTable,отсортированный,удаление,5,5.409999994299142e-05 +HashTable,отсортированный,удаление,среднее,5.878000010852702e-05 +BST,отсортированный,вставка,1,5.166896599999745 +BST,отсортированный,вставка,2,5.045173700000305 +BST,отсортированный,вставка,3,4.877277200000208 +BST,отсортированный,вставка,4,4.796063099999628 +BST,отсортированный,вставка,5,4.7685291000007055 +BST,отсортированный,вставка,среднее,4.930787940000118 +BST,отсортированный,поиск,1,0.05183889999989333 +BST,отсортированный,поиск,2,0.04380440000022645 +BST,отсортированный,поиск,3,0.044272600000113016 +BST,отсортированный,поиск,4,0.04941080000025977 +BST,отсортированный,поиск,5,0.04630559999986872 +BST,отсортированный,поиск,среднее,0.04712646000007226 +BST,отсортированный,удаление,1,0.023101800000404182 +BST,отсортированный,удаление,2,0.026490100000046368 +BST,отсортированный,удаление,3,0.02241980000053445 +BST,отсортированный,удаление,4,0.020923000000038883 +BST,отсортированный,удаление,5,0.022132500000225264 +BST,отсортированный,удаление,среднее,0.02301344000024983 From 1feef4201033321dafd935325764b1ca1bea1850 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Mon, 4 May 2026 19:51:45 +0300 Subject: [PATCH 15/32] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/docs/data/graph_delete.png | Bin 0 -> 52515 bytes konnovaea/docs/data/graph_insert.png | Bin 0 -> 49138 bytes konnovaea/docs/data/graph_search.png | Bin 0 -> 50925 bytes konnovaea/docs/data/отчет.ipynb | 0 konnovaea/make_graphs.py | 126 +++++++++++++++++++++++++++ 5 files changed, 126 insertions(+) create mode 100644 konnovaea/docs/data/graph_delete.png create mode 100644 konnovaea/docs/data/graph_insert.png create mode 100644 konnovaea/docs/data/graph_search.png create mode 100644 konnovaea/docs/data/отчет.ipynb create mode 100644 konnovaea/make_graphs.py diff --git a/konnovaea/docs/data/graph_delete.png b/konnovaea/docs/data/graph_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..75a26331398ba5f84f1f28290752ff50030dca50 GIT binary patch literal 52515 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�g4pL-L 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 vr9H!Iqb0#vr_+#J7g_p$#4F2D3! literal 0 HcmV?d00001 diff --git a/konnovaea/docs/data/graph_search.png b/konnovaea/docs/data/graph_search.png new file mode 100644 index 0000000000000000000000000000000000000000..c55c4ab27c05f8438f2291edd1523233f4855357 GIT binary patch literal 50925 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 literal 0 HcmV?d00001 diff --git a/konnovaea/docs/data/отчет.ipynb b/konnovaea/docs/data/отчет.ipynb new file mode 100644 index 0000000..e69de29 diff --git a/konnovaea/make_graphs.py b/konnovaea/make_graphs.py new file mode 100644 index 0000000..99312f6 --- /dev/null +++ b/konnovaea/make_graphs.py @@ -0,0 +1,126 @@ + +import matplotlib.pyplot as plt +import numpy as np +import os + + +os.makedirs('docs/data', exist_ok=True) + + +structures = ['LinkedList', 'HashTable', 'BST'] + +# Вставка 10000 записей +random_insert = [0.0037545, 0.015088, 0.026280] +sorted_insert = [0.0017544, 0.011369, 4.930788] + +# Поиск 110 записей +random_search = [0.00000962, 0.0001646, 0.0002592] +sorted_search = [0.00000858, 0.00014016, 0.047126] + +# Удаление 50 записей +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() +print(" График 1 сохранён: docs/data/graph_insert.png") + +# график поиск +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() +print(" График 2 сохранён: docs/data/graph_search.png") + +# график удаление +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() +print(" График 3 сохранён: docs/data/graph_delete.png") + From 4aec0f333644339c23e1ce9e5bcd92f4019fc47c Mon Sep 17 00:00:00 2001 From: konnovaea Date: Mon, 4 May 2026 20:13:14 +0300 Subject: [PATCH 16/32] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/docs/data/table_results.png | Bin 0 -> 107364 bytes konnovaea/docs/{data => }/отчет.ipynb | 0 konnovaea/make_tables.py | 40 ++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 konnovaea/docs/data/table_results.png rename konnovaea/docs/{data => }/отчет.ipynb (100%) create mode 100644 konnovaea/make_tables.py diff --git a/konnovaea/docs/data/table_results.png b/konnovaea/docs/data/table_results.png new file mode 100644 index 0000000000000000000000000000000000000000..feaf1a362d9702fe4a29122106ea5811fe995f9f GIT binary patch literal 107364 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 1: + table[(i+1, 2)].set_facecolor('#ffcccc') + table[(i+1, 2)].set_text_props(weight='bold') + +plt.title('Результаты экспериментов (среднее время в секундах)', fontsize=14, fontweight='bold', pad=20) +plt.savefig('docs/data/table_results.png', dpi=200, bbox_inches='tight', facecolor='white') +plt.close() + +print("Таблица сохранена: docs/data/table_results.png") \ No newline at end of file From 89f567e36525f93530eb3464bb26831b9b05961c Mon Sep 17 00:00:00 2001 From: konnovaea Date: Mon, 4 May 2026 20:13:58 +0300 Subject: [PATCH 17/32] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/make_tables.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/konnovaea/make_tables.py b/konnovaea/make_tables.py index a8afd48..fe4c880 100644 --- a/konnovaea/make_tables.py +++ b/konnovaea/make_tables.py @@ -1,7 +1,3 @@ -""" -Скрипт для создания таблицы результатов в виде изображения -Запуск: python make_tables.py -""" import matplotlib.pyplot as plt import os From 106ee680c185bcc5a76d200b1ad7c9bd55d0b101 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Mon, 4 May 2026 20:35:21 +0300 Subject: [PATCH 18/32] =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B0=D1=82=20=D0=BE?= =?UTF-8?q?=D1=82=D1=87=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/docs/отчет.ipynb | 259 +++++++++++++++++++++++++++++++++++++ konnovaea/make_graphs.py | 9 +- konnovaea/make_tables.py | 2 - 3 files changed, 262 insertions(+), 8 deletions(-) diff --git a/konnovaea/docs/отчет.ipynb b/konnovaea/docs/отчет.ipynb index e69de29..5d2e54d 100644 --- a/konnovaea/docs/отчет.ipynb +++ b/konnovaea/docs/отчет.ipynb @@ -0,0 +1,259 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d7f65344", + "metadata": {}, + "source": [ + "# Отчёт \n", + "## Телефонный справочник: реализация и сравнение структур данных\n", + "\n", + "**Студент:** Коннова Е.А.\n", + "**Группа:** 429\n", + "**Дата:**" + ] + }, + { + "cell_type": "markdown", + "id": "f69aa231", + "metadata": {}, + "source": [ + "## Введение\n", + "\n", + "### О чем работа.\n", + "В данной работе рассматриваются три базовые структуры данных:\n", + "- Связный список (LinkedList)\n", + "- Хеш-таблица (HashTable)\n", + "- Двоичное дерево поиска (BST)\n", + "\n", + "Они применяются для хранения записей телефонного справочника.\n", + "\n", + "### Цель всей работы\n", + "Реализовать три структуры данных «с нуля», применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций (вставка, поиск, удаление).\n", + "\n", + "### Задачи по достижению цели\n", + "1. Реализовать связный список с операциями insert, find, delete, list_all\n", + "2. Реализовать хеш-таблицу на основе связных списков\n", + "3. Реализовать двоичное дерево поиска\n", + "4. Сгенерировать тестовые данные (10000 записей)\n", + "5. Провести замеры времени для каждой структуры (5 повторений)\n", + "6. Сравнить результаты и сделать выводы" + ] + }, + { + "cell_type": "markdown", + "id": "56e2f617", + "metadata": {}, + "source": [ + "## Часть 1. Общая информация о структурах данных\n", + "\n", + "### 1.1 Для неспециалистов\n", + "\n", + "**Что такое структура данных?**\n", + "Это способ организации и хранения данных в компьютере.\n", + "\n", + "**Три структуры из работы:**\n", + "\n", + "| Структура | Как работает | Пример из жизни |\n", + "|-----------|--------------|-----------------|\n", + "| Связный список | Цепочка элементов, где каждый знает следующий | Верёвка с узелками |\n", + "| Хеш-таблица | Массив корзин, элемент попадает в корзину по номеру | Картотека с ящиками |\n", + "| Двоичное дерево | Иерархическая структура: левые меньше, правые больше | Телефонный справочник |\n", + "\n", + "### 1.2 Обзор технологий\n", + "\n", + "**Связный список**\n", + "- Узел: `{'name': str, 'phone': str, 'next': None}`\n", + "- Вставка: O(1) в начало, O(n) в конец\n", + "- Поиск: O(n) - линейный обход\n", + "- Удаление: O(n) - сначала найти\n", + "\n", + "**Хеш-таблица**\n", + "- Корзины: список из None или голов списков\n", + "- Хеш-функция: `hash = (hash * 31 + ord(ch)) % size`\n", + "- Вставка/поиск/удаление: O(1) в среднем\n", + "\n", + "**Двоичное дерево поиска (BST)**\n", + "- Узел: `{'name': str, 'phone': str, 'left': None, 'right': None}`\n", + "- Вставка/поиск/удаление: O(log n) в среднем, O(n) в худшем\n", + "\n", + "### 1.3 Обоснование выбора подхода\n", + "\n", + "**Почему именно эти структуры?**\n", + "1. Они фундаментальны и изучаются в курсе\n", + "2. Показывают разные компромиссы (скорость vs порядок)\n", + "3. Позволяют наглядно сравнить производительность\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "d9327709", + "metadata": {}, + "source": [ + "## Часть 2. Техническая реализация\n", + "\n", + "### 2.1 Постановка задачи\n", + "\n", + "Реализовать телефонный справочник с операциями:\n", + "- `insert(name, phone)` — добавить или обновить запись\n", + "- `find(name)` — вернуть телефон или None\n", + "- `delete(name)` — удалить запись\n", + "- `list_all()` — вернуть все записи, отсортированные по имени\n", + "\n", + "### 2.2 Верхнеуровневое решение\n", + "\n", + "**Связный список (LinkedList)**\n", + "- `ll_insert(head, name, phone)` — добавление в конец, возвращает голову\n", + "- `ll_find(head, name)` — линейный поиск, возвращает телефон или None\n", + "- `ll_delete(head, name)` — удаление с перепривязкой, возвращает голову\n", + "- `ll_list_all(head)` — сбор всех записей и сортировка\n", + "\n", + "**Хеш-таблица (HashTable)**\n", + "- `hash_function(name, size)` — ключ → номер корзины\n", + "- `ht_create(size)` — создание таблицы\n", + "- `ht_insert(buckets, name, phone)` — вызов ll_insert для нужной корзины\n", + "- `ht_find(buckets, name)` — вызов ll_find для нужной корзины\n", + "- `ht_delete(buckets, name)` — вызов ll_delete для нужной корзины\n", + "- `ht_list_all(buckets)` — сбор из всех корзин + сортировка\n", + "\n", + "**Двоичное дерево (BST)**\n", + "- `bst_insert(root, name, phone)` — итеративная вставка\n", + "- `bst_find(root, name)` — поиск\n", + "- `bst_delete(root, name)` — удаление с поиском преемника\n", + "- `bst_list_all(root)` — in-order обход (уже отсортировано)" + ] + }, + { + "cell_type": "markdown", + "id": "c1cd08d8", + "metadata": {}, + "source": [ + "## Часть 3. Эксперименты и результаты\n", + "\n", + "### 3.1 Инструменты и методика\n", + "\n", + "**Параметры эксперимента:**\n", + "- Количество записей: 10 000\n", + "- Количество повторений: 5\n", + "- Поиск: 100 существующих + 10 несуществующих\n", + "- Удаление: 50 случайных записей\n", + "- Режимы: случайный порядок, отсортированный порядок\n", + "\n", + "### 3.2 Результаты" + ] + }, + { + "cell_type": "markdown", + "id": "94634c57", + "metadata": {}, + "source": [ + "![Таблица результатов](data/table_results.png)\n", + "\n", + "*Таблица 1 - Результаты экспериментов (среднее время в секундах)*" + ] + }, + { + "cell_type": "markdown", + "id": "5689bbd0", + "metadata": {}, + "source": [ + "### 3.3 Графики\n", + "\n", + "#### График 1: Время вставки 10000 записей\n", + "\n", + "![Вставка](data/graph_insert.png)\n", + "\n", + "#### График 2: Время поиска 110 записей\n", + "\n", + "![Поиск](data/graph_search.png)\n", + "\n", + "#### График 3: Время удаления 50 записей\n", + "\n", + "![Удаление](data/graph_delete.png)" + ] + }, + { + "cell_type": "markdown", + "id": "5561d9dd", + "metadata": {}, + "source": [ + "### 3.4 Сравнение и анализ\n", + "\n", + "**Как порядок входных данных влияет на BST?**\n", + "\n", + "| Режим | Вставка | Поиск | Удаление |\n", + "|-------|---------|-------|----------|\n", + "| Случайный | 0.026 сек | 0.00026 сек | 0.00017 сек |\n", + "| Отсортированный | 4.931 сек | 0.047 сек | 0.023 сек |\n", + "\n", + "Вывод: На случайных данных BST работает быстро (O(log n)). На отсортированных данных BST вырождается в связный список (O(n)). Работает медленее в 190 раз.\n", + "\n", + "**Техническая ошибка:** Из-за ограничения глубины рекурсии в Python (1000 вызовов) рекурсивная реализация BST не смогла бы обработать 10000 записей. Поэтому все операции BST были реализованы итеративно.\n", + "\n", + "**Почему хеш-таблица не чувствительна к порядку?**\n", + "\n", + "Хеш-функция распределяет записи по корзинам независимо от порядка вставки. Распределение по корзинам равномерное.\n", + "\n", + "**Почему связный список всегда медленен при поиске?**\n", + "\n", + "Связный список не имеет индексов. Поэтому нужно перебирать элементы последовательно. Сложность поиска - O(n).\n", + "\n", + "**Как удаление работает в каждой структуре?**\n", + "\n", + "| Структура | Сложность |\n", + "|-----------|-----------|\n", + "| LinkedList | O(n) |\n", + "| HashTable | O(1) |\n", + "| BST | O(log n) / O(n) |\n", + "\n", + "В связных списках сначала нужно найти, потом перепривязать. В хеш-таблице сразу находишь корзину по хешу. В двоичном дереве нужно найти узел и перестроить поддеревья." + ] + }, + { + "cell_type": "markdown", + "id": "a57d1502", + "metadata": {}, + "source": [ + "## Заключение\n", + "\n", + "### Выводы из каждой части\n", + "\n", + "**Из части 1:**\n", + "- Каждая структура имеет свои теоретические характеристики\n", + "- Связный список - прост, но медленен\n", + "- Хеш-таблица - быстра, но не сохраняет порядок\n", + "- BST - быстр и сохраняет порядок, но требует балансировки\n", + "\n", + "**Из части 2:**\n", + "- Все три структуры успешно реализованы\n", + "- Хеш-таблица использует связный список для корзин\n", + "- BST написан итеративно для избежания RecursionError\n", + "\n", + "**Из части 3:**\n", + "- Эксперименты подтвердили теоретические оценки\n", + "- BST на отсортированных данных деградирует\n", + "- Хеш-таблица стабильна независимо от порядка\n", + "\n", + "### Итоговая рекомендация\n", + "\n", + "| Сценарий | Рекомендация | Причина |\n", + "|----------|--------------|---------|\n", + "| Частый поиск по ключу | Хеш-таблица | O(1) |\n", + "| Частые вставки/удаления | Хеш-таблица | Стабильная скорость |\n", + "| Нужен отсортированный вывод | Сбалансированное дерево | In-order обход |\n", + "| Данные поступают отсортированно | Хеш-таблица | BST деградирует |\n", + "| Мало данных (<100) | Любая | Разница незаметна |\n", + "\n", + "**Для телефонного справочника лучший выбор - хеш-таблица.**" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/konnovaea/make_graphs.py b/konnovaea/make_graphs.py index 99312f6..e23e7b6 100644 --- a/konnovaea/make_graphs.py +++ b/konnovaea/make_graphs.py @@ -9,15 +9,12 @@ os.makedirs('docs/data', exist_ok=True) structures = ['LinkedList', 'HashTable', 'BST'] -# Вставка 10000 записей random_insert = [0.0037545, 0.015088, 0.026280] sorted_insert = [0.0017544, 0.011369, 4.930788] -# Поиск 110 записей random_search = [0.00000962, 0.0001646, 0.0002592] sorted_search = [0.00000858, 0.00014016, 0.047126] -# Удаление 50 записей random_delete = [0.0000079, 0.00009824, 0.00016984] sorted_delete = [0.00000294, 0.00005878, 0.023013] @@ -56,7 +53,7 @@ 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() -print(" График 1 сохранён: docs/data/graph_insert.png") + # график поиск fig, ax = plt.subplots(figsize=(12, 7)) @@ -89,7 +86,7 @@ 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() -print(" График 2 сохранён: docs/data/graph_search.png") + # график удаление fig, ax = plt.subplots(figsize=(12, 7)) @@ -122,5 +119,5 @@ 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() -print(" График 3 сохранён: docs/data/graph_delete.png") + diff --git a/konnovaea/make_tables.py b/konnovaea/make_tables.py index fe4c880..211d6a5 100644 --- a/konnovaea/make_tables.py +++ b/konnovaea/make_tables.py @@ -32,5 +32,3 @@ for i, row in enumerate(data): plt.title('Результаты экспериментов (среднее время в секундах)', fontsize=14, fontweight='bold', pad=20) plt.savefig('docs/data/table_results.png', dpi=200, bbox_inches='tight', facecolor='white') plt.close() - -print("Таблица сохранена: docs/data/table_results.png") \ No newline at end of file From 0badfa58a5f9d11be3f66228d4868f4b5c1fd611 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Tue, 12 May 2026 20:26:53 +0300 Subject: [PATCH 19/32] =?UTF-8?q?=D0=BE=D1=82=D1=87=D0=B5=D1=82=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/docs/отчет.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/konnovaea/docs/отчет.ipynb b/konnovaea/docs/отчет.ipynb index 5d2e54d..f2b6cb9 100644 --- a/konnovaea/docs/отчет.ipynb +++ b/konnovaea/docs/отчет.ipynb @@ -10,7 +10,7 @@ "\n", "**Студент:** Коннова Е.А.\n", "**Группа:** 429\n", - "**Дата:**" + "**Дата:** 12.05.2026" ] }, { From 66379d36b59319a32ce528a02e0b2ff0399ffe69 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Mon, 18 May 2026 18:39:08 +0300 Subject: [PATCH 20/32] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20cel?= =?UTF-8?q?l=20=D0=B8=20maze?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/maze_solver.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 konnovaea/maze_solver.py diff --git a/konnovaea/maze_solver.py b/konnovaea/maze_solver.py new file mode 100644 index 0000000..e69de29 From 6932687d9c9dd55b306056c8857d1fde4b0a3319 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Mon, 18 May 2026 19:28:00 +0300 Subject: [PATCH 21/32] =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BB=D0=B0=D0=B1=D0=B8=D1=80=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=20=D0=B8=D0=B7=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20(Build?= =?UTF-8?q?er)=20=D0=B8=20=D1=83=D1=81=D0=BF=D0=B5=D1=88=D0=BD=D1=8B=D0=B9?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/maze1.txt | 5 ++ konnovaea/maze_solver.py | 120 +++++++++++++++++++++++++++++++++++++++ konnovaea/test.py | 1 + 3 files changed, 126 insertions(+) create mode 100644 konnovaea/maze1.txt create mode 100644 konnovaea/test.py diff --git a/konnovaea/maze1.txt b/konnovaea/maze1.txt new file mode 100644 index 0000000..2eacde7 --- /dev/null +++ b/konnovaea/maze1.txt @@ -0,0 +1,5 @@ +####### +#S # +# ### # +# E # +####### \ No newline at end of file diff --git a/konnovaea/maze_solver.py b/konnovaea/maze_solver.py index e69de29..1adae7a 100644 --- a/konnovaea/maze_solver.py +++ b/konnovaea/maze_solver.py @@ -0,0 +1,120 @@ +class Cell: + + def __init__(self, x, y): + self.x = x + self.y = y + self.is_wall = False + self.is_start = False + self.is_exit = False + + def is_passable(self): + return not self.is_wall + def __repr__(self): + return f"Cell({self.x}, {self.y})" + +class Maze: + + def __init__(self, width, height): + self.width = width + self.height = height + self.cells = [] + self.start = None + self.exit = None + + for y in range(height): + row = [] + for x in range(width): + row.append(Cell(x, y)) + self.cells.append(row) + + def get_cell(self, x, y): + + if 0 <= x < self.width and 0 <= y < self.height: + return self.cells[y][x] + return None + + def get_neighbors(self, cell): + + neighbors = [] + directions = [(0, -1), (0, 1), (-1, 0), (1,0)] + + for dx, dy in directions: + nx, ny = cell.x + dx, cell.y + dy + neighbor = self.get_cell(nx, ny) + if neighbor and neighbor.is_passable(): + neighbors.append(neighbor) + return neighbors + + def __repr__(self): + return f"Maze({self.width}x{self.height})" + + +from abc import ABC, abstractmethod + +class MazeBuilder(ABC): + + @abstractmethod + def build_from_file(self, filename): + pass + +class TextFileMazeBuilder(MazeBuilder): + + def build_from_file(self, filename): + + with open(filename, 'r', encoding='utf-8') as f: + lines = f.readlines() + + lines = [line.rstrip('\n\r') for line in lines] + + height = len(lines) + width = len(lines[0]) if height > 0 else 0 + + for i, line in enumerate(lines): + if len(line) != width: + raise ValueError(f"Строка {i+1} имеет длину {len(line)}, ожидается {width}") + + maze = Maze(width, height) + start = None + exit_cell = None + + for y, line in enumerate(lines): + for x, ch in enumerate(line): + cell = maze.get_cell(x, y) + + if ch == '#': + cell.is_wall = True + elif ch == ' ': + cell.is_wall = False + elif ch == 'S': + cell.is_wall = False + cell.is_start = True + start = cell + elif ch == 'E': + cell.is_wall = False + cell.ia_exit = True + exit_cell = cell + else: + cell.is_wall = True + + if start is None: + raise ValueError("В лабиринте не найден старт (S)") + if exit_cell is None: + raise ValueError("В лабиринте не найден выход (E)") + + maze.start = start + maze.exit = exit_cell + + return maze + + #тест + +if __name__ == "__main__": + builder = TextFileMazeBuilder() + maze = builder.build_from_file("maze1.txt") + + print(f"лабиринт загружен: {maze}") + print(f"старт: {maze.start}") + print(f"выход: {maze.exit}") + + neighbors = maze.get_neighbors(maze.start) + print(f"соседи старта: {neighbors}") \ No newline at end of file diff --git a/konnovaea/test.py b/konnovaea/test.py new file mode 100644 index 0000000..fd36b2b --- /dev/null +++ b/konnovaea/test.py @@ -0,0 +1 @@ +print("Hello from Python") \ No newline at end of file From 64978d32451bb716086a42450e6c75711a33becc Mon Sep 17 00:00:00 2001 From: konnovaea Date: Mon, 18 May 2026 20:23:06 +0300 Subject: [PATCH 22/32] =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=B3=D0=B8=D0=B8=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E?= =?UTF-8?q?=D1=82=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D1=88=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/maze_solver.py | 136 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 7 deletions(-) diff --git a/konnovaea/maze_solver.py b/konnovaea/maze_solver.py index 1adae7a..8b06667 100644 --- a/konnovaea/maze_solver.py +++ b/konnovaea/maze_solver.py @@ -106,15 +106,137 @@ class TextFileMazeBuilder(MazeBuilder): return maze - #тест +from collections import deque +import heapq +from abc import ABC, abstractmethod + +class PathfindingStrategy(ABC): + + @abstractmethod + def find_path(self, maze, start, exit): + pass + +class BFSStrategy(PathfindingStrategy): + + def find_path(self, maze, start, exit): + if start is None or exit is None: + return [] + + queue = deque() + queue.append((start, [start])) + + visited = set() + visited.add(start) + + while queue: + current, path = queue.popleft() + + if current == exit: + return path + + neighbors = maze.get_neighbors(current) + for neighbor in neighbors: + if neighbor not in visited: + visited.add(neighbor) + queue.append((neighbor, path + [neighbor])) + + return [] + +class DFSStrategy(PathfindingStrategy): + + def find_path(self, maze, start, exit): + if start is None or exit is None: + return [] + + stack = [(start, [start])] + + visited = set() + visited.add(start) + + while stack: + current, path = stack.pop() + + if current == exit: + return path + + for neighbor in maze.get_neighbors(current): + if neighbor not in visited: + visited.add(neighbor) + stack.append((neighbor, path + [neighbor])) + + return [] + +class AStartStrategy(PathfindingStrategy): + + def _heuristic(self, cell, exit): + return abs(cell.x - exit.x) + abs(cell.y -exit.y) + + def find_path(self, maze, start, exit): + if start is None or exit is None: + return [] + + counter = 0 + heap = [] + heapq.heappush(heap, (self._heuristic(start, exit), counter, start, [start])) + + g_score = {start: 0} + + visited = set() + + while heap: + f_score, _, current, path = heapq.heappop(heap) + + if current in visited: + continue + + visited.add(current) + + if current == exit: + return path + + for neighbor in maze.get_neighbors(current): + tentative_g = g_score[current] + 1 + + if neighbor not in g_score or tentative_g < g_score[neighbor]: + g_score[neighbor] = tentative_g + f_score = tentative_g + self._heuristic(neighbor, exit) + counter += 1 + heapq.heappush(heap, (f_score, counter, neighbor, path + [neighbor])) + + return [] + +#тест if __name__ == "__main__": builder = TextFileMazeBuilder() maze = builder.build_from_file("maze1.txt") - - print(f"лабиринт загружен: {maze}") - print(f"старт: {maze.start}") - print(f"выход: {maze.exit}") - + + print("Лабиринт загружен") + print(f"Старт: {maze.start}") + print(f"Выход: {maze.exit}") + + # Проверяем, что старт и выход проходимые + print(f"Старт проходим: {maze.start.is_passable()}") + print(f"Выход проходим: {maze.exit.is_passable()}") + + # Проверяем соседей старта neighbors = maze.get_neighbors(maze.start) - print(f"соседи старта: {neighbors}") \ No newline at end of file + print(f"Соседи старта: {neighbors}") + + # Тестируем BFS + bfs = BFSStrategy() + path = bfs.find_path(maze, maze.start, maze.exit) + print(f"BFS путь: {[f'({c.x},{c.y})' for c in path]}") + print(f"BFS длина пути: {len(path)}") + + # Тестируем DFS + dfs = DFSStrategy() + path = dfs.find_path(maze, maze.start, maze.exit) + print(f"DFS путь: {[f'({c.x},{c.y})' for c in path]}") + print(f"DFS длина пути: {len(path)}") + + # Тестируем A* + astar = AStartStrategy() + path = astar.find_path(maze, maze.start, maze.exit) + print(f"A* путь: {[f'({c.x},{c.y})' for c in path]}") + print(f"A* длина пути: {len(path)}") \ No newline at end of file From 06b5b017e49279faf698a34f148bdebd3a6d40bf Mon Sep 17 00:00:00 2001 From: konnovaea Date: Mon, 18 May 2026 20:55:01 +0300 Subject: [PATCH 23/32] =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D1=8B=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D1=8D=D1=82=D0=B0=D0=BF=D1=8B=20=D0=B8=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=88=D0=BB=D0=B8=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/maze_solver.py | 246 ++++++++++++++++----------------------- 1 file changed, 100 insertions(+), 146 deletions(-) diff --git a/konnovaea/maze_solver.py b/konnovaea/maze_solver.py index 8b06667..d6195b9 100644 --- a/konnovaea/maze_solver.py +++ b/konnovaea/maze_solver.py @@ -1,242 +1,196 @@ -class Cell: +from abc import ABC, abstractmethod +from collections import deque +import heapq +import time + +class Cell: def __init__(self, x, y): self.x = x self.y = y self.is_wall = False self.is_start = False self.is_exit = False - + def is_passable(self): return not self.is_wall - def __repr__(self): - return f"Cell({self.x}, {self.y})" -class Maze: + def __repr__(self): + return f"Cell({self.x},{self.y})" + +class Maze: def __init__(self, width, height): self.width = width self.height = height self.cells = [] self.start = None self.exit = None - + for y in range(height): row = [] for x in range(width): row.append(Cell(x, y)) self.cells.append(row) - + def get_cell(self, x, y): - if 0 <= x < self.width and 0 <= y < self.height: return self.cells[y][x] return None def get_neighbors(self, cell): - neighbors = [] - directions = [(0, -1), (0, 1), (-1, 0), (1,0)] - - for dx, dy in directions: + for dx, dy in [(0, -1), (0, 1), (-1, 0), (1, 0)]: nx, ny = cell.x + dx, cell.y + dy neighbor = self.get_cell(nx, ny) if neighbor and neighbor.is_passable(): neighbors.append(neighbor) return neighbors - - def __repr__(self): - return f"Maze({self.width}x{self.height})" - -from abc import ABC, abstractmethod - -class MazeBuilder(ABC): - - @abstractmethod - def build_from_file(self, filename): - pass - -class TextFileMazeBuilder(MazeBuilder): +class TextFileMazeBuilder: def build_from_file(self, filename): + with open(filename, 'r') as f: + lines = [line.rstrip() for line in f.readlines()] - with open(filename, 'r', encoding='utf-8') as f: - lines = f.readlines() - - lines = [line.rstrip('\n\r') for line in lines] - height = len(lines) - width = len(lines[0]) if height > 0 else 0 - - for i, line in enumerate(lines): - if len(line) != width: - raise ValueError(f"Строка {i+1} имеет длину {len(line)}, ожидается {width}") - + width = len(lines[0]) maze = Maze(width, height) - start = None - exit_cell = None - + for y, line in enumerate(lines): for x, ch in enumerate(line): cell = maze.get_cell(x, y) - if ch == '#': cell.is_wall = True - elif ch == ' ': - cell.is_wall = False elif ch == 'S': - cell.is_wall = False + maze.start = cell cell.is_start = True - start = cell elif ch == 'E': - cell.is_wall = False - cell.ia_exit = True - exit_cell = cell - else: - cell.is_wall = True + maze.exit = cell + cell.is_exit = True - if start is None: - raise ValueError("В лабиринте не найден старт (S)") - if exit_cell is None: - raise ValueError("В лабиринте не найден выход (E)") - - maze.start = start - maze.exit = exit_cell - return maze - -from collections import deque -import heapq -from abc import ABC, abstractmethod -class PathfindingStrategy(ABC): +class PathFindingStrategy(ABC): @abstractmethod def find_path(self, maze, start, exit): pass -class BFSStrategy(PathfindingStrategy): +class BFSStrategy(PathFindingStrategy): def find_path(self, maze, start, exit): - if start is None or exit is None: - return [] + if not start or not exit: + return [], 0 - queue = deque() - queue.append((start, [start])) - - visited = set() - visited.add(start) + queue = deque([(start, [start])]) + visited = {start} while queue: current, path = queue.popleft() - if current == exit: - return path + return path, len(visited) - neighbors = maze.get_neighbors(current) - for neighbor in neighbors: + for neighbor in maze.get_neighbors(current): if neighbor not in visited: visited.add(neighbor) queue.append((neighbor, path + [neighbor])) - return [] - -class DFSStrategy(PathfindingStrategy): + return [], len(visited) + +class DFSStrategy(PathFindingStrategy): def find_path(self, maze, start, exit): - if start is None or exit is None: - return [] + if not start or not exit: + return [], 0 stack = [(start, [start])] - - visited = set() - visited.add(start) - + visited = {start} + while stack: current, path = stack.pop() - if current == exit: - return path + return path, len(visited) for neighbor in maze.get_neighbors(current): if neighbor not in visited: visited.add(neighbor) stack.append((neighbor, path + [neighbor])) + + return [], len(visited) - return [] + +class AStarStrategy(PathFindingStrategy): + def _heuristic(self, a, b): + return abs(a.x - b.x) + abs(a.y - b.y) -class AStartStrategy(PathfindingStrategy): + def find_path(self, maze, start, exit): + if not start or not exit: + return [], 0 + + heap = [(self._heuristic(start, exit), 0, start, [start])] + g_score = {start: 0} + visited = set() + counter = 1 + + while heap: + _, _, current, path = heapq.heappop(heap) + + if current in visited: + continue + + visited.add(current) + + if current == exit: + return path, len(visited) + + for neighbor in maze.get_neighbors(current): + tentative_g = g_score[current] + 1 + if neighbor not in g_score or tentative_g < g_score[neighbor]: + g_score[neighbor] = tentative_g + f = tentative_g + self._heuristic(neighbor, exit) + heapq.heappush(heap, (f, counter, neighbor, path + [neighbor])) + counter += 1 + + return [], len(visited) - def _heuristic(self, cell, exit): - return abs(cell.x - exit.x) + abs(cell.y -exit.y) - - def find_path(self, maze, start, exit): - if start is None or exit is None: - return [] - - counter = 0 - heap = [] - heapq.heappush(heap, (self._heuristic(start, exit), counter, start, [start])) - g_score = {start: 0} +class SearchStats: + def __init__(self, path, time_ms, visited_count): + self.path = path + self.time_ms = time_ms + self.visited_count = visited_count + self.path_length = len(path) if path else 0 - visited = set() - while heap: - f_score, _, current, path = heapq.heappop(heap) +class MazeSolver: + def __init__(self, maze, strategy=None): + self.maze = maze + self.strategy = strategy + + def set_strategy(self, strategy): + self.strategy = strategy + + def solve(self): + start_time = time.perf_counter() + path, visited = self.strategy.find_path(self.maze, self.maze.start, self.maze.exit) + end_time = time.perf_counter() + return SearchStats(path, (end_time - start_time) * 1000, visited) - if current in visited: - continue - - visited.add(current) - - if current == exit: - return path - - for neighbor in maze.get_neighbors(current): - tentative_g = g_score[current] + 1 - - if neighbor not in g_score or tentative_g < g_score[neighbor]: - g_score[neighbor] = tentative_g - f_score = tentative_g + self._heuristic(neighbor, exit) - counter += 1 - heapq.heappush(heap, (f_score, counter, neighbor, path + [neighbor])) - - return [] - -#тест if __name__ == "__main__": builder = TextFileMazeBuilder() maze = builder.build_from_file("maze1.txt") - print("Лабиринт загружен") + print(f"Лабиринт: {maze.width}x{maze.height}") print(f"Старт: {maze.start}") print(f"Выход: {maze.exit}") + print() - # Проверяем, что старт и выход проходимые - print(f"Старт проходим: {maze.start.is_passable()}") - print(f"Выход проходим: {maze.exit.is_passable()}") + solver = MazeSolver(maze) - # Проверяем соседей старта - neighbors = maze.get_neighbors(maze.start) - print(f"Соседи старта: {neighbors}") - - # Тестируем BFS - bfs = BFSStrategy() - path = bfs.find_path(maze, maze.start, maze.exit) - print(f"BFS путь: {[f'({c.x},{c.y})' for c in path]}") - print(f"BFS длина пути: {len(path)}") - - # Тестируем DFS - dfs = DFSStrategy() - path = dfs.find_path(maze, maze.start, maze.exit) - print(f"DFS путь: {[f'({c.x},{c.y})' for c in path]}") - print(f"DFS длина пути: {len(path)}") - - # Тестируем A* - astar = AStartStrategy() - path = astar.find_path(maze, maze.start, maze.exit) - print(f"A* путь: {[f'({c.x},{c.y})' for c in path]}") - print(f"A* длина пути: {len(path)}") \ No newline at end of file + for name, strategy in [("BFS", BFSStrategy()), ("DFS", DFSStrategy()), ("A*", AStarStrategy())]: + solver.set_strategy(strategy) + stats = solver.solve() + print(f"{name}: путь={stats.path_length}, время={stats.time_ms:.3f}мс, посещено={stats.visited_count}") + From df29d66f1572b97f40e2504a1db2fd9709575dc3 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Mon, 18 May 2026 20:55:51 +0300 Subject: [PATCH 24/32] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/maze_solver.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/konnovaea/maze_solver.py b/konnovaea/maze_solver.py index d6195b9..8fbc904 100644 --- a/konnovaea/maze_solver.py +++ b/konnovaea/maze_solver.py @@ -178,19 +178,3 @@ class MazeSolver: return SearchStats(path, (end_time - start_time) * 1000, visited) -if __name__ == "__main__": - builder = TextFileMazeBuilder() - maze = builder.build_from_file("maze1.txt") - - print(f"Лабиринт: {maze.width}x{maze.height}") - print(f"Старт: {maze.start}") - print(f"Выход: {maze.exit}") - print() - - solver = MazeSolver(maze) - - for name, strategy in [("BFS", BFSStrategy()), ("DFS", DFSStrategy()), ("A*", AStarStrategy())]: - solver.set_strategy(strategy) - stats = solver.solve() - print(f"{name}: путь={stats.path_length}, время={stats.time_ms:.3f}мс, посещено={stats.visited_count}") - From e8de0e29c4cbaca7e217ecfa79b07110e71d4216 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Thu, 21 May 2026 12:32:48 +0300 Subject: [PATCH 25/32] =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B0=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=B8=D0=B7=D1=83=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/maze_solver.py | 156 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 155 insertions(+), 1 deletion(-) diff --git a/konnovaea/maze_solver.py b/konnovaea/maze_solver.py index 8fbc904..ec7d079 100644 --- a/konnovaea/maze_solver.py +++ b/konnovaea/maze_solver.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from collections import deque import heapq import time - +import os class Cell: def __init__(self, x, y): @@ -177,4 +177,158 @@ class MazeSolver: end_time = time.perf_counter() return SearchStats(path, (end_time - start_time) * 1000, visited) +class Observer(ABC): + + @abstractmethod + def update(self, event, data=None): + pass + +class ConsoleView(Observer): + + def __init__(self): + self.events = [] + + def update(self, event, data=None): + self.events.append((event, data)) + + if event == "maze_loaded": + print("[Событие] Лфбирин загружен") + elif event == "path_found": + print(f"[Событие] Путь найден! Длина: {len(data) if data else 0}") + elif event == "search_started": + print(f"[Событие] Поиск завершён. Время: {data:.3f}мс" if data else "[Событие] Поиск завершён") + elif event == "mpve": + print(f"[Событие] Игрок переместился в {data}") + elif event == "undo": + print("[Событие] Отмена последнего хода") + + def render(self,maze, player=None, path=None): + + os.system('cls' if os.name == 'nt' else 'clear') + + print("Лабиринт") + + for y in range(maze.height): + row = "" + for x in range(maze.width): + cell = maze.get_cell(x,y) + + if player and cell == player.current_cell: + row += "p " #игрок + elif path and cell in path: + row += "* " #путь + elif cell.is_wall: + row += "# " #стена + elif cell.is_start: + row += "S " #старт + elif cell.is_exit: + row += "E " #выход + else: + row += ". " #прозод + print(row) + + print("Управление: W/A/S/D - движение, U - отмена, Q - выход") + +class Command(ABC): + + @abstractmethod + def execute(self): + pass + + @abstractmethod + def undo(self): + pass + +class Player: + + def __init__(self, start_cell): + self.current_cell = start_cell + self.start_cell = start_cell + + def move_to(self, cell): + self.current_cell = cell + + def resent(self): + self.current_cell = self.start_cell + + def __repr__(self): + return f"Player at ({self.current_cell.x}, {self.current_cell.y})" + +class MoveCommand(Command): + + def __init__(self, player, new_cell, view): + self.player = player + self.new_cell = new_cell + self.old_cell = player.current_cell + self.view = view + + def execute(self): + self.player.move_to(self.new_cell) + self.view.update("undo", None) + +class GameController: + + def __init__(self, maze, view): + self.maze = maze + self.view = view + self.player = Player(maze.start) + self.command_history = [] + + def get_cell_in_direction(self, direction): + + x, y = self.player.current_cell.x, self.player.current_cell.y + + if direction == 'w': + y -= 1 + elif direction == 's': + y += 1 + elif direction == 'a': + x -= 1 + elif direction == 'd': + x += 1 + else: + return None + + return self.maze.get_cell(x, y) + + def try_move(self, direction): + + new_cell = self.get_cell_in_direction(direction) + + if new_cell and new_cell.is_passable(): + command = MoveCommand(self.player, new_cell, self.view) + command.execute() + self.command_history.append(command) + + if new_cell.is_exit: + self.view.update("path_found", []) + print("Вы нашли выход.") + return True + else: + print("Невозможно пройти - стена") + return False + + def undo(self): + + if self.command_history: + command = self.command_history.pop() + command.undo() + else: + print("Нечего отменять") + + def visualize_path(self, path): + self.view.render(self.maze, self.player, path) + + def run_manual_mode(self): + + while True: + self.view.render(self.maze, self.player) + + command = input("Введите команду: ").lower().strip() + + + + + + From f1dfbea54b2885285ceb148da0b2a1c643c7b05b Mon Sep 17 00:00:00 2001 From: konnovaea Date: Thu, 21 May 2026 20:07:21 +0300 Subject: [PATCH 26/32] =?UTF-8?q?=D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=B8=D0=B7=D1=83=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B8=20=D0=BF=D1=80=D0=BE=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/maze_solver.py | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/konnovaea/maze_solver.py b/konnovaea/maze_solver.py index ec7d079..c22b789 100644 --- a/konnovaea/maze_solver.py +++ b/konnovaea/maze_solver.py @@ -167,15 +167,35 @@ class MazeSolver: def __init__(self, maze, strategy=None): self.maze = maze self.strategy = strategy + self.observers = [] + + def attach(self, observer): + self.observers.append(observer) + + def detach(self, observer): + self.observers.remove(observer) + + def notify(self, event, data=None): + for observer in self.observers: + observer.update(event, data) def set_strategy(self, strategy): self.strategy = strategy def solve(self): + if self.strategy is None: + raise ValueError("Стратегия не установлена") + self.notify("search_started") + start_time = time.perf_counter() - path, visited = self.strategy.find_path(self.maze, self.maze.start, self.maze.exit) + path, visited_count = self.strategy.find_path(self.maze, self.maze.start, self.maze.exit) end_time = time.perf_counter() - return SearchStats(path, (end_time - start_time) * 1000, visited) + time_ms = (end_time - start_time) * 1000 + + self.notify("search_finished", time_ms) + self.notify("path_found", path) + + return SearchStats(path, time_ms, visited_count) class Observer(ABC): @@ -266,6 +286,10 @@ class MoveCommand(Command): self.player.move_to(self.new_cell) self.view.update("undo", None) + def undo(self): + self.player.move_to(self.old_cell) + self.view.update("undo",None) + class GameController: def __init__(self, maze, view): @@ -326,7 +350,16 @@ class GameController: command = input("Введите команду: ").lower().strip() - + if command in ['w', 'a', 's', 'd']: + self.try_move(command) + elif command == 'u': + self.undo() + elif command == 'q': + print('Выход из игры') + break + else: + print("Неизвестная команда. Используйте: W/A/S/D - движение, U - отмена, Q - выход") + From d3212347dc39d9b369c6d936de1f8c598e326f55 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Thu, 21 May 2026 21:32:32 +0300 Subject: [PATCH 27/32] =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../laba2/docs/data/maze_experiments.csv | 13 + konnovaea/laba2/docs/lab2_report.md | 0 konnovaea/laba2/maze_deadends.txt | 50 ++++ konnovaea/laba2/maze_empty.txt | 100 +++++++ konnovaea/laba2/maze_experiments.py | 257 ++++++++++++++++++ konnovaea/laba2/maze_no_exit.txt | 20 ++ konnovaea/laba2/maze_simple.txt | 10 + konnovaea/{ => laba2}/maze_solver.py | 0 konnovaea/maze1.txt | 5 - konnovaea/test.py | 1 - 10 files changed, 450 insertions(+), 6 deletions(-) create mode 100644 konnovaea/laba2/docs/data/maze_experiments.csv create mode 100644 konnovaea/laba2/docs/lab2_report.md create mode 100644 konnovaea/laba2/maze_deadends.txt create mode 100644 konnovaea/laba2/maze_empty.txt create mode 100644 konnovaea/laba2/maze_experiments.py create mode 100644 konnovaea/laba2/maze_no_exit.txt create mode 100644 konnovaea/laba2/maze_simple.txt rename konnovaea/{ => laba2}/maze_solver.py (100%) delete mode 100644 konnovaea/maze1.txt delete mode 100644 konnovaea/test.py diff --git a/konnovaea/laba2/docs/data/maze_experiments.csv b/konnovaea/laba2/docs/data/maze_experiments.csv new file mode 100644 index 0000000..261d6fa --- /dev/null +++ b/konnovaea/laba2/docs/data/maze_experiments.csv @@ -0,0 +1,13 @@ +Лабиринт,Стратегия,Время(мс),Посещено клеток,Длина пути +Простой (10x10),BFS,0.001,-,- +Простой (10x10),DFS,0.001,-,- +Простой (10x10),A*,0.001,-,- +С тупиками (50x50),BFS,2.732,1818.0,95.0 +С тупиками (50x50),DFS,1.338,841.0,289.0 +С тупиками (50x50),A*,2.907,1159.0,95.0 +Пустой (100x100),BFS,16.894,9604.0,195.0 +Пустой (100x100),DFS,296.432,9604.0,4851.0 +Пустой (100x100),A*,28.451,9604.0,195.0 +Без выхода,BFS,0.0,-,- +Без выхода,DFS,0.0,-,- +Без выхода,A*,0.0,-,- diff --git a/konnovaea/laba2/docs/lab2_report.md b/konnovaea/laba2/docs/lab2_report.md new file mode 100644 index 0000000..e69de29 diff --git a/konnovaea/laba2/maze_deadends.txt b/konnovaea/laba2/maze_deadends.txt new file mode 100644 index 0000000..9beda74 --- /dev/null +++ b/konnovaea/laba2/maze_deadends.txt @@ -0,0 +1,50 @@ +################################################## +#S # # # ## # # # # # # # # +# # # ## # ## # # ## ## # ## +# # # # # # # ## ### # # # +# # ### # ## # # # ## +# # ## ## # # # # +## # # ### # # ## # ### +# # ## # # # # # ## # # +# # # # # # # # # +# # # # # # # +## ## # # # # # # # # # +# ## # # # ## # ## +# ## # # ### ## # +## # # # ## # # # # # # +# # # # # # # # # # # +# # # # # # # ## # +# ## # ## # # # # # # # +# # # # # # #### # ## +# # # ## # # # # # # ### +# # # ## # # # # # # # # +# # # ## ## # # # ## # # +## ## # # ## # # # # # # # ## # +# # # # # ## # +# # # # # # # # +## # # # # # +# # # # # # # # ## ## # # +## ### # # # ## # # ## +# #### # # # # # # # # +# # ## # # # # # # # +# ## # # # # # # # +# # ## # # # # # ## # ## ## # +### # ### # # ## # # # # +# ## ### ## ## # # # +# ## # ## # ## # ## +### # # # # # # # ## # # +# # # # # # # # ## # # # +# # # # # # # # +# # ## # # +# ## # # # ### +# # # # # # # # # ## # ## +# ## # # ## # +# # # # # # # # # # # +# # # # # # # # # # +# # # ## # ## # ## # ## +# # ## ## # # # # # +## ## # # # # # ## # # # +### # # # # # # # +## # # # ## ## # # # # +# # # # # ## E# +################################################## diff --git a/konnovaea/laba2/maze_empty.txt b/konnovaea/laba2/maze_empty.txt new file mode 100644 index 0000000..532b296 --- /dev/null +++ b/konnovaea/laba2/maze_empty.txt @@ -0,0 +1,100 @@ +#################################################################################################### +#S # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# E# +#################################################################################################### diff --git a/konnovaea/laba2/maze_experiments.py b/konnovaea/laba2/maze_experiments.py new file mode 100644 index 0000000..b193a98 --- /dev/null +++ b/konnovaea/laba2/maze_experiments.py @@ -0,0 +1,257 @@ +import time +import random +import csv +import os +from laba2.maze_solver import ( + TextFileMazeBuilder, BFSStrategy, DFSStrategy, AStarStrategy, MazeSolver +) + +def save_maze_to_file(maze, filename): + + with open(filename, 'w', encoding='utf-8') as f: + for row in maze: + f.write(''.join(row) + '\n') + return filename + + +def create_simple_maze(): + + width, height = 10, 10 + maze = [] + for y in range(height): + row = [] + for x in range(width): + if x == 0 or y == 0 or x == width-1 or y == height-1: + row.append('#') + else: + row.append(' ') + maze.append(row) + + maze[1][1] = 'S' + maze[8][8] = 'E' + + + for i in range(1, 9): + maze[1][i] = ' ' + maze[8][i] = ' ' + maze[i][1] = ' ' + maze[i][8] = ' ' + + return save_maze_to_file(maze, "maze_simple.txt") + + +def create_maze_with_dead_ends(): + + width, height = 50, 50 + maze = [] + for y in range(height): + row = [] + for x in range(width): + if x == 0 or y == 0 or x == width-1 or y == height-1: + row.append('#') + else: + + if random.random() < 0.2: + row.append('#') + else: + row.append(' ') + maze.append(row) + + + maze[1][1] = 'S' + maze[height-2][width-2] = 'E' + + + maze[1][1] = 'S' + maze[height-2][width-2] = 'E' + maze[2][1] = ' ' + maze[1][2] = ' ' + maze[height-3][width-2] = ' ' + maze[height-2][width-3] = ' ' + + return save_maze_to_file(maze, "maze_deadends.txt") + + +def create_empty_maze(): + + width, height = 100, 100 + maze = [] + for y in range(height): + row = [] + for x in range(width): + if x == 0 or y == 0 or x == width-1 or y == height-1: + row.append('#') + else: + row.append(' ') + maze.append(row) + + maze[1][1] = 'S' + maze[height-2][width-2] = 'E' + + return save_maze_to_file(maze, "maze_empty.txt") + + +def create_maze_no_exit(): + + width, height = 20, 20 + maze = [] + for y in range(height): + row = [] + for x in range(width): + if x == 0 or y == 0 or x == width-1 or y == height-1: + row.append('#') + else: + + if x == 1 and y == 1: + row.append('S') + else: + row.append('#') + maze.append(row) + + return save_maze_to_file(maze, "maze_no_exit.txt") + + + +def run_experiment(maze_file, strategy, iterations=5): + + builder = TextFileMazeBuilder() + + try: + maze = builder.build_from_file(maze_file) + except Exception as e: + print(f" Ошибка загрузки {maze_file}: {e}") + return None + + solver = MazeSolver(maze, strategy) + + times = [] + visited_counts = [] + path_lengths = [] + + for i in range(iterations): + try: + stats = solver.solve() + times.append(stats.time_ms) + visited_counts.append(stats.visited_count) + path_lengths.append(stats.path_length) + except Exception as e: + print(f" Ошибка при итерации {i+1}: {e}") + continue + + if not times: + return None + + return { + 'avg_time': sum(times) / len(times), + 'avg_visited': sum(visited_counts) / len(visited_counts), + 'avg_path_length': sum(path_lengths) / len(path_lengths), + 'all_times': times, + 'all_visited': visited_counts, + 'all_paths': path_lengths + } + + +def run_all_experiments(): + + + + mazes = { + "Простой (10x10)": create_simple_maze(), + "С тупиками (50x50)": create_maze_with_dead_ends(), + "Пустой (100x100)": create_empty_maze(), + "Без выхода": create_maze_no_exit() + } + + strategies = { + "BFS": BFSStrategy(), + "DFS": DFSStrategy(), + "A*": AStarStrategy() + } + + results = [] + + for maze_name, maze_file in mazes.items(): + print(f"\nТестирование лабиринта: {maze_name}") + + + for strat_name, strategy in strategies.items(): + print(f" Стратегия: {strat_name}") + + result = run_experiment(maze_file, strategy, iterations=5) + + if result: + print(f" Среднее время: {result['avg_time']:.3f} мс") + print(f" Среднее посещено: {result['avg_visited']:.0f}") + print(f" Средняя длина пути: {result['avg_path_length']:.0f}") + + results.append({ + 'лабиринт': maze_name, + 'стратегия': strat_name, + 'время_мс': result['avg_time'], + 'посещено_клеток': result['avg_visited'], + 'длина_пути': result['avg_path_length'] + }) + else: + print(f" Ошибка: не удалось выполнить замеры") + results.append({ + 'лабиринт': maze_name, + 'стратегия': strat_name, + 'время_мс': -1, + 'посещено_клеток': -1, + 'длина_пути': -1 + }) + + return results + + + + +def save_results_to_csv(results): + + os.makedirs("laba2/docs/data", exist_ok=True) + + with open("laba2/docs/data/maze_experiments.csv", "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f) + writer.writerow(["Лабиринт", "Стратегия", "Время(мс)", "Посещено клеток", "Длина пути"]) + + for res in results: + writer.writerow([ + res['лабиринт'], + res['стратегия'], + round(res['время_мс'], 3) if res['время_мс'] > 0 else "нет пути", + round(res['посещено_клеток'], 0) if res['посещено_клеток'] > 0 else "-", + round(res['длина_пути'], 0) if res['длина_пути'] > 0 else "-" + ]) + + + + +def print_summary(results): + + + print("Сводная таблица результатов") + + print(f"{'Лабиринт':<20} {'Стратегия':<10} {'Время(мс)':<12} {'Посещено':<12} {'Длина пути':<12}") + + + for res in results: + time_str = f"{res['время_мс']:.3f}" if res['время_мс'] > 0 else "нет пути" + visited_str = f"{res['посещено_клеток']:.0f}" if res['посещено_клеток'] > 0 else "-" + path_str = f"{res['длина_пути']:.0f}" if res['длина_пути'] > 0 else "-" + + print(f"{res['лабиринт']:<20} {res['стратегия']:<10} {time_str:<12} {visited_str:<12} {path_str:<12}") + + + + + +if __name__ == "__main__": + + print("Эксперименты по сравнению алгоритмов поиска") + + + results = run_all_experiments() + save_results_to_csv(results) + print_summary(results) + + \ No newline at end of file diff --git a/konnovaea/laba2/maze_no_exit.txt b/konnovaea/laba2/maze_no_exit.txt new file mode 100644 index 0000000..9e8e6ef --- /dev/null +++ b/konnovaea/laba2/maze_no_exit.txt @@ -0,0 +1,20 @@ +#################### +#S################## +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### +#################### diff --git a/konnovaea/laba2/maze_simple.txt b/konnovaea/laba2/maze_simple.txt new file mode 100644 index 0000000..422ae66 --- /dev/null +++ b/konnovaea/laba2/maze_simple.txt @@ -0,0 +1,10 @@ +########## +# # +# # +# # +# # +# # +# # +# # +# # +########## diff --git a/konnovaea/maze_solver.py b/konnovaea/laba2/maze_solver.py similarity index 100% rename from konnovaea/maze_solver.py rename to konnovaea/laba2/maze_solver.py diff --git a/konnovaea/maze1.txt b/konnovaea/maze1.txt deleted file mode 100644 index 2eacde7..0000000 --- a/konnovaea/maze1.txt +++ /dev/null @@ -1,5 +0,0 @@ -####### -#S # -# ### # -# E # -####### \ No newline at end of file diff --git a/konnovaea/test.py b/konnovaea/test.py deleted file mode 100644 index fd36b2b..0000000 --- a/konnovaea/test.py +++ /dev/null @@ -1 +0,0 @@ -print("Hello from Python") \ No newline at end of file From 1d5a0f15395f2445a11c204ee4f1db6848592394 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Thu, 21 May 2026 22:48:47 +0300 Subject: [PATCH 28/32] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/lab2_report.ipynb | 187 +++++++++++++ .../laba2/docs/data/maze_experiments.csv | 13 - konnovaea/laba2/docs/lab2_report.md | 0 konnovaea/laba2/maze_deadends.txt | 50 ---- konnovaea/laba2/maze_empty.txt | 100 ------- konnovaea/laba2/maze_experiments.py | 257 ------------------ konnovaea/laba2/maze_no_exit.txt | 20 -- konnovaea/laba2/maze_simple.txt | 10 - konnovaea/make_lab2_plots.py | 93 +++++++ konnovaea/maze_experiments.py | 154 +++++++++++ konnovaea/{laba2 => }/maze_solver.py | 0 11 files changed, 434 insertions(+), 450 deletions(-) create mode 100644 konnovaea/lab2_report.ipynb delete mode 100644 konnovaea/laba2/docs/data/maze_experiments.csv delete mode 100644 konnovaea/laba2/docs/lab2_report.md delete mode 100644 konnovaea/laba2/maze_deadends.txt delete mode 100644 konnovaea/laba2/maze_empty.txt delete mode 100644 konnovaea/laba2/maze_experiments.py delete mode 100644 konnovaea/laba2/maze_no_exit.txt delete mode 100644 konnovaea/laba2/maze_simple.txt create mode 100644 konnovaea/make_lab2_plots.py create mode 100644 konnovaea/maze_experiments.py rename konnovaea/{laba2 => }/maze_solver.py (100%) diff --git a/konnovaea/lab2_report.ipynb b/konnovaea/lab2_report.ipynb new file mode 100644 index 0000000..9154f71 --- /dev/null +++ b/konnovaea/lab2_report.ipynb @@ -0,0 +1,187 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bdef001e", + "metadata": {}, + "source": [ + "# Отчёт \n", + "## Поиск выхода из лабиринта: применение паттернов проектирования\n", + "\n", + "**Студент:** Коннова Е.А.\n", + "**Группа:** 429\n", + "**Дата:** 21.05.2026" + ] + }, + { + "cell_type": "markdown", + "id": "21f948a4", + "metadata": {}, + "source": [ + "## Введение\n", + "\n", + "### О чём это работа\n", + "В данной работе реализуется программа для поиска выхода из лабиринта с применением паттернов проектирования. Поддерживаются три алгоритма поиска пути: BFS, DFS и A*.\n", + "\n", + "### Цель работы\n", + "Разработать гибкую, расширяемую программу для загрузки лабиринта из файла, поиска пути от старта до выхода с возможностью выбора алгоритма, визуализации процесса и экспериментального сравнения алгоритмов. Применить минимум 3 паттерна проектирования.\n", + "\n", + "### Задачи\n", + "1. Реализовать модель лабиринта (классы Cell, Maze)\n", + "2. Реализовать загрузку лабиринта из файла (паттерн Builder)\n", + "3. Реализовать алгоритмы поиска пути (паттерн Strategy): BFS, DFS, A*\n", + "4. Реализовать класс-оркестратор MazeSolver со сбором статистики\n", + "5. Реализовать визуализацию (паттерн Observer) и пошаговое управление (паттерн Command)\n", + "6. Провести эксперименты на лабиринтах разной сложности\n", + "7. Сравнить результаты и сделать выводы\n" + ] + }, + { + "cell_type": "markdown", + "id": "cf1dc2ba", + "metadata": {}, + "source": [ + "## Часть 1. Паттерны проектирования\n", + "\n", + "### Использованные паттерны\n", + "\n", + "| Паттерн | Назначение | Реализация |\n", + "|---------|------------|------------|\n", + "| Builder | Создание лабиринта из файла | TextFileMazeBuilder |\n", + "| Strategy | Семейство алгоритмов поиска | BFSStrategy, DFSStrategy, AStarStrategy |\n", + "| Observer | Уведомление о событиях | ConsoleView |\n", + "| Command | Отмена ходов | MoveCommand |\n" + ] + }, + { + "cell_type": "markdown", + "id": "55cef4b9", + "metadata": {}, + "source": [ + "## Часть 2. Реализация\n", + "\n", + "### 2.1 Модель лабиринта\n", + "\n", + "**Класс Cell** - клетка лабиринта\n", + "- Поля: x, y, is_wall, is_start, is_exit\n", + "- Метод: is_passable() - возвращает True, если не стена\n", + "\n", + "**Класс Maze** - лабиринт\n", + "- Поля: width, height, cells[][], start, exit\n", + "- Методы: get_cell(x, y), get_neighbors(cell)\n", + "\n", + "### 2.2 Загрузка лабиринта (Builder)\n", + "\n", + "**TextFileMazeBuilder**\n", + "- Читает файл с символами (# - стена, пробел - проход, S - старт, E - выход)\n", + "- Создаёт клетки с нужными флагами\n", + "- Возвращает готовый Maze\n", + "\n", + "### 2.3 Алгоритмы поиска (Strategy)\n", + "\n", + "**Интерфейс PathFindingStrategy**\n", + "- Метод: find_path(maze, start, exit) возвращает (путь, количество_посещённых)\n", + "\n", + "**BFSStrategy** - поиск в ширину (очередь)\n", + "- Гарантирует кратчайший путь\n", + "\n", + "**DFSStrategy** - поиск в глубину (стек)\n", + "- Быстрый, но не гарантирует кратчайший путь\n", + "\n", + "**AStarStrategy** - A* (приоритетная очередь)\n", + "- Использует эвристику (манхэттенское расстояние)\n", + "\n", + "### 2.4 Оркестратор\n", + "\n", + "**MazeSolver**\n", + "- Поля: maze, strategy\n", + "- Методы: set_strategy(), solve() → SearchStats\n", + "\n", + "**SearchStats**\n", + "- Поля: path, time_ms, visited_count, path_length" + ] + }, + { + "cell_type": "markdown", + "id": "5c9bd0d2", + "metadata": {}, + "source": [ + "## Часть 3. Эксперименты\n", + "\n", + "### 3.1 Условия\n", + "\n", + "| Параметр | Значение |\n", + "|----------|----------|\n", + "| Повторений | 5 |\n", + "| Алгоритмы | BFS, DFS, A* |\n", + "| Лабиринты | Простой (10x10), С тупиками (50x50), Пустой (100x100), Без выхода |\n", + "\n", + "### 3.2 Результаты\n", + "\n", + "| Лабиринт | Стратегия | Время (мс) | Посещено | Длина пути |\n", + "|----------|-----------|------------|----------|------------|\n", + "| Простой | BFS | 0.037 | 11 | 6 |\n", + "| Простой | DFS | 0.016 | 9 | 8 |\n", + "| Простой | A* | 0.027 | 9 | 6 |\n", + "\n", + "### 3.3 Графики\n", + "\n", + "![Время](data/maze_time_graph.png)\n", + "![Посещения](data/maze_visited_graph.png)\n", + "![Длина пути](data/maze_path_graph.png)\n", + "\n", + "### 3.4 Анализ\n", + "\n", + "| Алгоритм | Кратчайший путь | Скорость | Память |\n", + "|----------|-----------------|----------|--------|\n", + "| BFS | Да | Средняя | Много |\n", + "| DFS | Нет | Быстрая | Мало |\n", + "| A* | Да | Быстрая | Средне |\n", + "\n", + "**Выводы:**\n", + "- BFS и A* нашли кратчайший путь (6 шагов)\n", + "- DFS нашёл более длинный путь (8 шагов), но быстрее всех\n", + "- A* - лучший компромисс между скоростью и оптимальностью\n" + ] + }, + { + "cell_type": "markdown", + "id": "1036c160", + "metadata": {}, + "source": [ + "## Заключение\n", + "\n", + "### Рекомендации по выбору алгоритма\n", + "\n", + "| Сценарий | Алгоритм | Причина |\n", + "|----------|----------|---------|\n", + "| Нужен кратчайший путь | BFS | Гарантирует оптимальность |\n", + "| Важна скорость | DFS | Самый быстрый |\n", + "| Большой лабиринт | A* | Эвристика ускоряет поиск |\n", + "\n", + "### Как паттерны помогли\n", + "\n", + "| Изменение | Без паттернов | С паттернами |\n", + "|-----------|---------------|--------------|\n", + "| Добавить JSON лабиринт | Изменить весь код | Создать JSONBuilder |\n", + "| Добавить алгоритм | Изменить MazeSolver | Создать новую стратегию |\n", + "| Сменить визуализацию | Переписать MazeSolver | Добавить новый Observer |\n", + "\n", + "**Итог:** Паттерны сделали код гибким, расширяемым и тестируемым." + ] + }, + { + "cell_type": "markdown", + "id": "cb24b904", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/konnovaea/laba2/docs/data/maze_experiments.csv b/konnovaea/laba2/docs/data/maze_experiments.csv deleted file mode 100644 index 261d6fa..0000000 --- a/konnovaea/laba2/docs/data/maze_experiments.csv +++ /dev/null @@ -1,13 +0,0 @@ -Лабиринт,Стратегия,Время(мс),Посещено клеток,Длина пути -Простой (10x10),BFS,0.001,-,- -Простой (10x10),DFS,0.001,-,- -Простой (10x10),A*,0.001,-,- -С тупиками (50x50),BFS,2.732,1818.0,95.0 -С тупиками (50x50),DFS,1.338,841.0,289.0 -С тупиками (50x50),A*,2.907,1159.0,95.0 -Пустой (100x100),BFS,16.894,9604.0,195.0 -Пустой (100x100),DFS,296.432,9604.0,4851.0 -Пустой (100x100),A*,28.451,9604.0,195.0 -Без выхода,BFS,0.0,-,- -Без выхода,DFS,0.0,-,- -Без выхода,A*,0.0,-,- diff --git a/konnovaea/laba2/docs/lab2_report.md b/konnovaea/laba2/docs/lab2_report.md deleted file mode 100644 index e69de29..0000000 diff --git a/konnovaea/laba2/maze_deadends.txt b/konnovaea/laba2/maze_deadends.txt deleted file mode 100644 index 9beda74..0000000 --- a/konnovaea/laba2/maze_deadends.txt +++ /dev/null @@ -1,50 +0,0 @@ -################################################## -#S # # # ## # # # # # # # # -# # # ## # ## # # ## ## # ## -# # # # # # # ## ### # # # -# # ### # ## # # # ## -# # ## ## # # # # -## # # ### # # ## # ### -# # ## # # # # # ## # # -# # # # # # # # # -# # # # # # # -## ## # # # # # # # # # -# ## # # # ## # ## -# ## # # ### ## # -## # # # ## # # # # # # -# # # # # # # # # # # -# # # # # # # ## # -# ## # ## # # # # # # # -# # # # # # #### # ## -# # # ## # # # # # # ### -# # # ## # # # # # # # # -# # # ## ## # # # ## # # -## ## # # ## # # # # # # # ## # -# # # # # ## # -# # # # # # # # -## # # # # # -# # # # # # # # ## ## # # -## ### # # # ## # # ## -# #### # # # # # # # # -# # ## # # # # # # # -# ## # # # # # # # -# # ## # # # # # ## # ## ## # -### # ### # # ## # # # # -# ## ### ## ## # # # -# ## # ## # ## # ## -### # # # # # # # ## # # -# # # # # # # # ## # # # -# # # # # # # # -# # ## # # -# ## # # # ### -# # # # # # # # # ## # ## -# ## # # ## # -# # # # # # # # # # # -# # # # # # # # # # -# # # ## # ## # ## # ## -# # ## ## # # # # # -## ## # # # # # ## # # # -### # # # # # # # -## # # # ## ## # # # # -# # # # # ## E# -################################################## diff --git a/konnovaea/laba2/maze_empty.txt b/konnovaea/laba2/maze_empty.txt deleted file mode 100644 index 532b296..0000000 --- a/konnovaea/laba2/maze_empty.txt +++ /dev/null @@ -1,100 +0,0 @@ -#################################################################################################### -#S # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# # -# E# -#################################################################################################### diff --git a/konnovaea/laba2/maze_experiments.py b/konnovaea/laba2/maze_experiments.py deleted file mode 100644 index b193a98..0000000 --- a/konnovaea/laba2/maze_experiments.py +++ /dev/null @@ -1,257 +0,0 @@ -import time -import random -import csv -import os -from laba2.maze_solver import ( - TextFileMazeBuilder, BFSStrategy, DFSStrategy, AStarStrategy, MazeSolver -) - -def save_maze_to_file(maze, filename): - - with open(filename, 'w', encoding='utf-8') as f: - for row in maze: - f.write(''.join(row) + '\n') - return filename - - -def create_simple_maze(): - - width, height = 10, 10 - maze = [] - for y in range(height): - row = [] - for x in range(width): - if x == 0 or y == 0 or x == width-1 or y == height-1: - row.append('#') - else: - row.append(' ') - maze.append(row) - - maze[1][1] = 'S' - maze[8][8] = 'E' - - - for i in range(1, 9): - maze[1][i] = ' ' - maze[8][i] = ' ' - maze[i][1] = ' ' - maze[i][8] = ' ' - - return save_maze_to_file(maze, "maze_simple.txt") - - -def create_maze_with_dead_ends(): - - width, height = 50, 50 - maze = [] - for y in range(height): - row = [] - for x in range(width): - if x == 0 or y == 0 or x == width-1 or y == height-1: - row.append('#') - else: - - if random.random() < 0.2: - row.append('#') - else: - row.append(' ') - maze.append(row) - - - maze[1][1] = 'S' - maze[height-2][width-2] = 'E' - - - maze[1][1] = 'S' - maze[height-2][width-2] = 'E' - maze[2][1] = ' ' - maze[1][2] = ' ' - maze[height-3][width-2] = ' ' - maze[height-2][width-3] = ' ' - - return save_maze_to_file(maze, "maze_deadends.txt") - - -def create_empty_maze(): - - width, height = 100, 100 - maze = [] - for y in range(height): - row = [] - for x in range(width): - if x == 0 or y == 0 or x == width-1 or y == height-1: - row.append('#') - else: - row.append(' ') - maze.append(row) - - maze[1][1] = 'S' - maze[height-2][width-2] = 'E' - - return save_maze_to_file(maze, "maze_empty.txt") - - -def create_maze_no_exit(): - - width, height = 20, 20 - maze = [] - for y in range(height): - row = [] - for x in range(width): - if x == 0 or y == 0 or x == width-1 or y == height-1: - row.append('#') - else: - - if x == 1 and y == 1: - row.append('S') - else: - row.append('#') - maze.append(row) - - return save_maze_to_file(maze, "maze_no_exit.txt") - - - -def run_experiment(maze_file, strategy, iterations=5): - - builder = TextFileMazeBuilder() - - try: - maze = builder.build_from_file(maze_file) - except Exception as e: - print(f" Ошибка загрузки {maze_file}: {e}") - return None - - solver = MazeSolver(maze, strategy) - - times = [] - visited_counts = [] - path_lengths = [] - - for i in range(iterations): - try: - stats = solver.solve() - times.append(stats.time_ms) - visited_counts.append(stats.visited_count) - path_lengths.append(stats.path_length) - except Exception as e: - print(f" Ошибка при итерации {i+1}: {e}") - continue - - if not times: - return None - - return { - 'avg_time': sum(times) / len(times), - 'avg_visited': sum(visited_counts) / len(visited_counts), - 'avg_path_length': sum(path_lengths) / len(path_lengths), - 'all_times': times, - 'all_visited': visited_counts, - 'all_paths': path_lengths - } - - -def run_all_experiments(): - - - - mazes = { - "Простой (10x10)": create_simple_maze(), - "С тупиками (50x50)": create_maze_with_dead_ends(), - "Пустой (100x100)": create_empty_maze(), - "Без выхода": create_maze_no_exit() - } - - strategies = { - "BFS": BFSStrategy(), - "DFS": DFSStrategy(), - "A*": AStarStrategy() - } - - results = [] - - for maze_name, maze_file in mazes.items(): - print(f"\nТестирование лабиринта: {maze_name}") - - - for strat_name, strategy in strategies.items(): - print(f" Стратегия: {strat_name}") - - result = run_experiment(maze_file, strategy, iterations=5) - - if result: - print(f" Среднее время: {result['avg_time']:.3f} мс") - print(f" Среднее посещено: {result['avg_visited']:.0f}") - print(f" Средняя длина пути: {result['avg_path_length']:.0f}") - - results.append({ - 'лабиринт': maze_name, - 'стратегия': strat_name, - 'время_мс': result['avg_time'], - 'посещено_клеток': result['avg_visited'], - 'длина_пути': result['avg_path_length'] - }) - else: - print(f" Ошибка: не удалось выполнить замеры") - results.append({ - 'лабиринт': maze_name, - 'стратегия': strat_name, - 'время_мс': -1, - 'посещено_клеток': -1, - 'длина_пути': -1 - }) - - return results - - - - -def save_results_to_csv(results): - - os.makedirs("laba2/docs/data", exist_ok=True) - - with open("laba2/docs/data/maze_experiments.csv", "w", newline="", encoding="utf-8") as f: - writer = csv.writer(f) - writer.writerow(["Лабиринт", "Стратегия", "Время(мс)", "Посещено клеток", "Длина пути"]) - - for res in results: - writer.writerow([ - res['лабиринт'], - res['стратегия'], - round(res['время_мс'], 3) if res['время_мс'] > 0 else "нет пути", - round(res['посещено_клеток'], 0) if res['посещено_клеток'] > 0 else "-", - round(res['длина_пути'], 0) if res['длина_пути'] > 0 else "-" - ]) - - - - -def print_summary(results): - - - print("Сводная таблица результатов") - - print(f"{'Лабиринт':<20} {'Стратегия':<10} {'Время(мс)':<12} {'Посещено':<12} {'Длина пути':<12}") - - - for res in results: - time_str = f"{res['время_мс']:.3f}" if res['время_мс'] > 0 else "нет пути" - visited_str = f"{res['посещено_клеток']:.0f}" if res['посещено_клеток'] > 0 else "-" - path_str = f"{res['длина_пути']:.0f}" if res['длина_пути'] > 0 else "-" - - print(f"{res['лабиринт']:<20} {res['стратегия']:<10} {time_str:<12} {visited_str:<12} {path_str:<12}") - - - - - -if __name__ == "__main__": - - print("Эксперименты по сравнению алгоритмов поиска") - - - results = run_all_experiments() - save_results_to_csv(results) - print_summary(results) - - \ No newline at end of file diff --git a/konnovaea/laba2/maze_no_exit.txt b/konnovaea/laba2/maze_no_exit.txt deleted file mode 100644 index 9e8e6ef..0000000 --- a/konnovaea/laba2/maze_no_exit.txt +++ /dev/null @@ -1,20 +0,0 @@ -#################### -#S################## -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### -#################### diff --git a/konnovaea/laba2/maze_simple.txt b/konnovaea/laba2/maze_simple.txt deleted file mode 100644 index 422ae66..0000000 --- a/konnovaea/laba2/maze_simple.txt +++ /dev/null @@ -1,10 +0,0 @@ -########## -# # -# # -# # -# # -# # -# # -# # -# # -########## diff --git a/konnovaea/make_lab2_plots.py b/konnovaea/make_lab2_plots.py new file mode 100644 index 0000000..08a2574 --- /dev/null +++ b/konnovaea/make_lab2_plots.py @@ -0,0 +1,93 @@ +import matplotlib.pyplot as plt +import os + +os.makedirs('laba2/docs/data', exist_ok=True) + + +table_data = [ + ['Лабиринт', 'Стратегия', 'Время (мс)', 'Посещено', 'Длина пути'], + ['Простой (10x10)', 'BFS', '0.037', '11', '6'], + ['Простой (10x10)', 'DFS', '0.016', '9', '8'], + ['Простой (10x10)', 'A*', '0.027', '9', '6'], + ['С тупиками (50x50)', 'BFS', '-', '-', '-'], + ['С тупиками (50x50)', 'DFS', '-', '-', '-'], + ['С тупиками (50x50)', 'A*', '-', '-', '-'], + ['Пустой (100x100)', 'BFS', '-', '-', '-'], + ['Пустой (100x100)', 'DFS', '-', '-', '-'], + ['Пустой (100x100)', 'A*', '-', '-', '-'], + ['Без выхода (20x20)', 'BFS', '-', '-', 'нет пути'], + ['Без выхода (20x20)', 'DFS', '-', '-', 'нет пути'], + ['Без выхода (20x20)', 'A*', '-', '-', 'нет пути'], +] + + +fig, ax = plt.subplots(figsize=(12, 5)) +ax.axis('off') + +table = ax.table(cellText=table_data, loc='center', cellLoc='center', colWidths=[0.2, 0.13, 0.13, 0.13, 0.13]) + +table.auto_set_font_size(False) +table.set_fontsize(10) +table.scale(1, 1.8) + + +for i in range(5): + table[(0, i)].set_facecolor('#4472C4') + table[(0, i)].set_text_props(weight='bold', color='white') + + +for i in range(1, len(table_data)): + if i % 2 == 1: + for j in range(5): + table[(i, j)].set_facecolor('#E8F0FE') + else: + for j in range(5): + table[(i, j)].set_facecolor('#FFFFFF') + +plt.title('Результаты экспериментов по поиску пути в лабиринте', fontsize=14, fontweight='bold', pad=30) +plt.savefig('laba2/docs/data/maze_table_results.png', dpi=200, bbox_inches='tight', facecolor='white') +plt.close() + + + +fig, ax = plt.subplots(figsize=(8, 5)) +algorithms = ['BFS', 'DFS', 'A*'] +time_data = [0.037, 0.016, 0.027] +bars = ax.bar(algorithms, time_data, color=['#3498db', '#e74c3c', '#2ecc71']) +ax.set_ylabel('Время (мс)') +ax.set_title('Время выполнения алгоритмов (простой лабиринт 10x10)') +for bar, val in zip(bars, time_data): + ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.001, f'{val:.3f}', ha='center', va='bottom') +plt.savefig('laba2/docs/data/maze_time_graph.png', dpi=150, bbox_inches='tight') +plt.close() + + + +fig, ax = plt.subplots(figsize=(8, 5)) +visited_data = [11, 9, 9] +bars = ax.bar(algorithms, visited_data, color=['#3498db', '#e74c3c', '#2ecc71']) +ax.set_ylabel('Количество клеток') +ax.set_title('Посещённые клетки при поиске') +for bar, val in zip(bars, visited_data): + ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.3, str(val), ha='center', va='bottom') +plt.savefig('laba2/docs/data/maze_visited_graph.png', dpi=150, bbox_inches='tight') +plt.close() + + + +fig, ax = plt.subplots(figsize=(8, 5)) +path_data = [6, 8, 6] +bars = ax.bar(algorithms, path_data, color=['#3498db', '#e74c3c', '#2ecc71']) +ax.set_ylabel('Длина пути (шагов)') +ax.set_title('Длина найденного пути') +for bar, val in zip(bars, path_data): + ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.3, str(val), ha='center', va='bottom') +plt.savefig('laba2/docs/data/maze_path_graph.png', dpi=150, bbox_inches='tight') +plt.close() + + + + + + + diff --git a/konnovaea/maze_experiments.py b/konnovaea/maze_experiments.py new file mode 100644 index 0000000..d31a268 --- /dev/null +++ b/konnovaea/maze_experiments.py @@ -0,0 +1,154 @@ +import time +import csv +import os +from maze_solver import TextFileMazeBuilder, BFSStrategy, DFSStrategy, AStarStrategy, MazeSolver + +def save_maze_to_file(maze, filename): + with open(filename, 'w') as f: + for row in maze: + f.write(''.join(row) + '\n') + +def run_test(maze_file, strategy_class): + builder = TextFileMazeBuilder() + maze = builder.build_from_file(maze_file) + solver = MazeSolver(maze, strategy_class) + + times = [] + visited = [] + path_len = [] + + for i in range(5): + stats = solver.solve() + times.append(stats.time_ms) + visited.append(stats.visited_count) + path_len.append(stats.path_length) + + return { + 'time': sum(times) / 5, + 'visited': sum(visited) / 5, + 'path': sum(path_len) / 5, + 'path_found': max(path_len) > 0 + } + +def main(): + + print("Эксперименты по поиску пути в лабиринте") + + + results = [] + + + print("\n1. Простой лабиринт (10x10)") + + + + simple = [ + "#######", + "#S #", + "# ### #", + "# E #", + "#######" + ] + with open('simple.txt', 'w') as f: + for line in simple: + f.write(line + '\n') + + for name, strategy in [('BFS', BFSStrategy()), ('DFS', DFSStrategy()), ('A*', AStarStrategy())]: + res = run_test('simple.txt', strategy) + print(f"{name}: время={res['time']:.3f}мс, посещено={res['visited']:.0f}, путь={res['path']:.0f}") + results.append(['Простой', name, round(res['time'], 3), round(res['visited'], 0), round(res['path'], 0)]) + + + print("\n2. Лабиринт с тупиками (20x20)") + + dead = [] + for y in range(20): + row = [] + for x in range(20): + if x == 0 or y == 0 or x == 19 or y == 19: + row.append('#') + elif (x == 5 and y > 5 and y < 15) or (y == 5 and x > 5 and x < 15): + row.append('#') + else: + row.append(' ') + dead.append(row) + dead[1][1] = 'S' + dead[18][18] = 'E' + + with open('dead.txt', 'w') as f: + for row in dead: + f.write(''.join(row) + '\n') + + for name, strategy in [('BFS', BFSStrategy()), ('DFS', DFSStrategy()), ('A*', AStarStrategy())]: + res = run_test('dead.txt', strategy) + print(f"{name}: время={res['time']:.3f}мс, посещено={res['visited']:.0f}, путь={res['path']:.0f}") + results.append(['С тупиками', name, round(res['time'], 3), round(res['visited'], 0), round(res['path'], 0)]) + + + print("\n3. Пустой лабиринт (50x50)") + + + empty = [] + for y in range(50): + row = [] + for x in range(50): + if x == 0 or y == 0 or x == 49 or y == 49: + row.append('#') + else: + row.append(' ') + empty.append(row) + empty[1][1] = 'S' + empty[48][48] = 'E' + + with open('empty.txt', 'w') as f: + for row in empty: + f.write(''.join(row) + '\n') + + for name, strategy in [('BFS', BFSStrategy()), ('DFS', DFSStrategy()), ('A*', AStarStrategy())]: + res = run_test('empty.txt', strategy) + print(f"{name}: время={res['time']:.3f}мс, посещено={res['visited']:.0f}, путь={res['path']:.0f}") + results.append(['Пустой', name, round(res['time'], 3), round(res['visited'], 0), round(res['path'], 0)]) + + + print("\n4. Лабиринт без выхода (10x10)") + + + noexit = [] + for y in range(10): + row = [] + for x in range(10): + if x == 0 or y == 0 or x == 9 or y == 9: + row.append('#') + else: + row.append('#') + noexit.append(row) + noexit[1][1] = 'S' + noexit[8][8] = 'E' + + with open('noexit.txt', 'w') as f: + for row in noexit: + f.write(''.join(row) + '\n') + + for name, strategy in [('BFS', BFSStrategy()), ('DFS', DFSStrategy()), ('A*', AStarStrategy())]: + try: + res = run_test('noexit.txt', strategy) + if res['path_found']: + print(f"{name}: путь найден! длина={res['path']:.0f}") + results.append(['Без выхода', name, round(res['time'], 3), round(res['visited'], 0), round(res['path'], 0)]) + else: + print(f"{name}: путь не найден (корректно)") + results.append(['Без выхода', name, round(res['time'], 3), round(res['visited'], 0), 'нет пути']) + except Exception as e: + print(f"{name}: ошибка - {e}") + results.append(['Без выхода', name, 0, 0, 'ошибка']) + + + os.makedirs('docs/data', exist_ok=True) + with open('docs/data/maze_experiments.csv', 'w', newline='', encoding='utf-8') as f: + writer = csv.writer(f) + writer.writerow(['Лабиринт', 'Стратегия', 'Время(мс)', 'Посещено клеток', 'Длина пути']) + writer.writerows(results) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/konnovaea/laba2/maze_solver.py b/konnovaea/maze_solver.py similarity index 100% rename from konnovaea/laba2/maze_solver.py rename to konnovaea/maze_solver.py From 58b2b73c8a8be920f1f37af4ab173e3449c3a467 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Fri, 22 May 2026 17:27:40 +0300 Subject: [PATCH 29/32] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=81=20=D0=B0=D0=BA=D1=82=D1=83=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=BC=D0=B8=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konnovaea/lab2/dead.txt | 20 + konnovaea/lab2/docs/data/maze_experiments.csv | 13 + konnovaea/lab2/docs/data/maze_path_graph.png | Bin 0 -> 19251 bytes .../lab2/docs/data/maze_table_results.png | Bin 0 -> 135651 bytes konnovaea/lab2/docs/data/maze_time_graph.png | Bin 0 -> 35346 bytes .../lab2/docs/data/maze_visited_graph.png | Bin 0 -> 20171 bytes konnovaea/lab2/docs/lab2_report.ipynb | 187 +++++++++ konnovaea/lab2/empty.txt | 50 +++ konnovaea/lab2/make_lab2_plots.py | 81 ++++ konnovaea/lab2/maze_experiments.py | 154 ++++++++ konnovaea/lab2/maze_solver.py | 367 ++++++++++++++++++ konnovaea/lab2/noexit.txt | 10 + konnovaea/lab2/simple.txt | 5 + 13 files changed, 887 insertions(+) create mode 100644 konnovaea/lab2/dead.txt create mode 100644 konnovaea/lab2/docs/data/maze_experiments.csv create mode 100644 konnovaea/lab2/docs/data/maze_path_graph.png create mode 100644 konnovaea/lab2/docs/data/maze_table_results.png create mode 100644 konnovaea/lab2/docs/data/maze_time_graph.png create mode 100644 konnovaea/lab2/docs/data/maze_visited_graph.png create mode 100644 konnovaea/lab2/docs/lab2_report.ipynb create mode 100644 konnovaea/lab2/empty.txt create mode 100644 konnovaea/lab2/make_lab2_plots.py create mode 100644 konnovaea/lab2/maze_experiments.py create mode 100644 konnovaea/lab2/maze_solver.py create mode 100644 konnovaea/lab2/noexit.txt create mode 100644 konnovaea/lab2/simple.txt diff --git a/konnovaea/lab2/dead.txt b/konnovaea/lab2/dead.txt new file mode 100644 index 0000000..5f30fec --- /dev/null +++ b/konnovaea/lab2/dead.txt @@ -0,0 +1,20 @@ +#################### +#S # +# # +# # +# # +# ######### # +# # # +# # # +# # # +# # # +# # # +# # # +# # # +# # # +# # # +# # +# # +# # +# E# +#################### diff --git a/konnovaea/lab2/docs/data/maze_experiments.csv b/konnovaea/lab2/docs/data/maze_experiments.csv new file mode 100644 index 0000000..9c127fb --- /dev/null +++ b/konnovaea/lab2/docs/data/maze_experiments.csv @@ -0,0 +1,13 @@ +Лабиринт,Стратегия,Время(мс),Посещено клеток,Длина пути +Простой,BFS,0.02,11.0,6.0 +Простой,DFS,0.012,9.0,8.0 +Простой,A*,0.02,9.0,6.0 +С тупиками,BFS,0.492,306.0,35.0 +С тупиками,DFS,0.234,198.0,81.0 +С тупиками,A*,0.456,225.0,35.0 +Пустой,BFS,3.486,2304.0,95.0 +Пустой,DFS,10.452,2304.0,1129.0 +Пустой,A*,5.743,2304.0,95.0 +Без выхода,BFS,0.01,1.0,нет пути +Без выхода,DFS,0.003,1.0,нет пути +Без выхода,A*,0.004,1.0,нет пути diff --git a/konnovaea/lab2/docs/data/maze_path_graph.png b/konnovaea/lab2/docs/data/maze_path_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..7fdcb1041a451665461056f3d523f597cecf7163 GIT binary patch literal 19251 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%0DJnxmV7=xHk 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 xxv2OQqE# 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

u|m6TR)bHJ!-}Oo%{4 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
    8(t z74sPMhLbc8INYqK4BU_C>BQavn=cuA^Td=SRy|hWnWrO1S^p+roy!Mz4VVxAy-yZA zb2~%ZKW81z*>^cVqrtW+-}wVf2P7wP>2`S~2Wun!m9wISGEEf=k<{mhx`3u(>n`HB z)Oyzbn3jl+%kP{{L(K3>(dBZ~3weqxb%^Enf1*V|pnG8D2-tHTgUZBBsOkFdR;!5C zo=tz6ma;%6zfWAhI!xe(yykn?U-Is!y6myMy!Brcj!)wML7$Ez~UVQolUg`66v6%j|a7Lu>=K8 z^GS8ng47dTV4>BlV>^+i7PAqtJ-di=Jg2&r^c4cV2M7ge!J>fx>m!bIE%a<5k39x} z@vjl$2W$B!ynn3au0WBZUSP}VxdYH^K?JR9U*v}S>?803bz?`ywCM%=09+jQCf#i{$!v-zr3b+KG#ofv8k zS2GTb1;!*@>ic%=sszlC-7jR32u6PktqsZpc;;)%ao;X|z6z}v>q%(FLl*V<6W&;e zVY2}vFNZdC?fE*`7ZQq8X!`=&gw419G;O;-sD<3!wrxK=>q)uJ1Npe;H=I-CYN|o; zA&n`J1AePfNhFN@>l>aL$PSh}w?>}F>l6X|%m()%-CDhEP1ZcF$wL}%fP{A+YnT0N zc&2cuu3qG)kyfSh(7?PqSz1OZIY-CqZ&@HX6#^J(Dc7%4O1|SUp<#lCgX`C1{VC7B zFhwTZLYl#nk}*o|HdSu!69NBFb?05caWK;)t@X51NX-xv=2Lr}CreOlFC8M*t`Tx_ z@C4lskNk-Xf3m1_+UI<`OP2T31uwR1z%l8T6BC1pdlf3&R1azg|R5(BnyMX85qbf#n(yV%W@z|hx&~f%qHlkw=UB~JgWTnN()@B)(*B2 z6feypI~pEQSf+NX<$_uboEZCp%y$aj)bPbui9aEY?V5Mn6FN;mhrQS~zt5?&mi!=7 zcTnbzyjOqcoQdF1MRDGO9w>(R0*$t6h#^X-gCybhR|*?ubjKsk!dyCFX8r?3)g zK2rgGI!!p&t?}nXW`^L97@hT+RiA-^@N)=kGD`a#HtXA(c|NyD%T6VCyt@Sw?w{fi z{B3J{H-JN$E)mjF!w6U|XVjvs0Nc63N*96hBATgt`dZM_duytt#)vG5S%Af`K3=ro zXMI~o--)0?fnrlHi*2FSm=Md{cvUowAafttkVeWk2AJ}(&c*<;Fs+^%MPYIyb2Mm> zpR6>pai$E3q3uX~EB%ek)xu%gPfkAJ1;+#bt2bKW&yAqvcBcd!)4@rgQHlLh-2j-{|J4JM&f**5T=8?Qkwe&eX|R?G&3it*vPZ`fY>& zsI9p9vgJUg0)7B$e^r!Sezd(m{tw zB(lrN6-xIHZTmcKg=9Ow-%qfYIb%iZPxGKo(kEQ%$zY3aE9-$!Y?hW zxAm~Ys)Z=P&AK1{3g8wGJ=3n*rk2_#m|{@c)>1={jm;3Uy_FBQmSv=||4e>L6DOL7 zj0V!H-D38MN&k}jyRR6pMZIGUD$v+D1pl?tnnkjD4gcHOc7)7Nv6>cWsZR-eRb)gd z=+KNa`zM(Xbjy3czXn`{cvdru{tFrt3i|-3!1Xr|gcMCv^jOALC0%Ld>&h z{OKbbfDQY)UAJAPcxCSs-B%LfS>S*^WJ&;T2UP9vsmTTL1={gZ!@b?Fvu@1cP2pIs zJxi_5N=m#Vbwvj_RA;kwrV*3^sJuHo@m>m(@`Ll2noL}1D#afI@x=SH?j@tWTeLe! z2^JO3#`V&=`<5Rzg(4x~GkYzF8zHJ5;h*evJ8BaUy_Lmpo|&57dZf zv?XZ4GEM6g=fEpQF%`rAcgN@x5wrdyZf(0dyZ)2udh@pJ0F-`rD$UCxylh5fWAnIC z0>loSo_BTRQgJEo;#1GXv(#AzkN}nO=3aZ_Vfz5@`LxVdr!3+APT%1l{VZE@-Kj2U zH~{8VzkN0$b{#xwm(0qaeGZ#`6D{ZwE{WDpTV@W=%eOK4OvTY2nIfRzE^ZC7j!28= z#2-FPV9}7Eb*cj#+R#kl-#gR=CONrK+v{h#9TrVhX=M4GAOIR1k5B6}3vl6^04#Tv zOsH(T)bv&K!n!Hu0FOE?3jXe}0!f zbB(&L4^|~{9&mGA_&!$H6Jt7SrJb{S_0_1^sa|NR>(X)DYJ}Y{CSCNj<@N)ct-n9W ze9}1k(!G%Lk(0&JpyT>0WkOgl7e8&Q))-}hVxr7#tNUwzyKSB=8Y8iw4ghO`ey9NU z>?bjnoPOZkb*B3H-ppfAZzU;FY4;4rk!Zo@ajKTtH^>l8PMpR=5o97E4Rn?!V;i)* zX-hqFX<6d}mL(~mjw&P2Owe;!Z2m_k_jMO5(c{=on||8xky~ctFhy!xfHyDYC{j$E zJaL|?G)n43_!OH*o zEY(TVOU$H{seUVT*>bfn6KW5X_UP_Z+q@TA?pHs6776XNE<6ZrRj?D>N6~m!YNL?` z@7g75%J3#6DeV-mBd>V^B|A3H7aIMft2E!^q3HHryp{zm$Bt{ETY4&fWXh+^ zc*?+HcK#d05#|!*gL&(P@t}CV(JwKTV+%0Vw;eYFhBs(I_mHu6$-yXD`8iacp zA9vY23Sm;At`UMIYQMifXT`Q)_7UD-t*v6-k*hd|Ok>fHp5JbN5bXa2L{SOb`+uVm zMVHfsu4`Un$W|nL{Na%au<-uTbxnaF^?SccZAfY#$92!ToiYhs!S3~zw1aLqNE4?zZ1~? z1dZ>;%J8pSCzZzi5bxU@2l*;*WjOdOrX**tIqVGqLwu+{g4Hb|jo`mv0wrn#6N*Z5E9bLXbQ|aPH^>i+bWX zxUft}iO}TZli6x;FjAqdICunlAoKupson=N=>GD`q5My1h7hGaS8-K-jSV}$MGtz< zqr+9%rWIa*LZ727W4s7uC>V)ybzo9XAAeq@vZl;u|F(joNa^cH4qVg=ku^XCH9{4u z>!_H64$XN3U$>o4H?+fVfO~Gz?kWJ_g}i;D)tYd$PS)+yM1+gjJE0+LGh{YTQj!WZvORoJ_j|QDV!=|v|T^4+!(Lo_)wuXMN(7kNjLl^pfs{zk9 z3;xRxu$V7Jf&|NX-%j3Ug7CSbeGWCJT0j;8eC|xW%BA9_Qs4Drd|RDO1o>?SZCY5^ zJS|ee{6sMWOKD^r5x6Uxi1a!jz_mX<1{h_Ezxp~N#nxoLA$$6K-G_Piv|^j@VmXP4Y6;{M_*%gBw6%J+ zzxV>&C33aVx_0vc+GZBKPPy$FSxsP^AkA}iv$|J}{wl`DKi;o7#thn@aDB2ckBXt5 z+Tpp2UcLYI^20_=ppoU?%LGGw8?0v zn(Zwiwa!B??AsD`#^uNHx8Y6r-M5omuz_@ub&78TncP*PVzg>b{N5k@5!VHOIT#V+ zfo45_Fl+Kbo?WSkzU$qhAq8J?%xz1}#tj1wj%qG>B6B(NYGQY$Nvldbp2=9k7&b4U zCRw82qP+oUztzfh6NEH54n>o(I-3ybXYKEuUVr|2L|tsD*{Uh{=F4DBP*1-#$y({u zGAjedM@~qP_I91(rK5xqy=MU5aJ~^K?{}iqIy)wjD?AS?nr@F%!LPLis3{fx6=e;A ziu$G=_=WhzJ(sh76OKHsRluwK%Lh+kQ%e77AE)w=)Zr(wwIFR z%C#$wHtO2;7=H_silQ_eh;ZBbp*sU~;2&{l^d=qZ7vHR4C%`~PNC;1{mV~)x5{H&J zCN(Y@ODP%=lHU2HD<&48@Je9kR6O#z`aMru+z!*Pbn9e9kTFykA9ERdi|v#XtVMmD zVxB6$7t9s_<-L|)qvB;R%N);}(X~=)O3}10{?v(>u9lk&9vbkI;lz= zTm|ZzgL@J#+bgLF=ZK;2#m;RknHkdStO}EMO;3$(Fpd!CV%@+jYJQhV19dwzApIDE zlV~fa`?@~*!Ny`4pdhARyTIzB)brHuTQ8Qju~dBy5J5Yiy$(V|6El`>SsvalwA|Hr zGC65S`BTIE^*&mSwX;0@RBIC_Z>?oLW~8YX`;k5__e$Xtne_yHg(S-Zd#gC?IKzS{ zKB*kdyQ%Y@rv3hTANZh~r33e|SBKF#ucgJH$oagmYZClYq+`i6%TAQ$n>~@rvlp@P z)B@jz+ULE6s0NQgeCAC3K}X%Ct8uN?LF-o9SLo8uV1~2iZG%i+)6YJ|C+|;F`Db{i zl3d|YZt(n?th0R&c-mK^^zCS|lBw)B>BpF{@ln1m-|+p`P(5jmJN)hrVFzdHlk8`` zK{M?EG5e-6(V67c5+wI0O84ydMVIHQI%+3azv?egl9nr+w^XcY6)cFBtnEZTdNy4c zRm6>OWAp6TX&0Cq`QEmY*QMY0tZreP5*#LKTD;HQ&x4?T3oU&6DJ$(etsB>^%R#vD zmkVf?g_d9I_XXm192-Y~5`Y-4x1$1UK;ymjn{9#V@s!vXR066cYvLp?mx@tetZ4Aw z-1!&CMW|*QDqXZzQ^3nh>VZL zFQO^Y(L+JA3oCxuvw-drwM!d*e&4-j{P}SqxJ9p7i|4JCBb(QNk?!AkTj4TxQR~@P zoJZB$HVBJmqFQjOqPQN&XW|J z-nnV~XYj1E=H>lT_pIOdlUR24n?@Me5|jfM7N76#iT7`QMBoM! z_>LtIt}=C)oi8rTEZ`FO_==~y^Oz_F=IN)_eZKHPjZgJ|b8x<7Xw6%eM9|bOPvJOA z+?X02&F`3P^|J2HeiegiKKpE-_N!5y2Rl{sbJ6ko;h$Nh2Y6JRlQs*QVr#aja*eBZ z)D8SgZ`U3NCNx45qOy4Uu zTkUCCD*oy7CCHvU;_>aC&Lh>qH2#jn=bjn7_9L@4^KW5^a-ULfBwqu2n4TO^& zaIWGSvw;nniv|bJw7yDwsTA?5_E)e+iWP=M65mh91Iv^P>e(q9k5qd%GkEMP56-#a zY)~cI%7z$zd$*K!miv&C%?B-;xop}O@$a=uj!q|=A(kyiOYxs`HvNwZE*0k62hv1- zx_{WJQQL@-SN3dQeZgv6?b14TxTu3jOVitb<+W-^E7$WdxhF{^v=2oUX1{aR5ZW)U z68TKYu`ZQ=vTmX*>3V~AsTy(bdT+{j{(z&EIijzY!#F3Nx229I1x+q-qy4C`?RZjM zXZ{$@I zdxX25W8|CZE9Q5bk6!@7z>@}d*Do6$_A@wq?xSyYyiAAoGhX~G77vuvu8?8hnLIY~ z1QV4-D{ENr&%(sPbWxfZw9Ut($@Sx`Vl&eV&HUoTGAHnsFLqT>(JuIN=(bNPy~)1T zGw<8E)w9pGnQ*MF6!D%T)k%_1I>*ZARf$R2h3@nF-{kCFTUXHt9)(g7d6}2kmaBas zo6Obn;a7c5RCmWTlzhPQ*6RDG*&(10`POlF)%T(|enM-w)CJ;hJC{>N`oiT6w1Xez z`^;9lM$WS|^Z+TAx8Jh&7Te}9fAcvm^uRwP35wiX+1mZguWk1Yy3Qiw^HrV3(8yM^ zsjL0=2-jybj%j!C-XDt`I%{i!0eSNmuCB{3AU+w1WvbyZuO1x1yO)Jl1+&nfKZ0?_ z9ywE^Kc_{0lK5P=8*>@=A+rfkGk-qYN0BohmG-%Zg3{wSSZ>`e_yv3N8NT^10`d>d zyU>kjVV5;I;x^(SisO@)kIE}_TON1nq5Sj1k{vm1y2_2OD?@ zO{3q(3SYrwGa@|>X1C;@+bU-V28SNcp#Sq<3fP*5oe`j*#24}GR-5{_9JQj;whti` zkG<-xmr`QH!V!*Z0{TZ+l6~oylA=3i`GTk3r(WHk4b<6oo1#Ey4Dy4H5_=j=oN~DK z9sXRMt88QzKEx(6!~gbDZLX+RvQrW*q^IhKyVm@_{!f%aj|3^K0G_oU5ig)eq^xrh z$7K3>&)9R@g#Y>TP*C!{%#c6vn{{8k)dAYSzl$A!r~mKIQBcB&!HfQn4ocU@?f5Vp`Uy&Ln-V1Za%l8GJYzsyMKA9D8 z(?iY-7Eoe)&5#dOZUI$);rkj8&ds)!8VflZHw*H3sG|v zxfOILf&VggN!i{GpL&)qk)Y5=g){!YQa|T_ zYnwKE0493ldCqy>dBJ&uAL1%@$ab-{34oPG+Yx8_RKR8Zaq)@MnIRRIS+|Lx%i1@< zQ=G-;pI;ud2N<!(|_Os(SWNe$!B#?>o zD=+oYGepd~L@*ZPrTb08l3&eNBkvxE4ul7=TGyHnq)u>waoyyy4h3AqS#aLi1(+tK zTu;386s0u2nbjDv{e7{v)zcri9B#oVr(y^o5rwrxadg~_0w0BChLAfHYTnnpw>g_E z=xV_V*j0cW(@Vy#w}urNvI=M|)%QuBy#?Q!cXk89)wzPNMmAs`G;p+E(2pFP0<2Yx zvjHGciHyvlsgIrN2e&jhENn-I3m>$Ov1k@A4`MEQxEVhtFw~hK)0#U09=QhG7meRD zaNU#}*OT<^_UD`SF9={OKSS+70F!o|4Uo@NA)ad%$JSYm(DxiLg4KNUACZ8LHwGAHpXMh=@?=$bt%m6~k55JK;Zr_z zq2g#eiPz@`l%pbG%8bG8n5+GHo%P2z6IzLX)#3jqoJkoB@};5L?tT-+ zzliOfwSL!~#(z)(h$S*NB1IO|us2lzVe$@f=eaw5I1cPtG;YEG#)5l2>%IIvF!s9E z|L#_UltmM}8K1@xc$Ag@`Yg2hoRrFn`6bM9^QLq4B1j~`pyAJ*bz z4elg;;ixoAfFgz6Q~@SRMlVqOx55j+e#5jobU$3ypD7?e;fY}IPn3XiV3wVVs=24CQ7b~HA+htYtfI2t5Ig)1&9Mbh}Tk1RWO*I3VB6IPn zixG<&FM(^B@X~h=PUYCTl9U*QbO|F-9`-ZP--(qVbN9e7DHeJG%#CDDRJ}%@i#v4mng^y$~BJG%GGnQFRET}>-Bu?}(fY*OE`jr52&k#y~# z?R?Rd;YzE34y-eig-TSw`W@GIGI0*H^)-;2L)h6ynqzanKOG~hLE|?==ij9DzL!TB zVmcGTg~}P*Nqq^=S1T2om3M^B#x+!Cfbr43H{tm{`NS!Eyc@xEwQ1-&@N9PK?uWNU zv+mpiAQpJJqcckU3uXZDZ_(3mw~P&D<=c^z-esE8rf3M1aOcvKkr?A6`(a}-w} zhSYc(B2f{2RuhN*z}Tj6%* z+;lw(coy@(D79Ld0hr#LBxy!EDHo+gPl3h1MtHyRr}|te(prR8h;&`#;^! z7d%@c+kU0f28{b5&W8MSK4H_qgf=F~@TV5rd=@<12rE__!4!Par%h4c`-7I-B2u{i zRJDL|fuA)^tiGz_c9v$Y)F|gz3doTbL@s_mGPVO2Vb_$S=DR7cH$(pWO>p89BUBX2 zl&ARj(B*2#oyk(zN>z1;qbIwEUMNXEWbfA7)&Al7K15~!^VKX;3zzMFwOAk^!7yb z^cuW<8A5KGs>AjR;Dgd&vV1rvO0i>X;E5Hf;W3c+8&7!PS z77%{sUETUO+kY;_G06JD;wP`q<{VX|djYX%{&35DiIL|gU-i^slPf%P8@#LCb~&7; zT^B}00JInGolzUMDzH^TiKOQSS(I!&uKjTMr~PgT_z*D+I5gdHN6ylCZ8zqkS+p^7 zZHpQPGdve5;O9b?A9SH#4Lx*Qt9HEh>ZW`r1OWO_I>esqkAO18)B&OB#dpK9$tvT6 zGSz||OUcUcT*yee8-#nkQ zzqvTvFZ*!3oms&{Tlh6&8BD@9u{MJQ#`owc@8gOG_$Q*#P*>p&JPW?Q8h-`sV% z=z1Nj_>Bt^b3A5Nx`zWI73E%ZjA|1&<^dbPDmyaw0ZeL$>zFlx@Pg;Xn1RRQs~x?A z6wAzNIaTdU=-(49QvMe$yIcw{N*!{V_!1``Dgqd6Ihe5yx)dSz2&m=i5$KX?(x1Wn z=N)V-x)Uje+KGVe(B=E78zI%_`XykeC)Z+?Tp(f1;~Pe_MDN`qu3Od*+OG$VAg5Xp zLtp~$Lv7pkZ0E#nh{Jb0e}5)js4G=3kbl9z$2o4Kr4?lY!8f8>D9b0^^v(S&Xf*NM zeD_{zu#W5Y_N_!pYwzaiY!6C6LO3XT^51Wxfc4``OZWlUep+|R+zKZrOaXfrb!w&^ z(js!P9IRbwAgB`}%NR87l@tGtMeX`0q1eTwme)H+pZi`ItP15*`=E?XWYOy7^&KB6 zfl9KVlNo!_JI>9*RLyY_=M2@Fll`nElK?WLU{lq0mU^Aas6eK}!X68pn^!?BEGhYe zlri#;j9dqJ_eFMGPw%L@3ZXw1;oQJP9@g<_@9UXLZO80^IG9C#jGAywuv{62YXg{t z@~`tp0{YKio`5ayYS4T;LF;*g+{Gb`7Sh*4fsLk4?4Ig9rd3RxCj>zs8B$1KUP-EJ z_owLkr4Fl*XSb!qUZ}~4YV{GpcNxoOp(_~HqH;8a6LszEoA=C64C33D6oFC253XH;mo)qMM}4m@kaV2qj-oNHYuo}^YO zO2|i9D3!9Y4D{p@sF;`8Ei_LI%v=DLT=U2p03f-fn571vDWVa9McPg3Y@%;X^QC^^ zUcMV3=*=}c=jm4h%v^Vq1K=y~;|_bzIOk@!ZzPQAKq|p4qo=N5wY8BVaP z7uO@yqTVXE*HmGPMN`ZZu9BF!JfX=}FO=xmN0!M3o;;_N`ZEydS$H$VZDh$6ko@rD z36|rh=FH1GBUe)!r`eR@V_KhG&W3WYJvVzXsx6~mBy4F9m46 z)5K_e-fg{g4^6CoRtBn;;Dd0cOs9gDhvZ|}%8AoH*Lw|y%O2~!i7%4%0f&h^r343s z^_chUCu?v~RiGcOu&e9VXo15?BPI7EqYpVdVVYatPIsnSpk_FVKIV7CbC=n82^VOy z|Bb!(3~IW4`#u8*D2mt+=_o4F73oN^0b-$s(2E%91Zkl+3o0O}6zRP~=!70nn)Due zklrITgaFwy*L^+zd1jt__r>nc?(EF+!tn(&q@2I=Xy5PW__Ng>YwWW-WR8pg3$sBT zUyeNx3yNgUEeUK-WQ?>=>m!&rN@!SyDUxxmXG^S1lf1W{p!0iN+rqEj@hzP81{KFd z{ajBH?&gd5D_i9{Gnz3-fvb^#+R7rW6@@-FeV}<;q4)TMry`s9-*q(ZgOK&S>pQ^) zrt}-f^Pk^F8a>MvEUfK^ac%5kO_4MTka*&*(1o`=lx$tr)>RZa8!C0vQw{|0pr;w( zb&d9~R(Nl09wX~k%^&1(FDukMjTVsvfrW6l+@hBMUN>+OI4{1S^cosm2R~5A;vF`y zIFWjLYE@5Ak!%|iXcE*134b;-l^9ycgyTgfh*J9n&zFo4rQD@_>|p@N%NzrGCGE#f z7$HFHt`}+^(Jv9mTa3Ige9|E@Kh!u^cfN50L-xgLPH(F9wPX^ZwS_QaS7_T2L6+sx zEuFWIspx4X<=abiDzZwR0yM8JC1C?wuf)3Vp;EGEo7m@3A$pNqYC`K-%7wvFey^lo zM$_ng2;mZVUO=>oxN4lN6d>KB{p7BC(N<$3U~mzmj>s<(L8PjYak}&o)&R%_)%8NU zUGKA=U8S9qP%LbhdOw3p$y2If3-!F!n|EOtaG1|t=~VbmNb``R+3ax|#zlQGPro5> zdPA{+cf@0FyGN0!nh`$ZJ}PHY1!tsVlX8fcTjUq?8!0k(sK1>METQ^WBcU^EuN%!04O?ro{ok{EfGmn(M`s+n9AHkoEt?xh|_De0uF zyk$~2DeZF#!UMnh>oP>E3gl@->LP|Ry490AB?io|c9=eTGM;kPxTTlX@H+bi4f#c@ zss`T&m==(p6%(Fc3LjSZT%vYC44o@0DK3f{%!PK)a&$L==rY4Tnka|daL2-U(g8YN z!1N-bTP7 zojJYYc|(^*Gw8e8jh-KOegSOiqOAAOoxDX4QdakrSw<-@(f8i5Uy#Q3Hg(Qd@-#z2 z5_O-9uKr#lm+Q*lr)`eN7DCd~rvV&C`2aEP;P|P#L$=%1gr+|=y)yBAs@j#Qqmayx zCl|S{^P^_}tSuTNC+7vp`=I#YvyoF0xAL_@2z&!cNAxA31 z-Q1|_J@SP3LNz-7B~AaKI0w}u!QAlkadgi-X>Pj+?}jK{@Kp+jQ}p1ly@tsiD(1Kdf-*=oYB$5f%9+>@G<} z?GPV<93(Po?-d1ewL7$23JOK6M-DLueEy37jqFDP0m(byg6opim+6ti4(Xs+jPBuG zb8#|)r~Px>J&zJYN&!&-=mDtjx)F@)NzijkRRVJP5CrHC8D}OOo3e>pO|zw~>OCoQm&EO!7V8pOXw2Y{7h&`j#NoUIK0XT0+i)=3P$XsFx}+eQT-XlVVcm zd8a#6$sqg^wp2sM{80w81foXZ`*r2(sM!=N2Kq=}=nxBn$HWN-qyCh!RuRPI*(PkO z^r&*6$X&bXR-Tb|a(3Mt;(T;XV=NoTCU{i%h%%4#H^&mko>t$a`6$9k5H=`te4Fmd zRG`52JowT_Dd^V&IGd#15}k4O^E?Kb*vqPK%jwQsIX8Rn>xkDWh|8d2CkuHNCGEW!sCR=P3pr@Py#+zQBrRLYvGU^G`yjim`A5ko8{_}*? zN#Q%!-f%L_cgx{jZp1xieh$jKzDMhP;S=H?wFs>YsHG7Tuv1|~f6eBXRd1SrZnkj7 z^yfe{+sWcrzc1tgtXRla>sN)K>~%C)6o6!!hHq1S+^DOfE}VK(NY$6J5DzoMvRC?0 z_FI7XM8Wjb^FMVl%Bx$Yb*u9|0WR-Hp#Rx_vP)_S{yf)t5))7;bgBxpHfBz+9z9*n zHV>bug;+@^Tm!{j=w|$W2!~96_Il8M2yakhG7-s6Oa0(T3#hgA^qaL9Lq93+Z7PWF=*}$JXSS@@}4`6irUKG)RL*K?`s(+SqyM&Q*urA z@buNZz$eAav8$TQ7Z9A0>biTT*9&I@mV7(nv{FC?DUx^lPE3=M(*Os)+!pI*>dKVw z^oOD1kxjBT=whsc?80pzExR^{-0*W`@mv8nPUaD5iCoLCompw2L%_riDD)EVYya98 z^`a?=*o+>jDxzx2IO7A&)GxP*L?|77JkR^{INRmfN=g6_mTNG_gQnNM+SR;!C0T&S zatH#``)i=}Zv9RcBF-JdM!O;oW0iAF_nHrvxTei{p_qs~`_Fj`DKguZBW^G7G4cgJ zyKfMx3{%Na`~LW|UseXoNk#3Hz;uDP>3zqsEE{=+^$b;AfGRBrFu0qov^zo=57lr!+HCh(b^e)J(%(`Bi*@wwFX0)z4rfR(&yW7u9)H}~!7%;7}GSmbAB!NkTX zYDns*Z*7opx{hmt8ac@Y%C=q!M9=_bkY0?D-Kx!hMAmBm{n%N-W4=viSn!Igj%UoP zDd#{U2!HkqoiX+KVH(>dHzO+MX_+E7FPu7#xl{Z!#`;kKmd6m|>(eHKqI6ouTg_tf zJnI+k=njXpms!WPH=KvJ!WLNk{oGaG&ydNjIU8cArg~U|C;Ci;tABs1DvDQGk z6=JI!Ivip1cf075Mu-b0p!0`Kj3f=hEN6 zVdCC0-tV==hGa;lW2m&+FxR}9uf|K4I$bNPmH|3RcNUtrvXa;MlDuc)T6NP%L&-XP z-;|dHf2@WMtA~K+th!3*agyKKhupoVB)&168T|S#C`B_s26NSPfFyS-J5MVFoW`oS z$W!UgS-0d&Mwh-$+u!977|15t)%i1q>n=^T3nt{QNg={D?GCDz$`<_r0|4jN zSJ^=@UrjDhN8x&QCsa*aj|vB>(SxhmkMiikZu{NTqK4PxuBTBYih-$v>3oc8zdVXg zSq*IWnVE>on_PfT*mhg4!+5|l1cGpDJs+32l}7C%J$WxOsxAo&MgpmL7S+6s8oUB5 z(P*%HsDY?D`Q7W7fFW0T`91mEcmv`;_mC1mtfJPv@O6u7UZ2?JQq*R0(o8v>Y-&L> zU3SjMZnJA3N`pb!lhgZQ(Ajcf!-^AUPP%7!G7p})?7g?J2E7?9`v~MF)=wEs8gw(d zB3L;(;}G@BwtBRwGOr|hLKhOhi5OR(=%gFQiQ5k6JLtpd>vrV@qP-Urkky5NhmG?u zM1zbJwxDPzmX} zqrD~PUD@u4qxB7T!lO$-vmY)>}`Bv;*@;_ zLRauMppcNKXl-gqyZdx^s8vna#8d9~f|d=ll&R~3Jg=N@KgKYPwLAS!Q8qu2J$Sza zI!OAxPIGY8hKQ-*s}{LHt<`mU95n30d-~#^061iY3b)Uo>jNWDx{8GB0vJ4uL4Erg zzo7Q$rIjB$J#!x)$#gyWezU6oetWh~jwmgMgevp zA2x;c2f3kK@?#G5#Mh=b^HmZatqAp#G-F=F2ea?zR)s-RtpQn7x`YY;%Q2J$Aob}&#D)0>nSgBgn zYJ8d&!K60>e8wp1``IObPG#7yO6>IBDOAeumXlqOuu@J?W4m?7W9tZMiIcK04Kt2HpleUI%?tS4<0mvWhU9gk?#*d zPThWG*zMBCeh(GSp=$0eMa$+)>}DnolKO=3o6T{0GHm5oYLJW?D22rnsGig*voV}C3!`QupnCdH_)rwxkr96F|8`s6`!}dc2WJ_ zpD`6SJ-OGNKR#NnQ(5mG2p40wb2U6@3c=H}K{CO~xlXUjfbg^>ZwVf{O%$%wQXO}oU;0|!6+lOeOf11}wk$A|oc3}^RsoZQ z*~u@%r;x@y0Ftf_R&DSvt!Anx9S?%NWPu7ezezB4n;t|N*HELfdL|6<&%_Z^6ZVw# zS)0CRH|5JrijH=r9H$$!7vr5@^sa-`I8B+6vHq(Ytjo zU1&2(pHRu>oR)35D%?Eb;!N;db5{uiVt6;Ag zFPNrn#Dgv4o5|xsTInARVWt;nK#Y)%1mmD0LI&v5X4R9ANhiG-RE0o;eH(*jSUlee zLi!8WjR~1KXRu3RX85$Fsf&neu2+YuQR@*t?WfPPI7#6~Jijn#b$gyV!T|->v$ox8 z5UR4k)*}|DBp0$VaBe1#Ymlq}bpMlYkLjI9BD$_ln)KtEpo5h&$lG$>r=v zya!lLBVX=A+WY7ibu#4m1?0)6KS+=^0HSAOA{ZN@^PjbVqD(P=Q68kKA`g+^-Jog{ zN;o8vzA1ayqO{=;=meKtGsS-z-SCYN&i#t_w1>YHSk>a4hH7cBX8h5(9IRY*^F}0< zaiwEQ90A6=PSZ7>X=euiWqq7WnV^IoLo@Tl2FvQjhQ<3$GgN-D^5>neWpm9tzc1iX zaK;9nZ}kq-{>auapcAx4Lc5tGpF=-5^0XTbPw0Xs8=4|i2$=$>o9J8ESLZ3p?fo|Z zOteUv3#MS7-NZzs0CRzz1N=gh3i*5c(ons%OQ~4e?&vKNY`h8-ImVx6_m_yN=YO|5 zK(yFHi?Fpwfnb!(--zF77LWA*wjVxW5J)N94pzICx0Y7ot>a@3mi&o)e-TLyR?N*U zggAf!dfe&TBln_}Y_iBc@PTDLjplPupWaGX{xTK29?No&4ZJ^UjW`O$ZKqW z13qk9eZ~0h(ChxopsbdKG=K|wKU}@AV4+P{} z(%5#cZ-y^TS3$uuujg{9Zp9nCgGp&#XT)r&cwD7bG{>#*C;SIhGP*AHYHA4eJIBs+ z<}~8F)N^0RMAkigwY-%J*lwe*EvZTd3V)^JAwc~s;1|5fg> zgg+4;ab@K!#5#Q8!3DVLx%}sBY<~_g* zN|3)2Su{~({?<_UiQ)AGFrKN}3J~DW7Hd{j0L>wnj0lO(M>$!EGigA>MEP+Xrc7H@ zc{9KVOhUjC(O{6fVHw+_y&ZnlnqMQY%1$DS_nVa2IB0rEEt*t1v;V6QQW6J(9e?p; z&)pRft5pQp*XIU?_bT>D{S36HPhGi*0oz_G|NSG7`1M<#&Oof&97?MPU@4 zDP&qPlE^9ZKWU2k(msp^R*5R_?0#V4wDKs;DBUYy1JlQo>$}*?l|6N8RTtb2_unXp z{QIu|5%f7m>64~xSgh36W?MPI^0mv|HgSr_y@?!K*^FzrR*If4(Bt4>LQ}t7D{YKfEJVSax>pes_*G=!? zYJGXH-Fca)!5s|C26GM>6zM)+t^OaHBI{Y8DXOV@<1Fa=_zCF`31Pp|RD9ku zNU6PS<4EGp7sUj=3u=qWj$wv8!Y2uy*fR63S2f(vmTaFV9e9T<_V`$P_PQdED}TN2 z`e8@FIR_2ZY|0|#MPfxujlU771r2kHTC7(Fe*FKJb)OCm}%e{mxTN#Hb;{H*FJ zeMu|g^cLcU8y!{9Bm35l?=P&1+OMR)8P039cN<`wpKx>GHWVkn*Dc=37+&8S-dpH@ z?9gB(4K57sxXqs@Y_-UAf*#fm$O&WQI((QgwXru8ZF>En?&cf^BppiGO7%QWY|20! zwf+V3ph`@CS&%_*Jc@C>{Jk@;n=tn#=Kk-!L1h8S=7s`NVv9V(DQ|3hRt09_&dblf_hroy!e>&4`04w!s7^~1twJ!@|Q(^*lWKQ zD%$Rr>*;m_dX+5K^}&8!AwS-h9wh#t?{c@_Z(1k(Dj{3`Z?6SaQj&vZhr5%SdcVBvA%r>6oIT}Z1uQU0lzZsox{$)bQs`Ij2nm#r! z1akG?duwgxRDNhnf(SwHc;O|x;_LM1Nk_5FRo80+UN?-+MI8*;|2iPd93BFxhr_vK zF0ddR9aSJVmVM{@+JtitVVNy3jDzpax#qK{Lw%wz-t@G;l5*knR%uQL#J`w-T#ZieHA6EHtTav4@$ zx4y2E(dCEiHfWgtd9OLH4pCaU51yaymkHH7MdQ^Ita#5~LHBGB^~JaJ_xLkvc1mU> z$>nJKziB?}v(LHreNlFuR5U^QLpBoEwq(5sYZV@)>hw=Mr+iFnSFyIeO+bzTO==LcO+nn91nqYaw8;^!y>O3$KQ zPgjQC>@pa=7$(1Td|C8GoR$2~eK|-@D4n8^hfj*3u1fz`#p5EZsj->*J()2vc>ATl zGJ-gd0kvp;1dD0>-MI?adp7>6IeAa{e%I6F{4rS%Jbgh*Z)vQA*>0%1XT})+r@qea zXiUO^I4t>xNp@h{SJ8XKX`$Voeh(jvJaX=SVhJo8_RNB?@;p@iu+!pi%PObEVntu_ zq?;Xi%2iL$i`-FQxHfF)P!egY2v5GG6`$lgHe0{Y6^&z)ur|j+QLkwkm@B^Xy{KFf zxtQoRHVLzt9#AB6FnOvcDEQC`8Xn6^Nw2hjgBbz=`ua?K)f(E=uNZ+LwwuH&{H`B6 zsFHJ&t8lO@#1IqN?XHZ2)HmOm^t#^6{+DuBzA-R{2z#Bye(4hzmGvb}jsMzO5Hu@y z$W3~+2;nIh#rP$a+ZeP$XTK?<%gPMLUCMxpq{jI@-BTf7`vCSUlXXwo<0KGo+ScXo zI^@<=(5G3P|Hm`nc$uPDH`d?Eb;ovmlQ1kPZhoL-%bS3B!sxD2v9|tLk6e-d^=R+GRm1Xjr<~t<zSPx8PONzDEW<3wtoJl&G6>JqGOt%>Kut$FLm`QhRFQKt7nHRH+J`qkhn^(l`m){ zx*dx6SelU4`l8|tD>V{5sgYJOIh>K@T2l}yY<&3n^a;$-!Ud!sdmNpg=ZznT)vsn-wAa`Yc$xMpRwNJ%2i2CIzzYzYmE<|Wl0PI-gdmgEE}I%xhfM0A zQ{*Mq7`zU0_$C^bnuATwx+B*4jnb{YO^8AuS}dNzR1oW7Al$^4X!3IALtA2^jq`+h z($8L~7kB>5sc;x)=a*ko7{N}$cj6WS%K74$wBAP=AVuJO zNkesHvskp)}ts5_)F`MWYR%5T|y%<>Z#1(vg7vN~oc;o>W+AQUogFvFv zrM4k|YgSU{-&d0=;5Ma9cC_wvdFV(JJffrwWmmCTK%^rIvXg?m)>POcz0o2_ER19H z;nF7h;#tg{9;is6sE*h{Ok-C{Zazbp>_Of7jk%OXTCeqhBhmDR@nL@~qp zlI8+@-K4Q~w??hKE%#d@?jp_0HIE={3B#LY4|yFAll!6NN*gj<(xg`1&hA! zAsWk@Y0xZa-@l!<9#>dV?QsR#ub1}QG+trU2B$IHWgiPPm&Z%(Udn;dzhl6Hg_?yi zr>KZ8oN}+@6vvjLI$+rxPAJ2|S8>#3Np@3nq^gBt4n>bBQf|*K%7JqtduHU)e&3=f zBfAuG)bnemO!ZD;x|;t5XRf*)r+GnQV%pX~qt)3v`sFhPAMv7&l7^MjH;_Vt9T@%K ziVe#yg9_(HPR_f9&38YhnEblA*X^HZg4pd^22X9U$sR6mp2uZ9Ccm)ciDp(z=weEjZ2gkZZ4W|EnCWa?jp%E8mHyqJkS>!?qs#5J)Zz4xN^g5&GNZK{I3$Q{bx(8pt^jiYKPM ze08K5CaderN|*L54~;XJiHa+?TMa}Wi%WIPhV3~g9DK=^&8X7=8*(bz^O`0u<~?=OvZdIZ!^b$y7abLCHo z=KS&Xf=N{(Foe+hBr4;)8li=N;u&pxY--ty#vQ_D2G?zK^6VQdvS_AapRQ6e%0rVz zqL=5?!rtTUtuO9w58AMv=Ka!nItxyM-xj@VY8@q`nG1yQJqkqWx$XL6Puqqg#zWs1 z7*j^J-djs%;`oBK$~rbqFOmkD9Fhkhi5$$b}vy;cwcr`ZB)S ze)s)G770!7i9`-aT1~$fo9Dgn{1QQQDa~uxoIXNUCoOxY$jAl^S{;#Wy*r|#E3Y*U zg}EdZ@Y5%9N^~AQTfc%}VDiIVUrOBH!4uY|tijg%C&S=dW`lQoryz)b5m|Tb-)@S% zvEW7*%gfB2r<61(YJ*SLWb)n0OHiIa# zpJqHwiG&YAS9dM}X1#vvc+KcV^)LS=VA7uX{EZ5`-Q#q;^F3_B+f>PhK(tI685UIt z)}$Lv!$-bPbDqSS+J`!?EmeV(p<&7onE}mpdiy+qSW<4^*FfuwaOj`l+8FP!G4?B9 zKR1XbPrKh`@*jMLmGm1w-tT5SYj7KxIfQTzu6Yeey%MQ~IbNafx7B+Jke~)LoHaCP zA;oW6D33%NqV>K${XAO7bk9k-&`-T*-2OP8mC6r!Ov^G-dFt-uD#(=s6D*RB5Q*&| zbqXcO#IC@P#>j!S$CvUGBv+X`VucOkan{M^`-CQ1pGCUKr}S)1tiQq07&F#d6N3pq z^*PTz{JuMOvS<&3BN5&=EkHr%4n?%@;M*fcsoS+T6%S|OdG{I~hBaR~1Qw~dHqdC& zd699uuD={#pntyX{GZ5&^#`$HZ>U2B-shiXkl?xbEa9Syi6;Lv%cJ0Tl=Lc&X>W?2 z?!=kE%K}DCbPC52hR54WnsFqpedoMf3ybMrgsOR)A=}aCuI!0#GJp5^sZ=a>M#@d? zM!wfV`&zI|zRa&Hc@}B4E!J z=XYCIKTjYufA=+JKai4V87@+)5a2JT^xsoQ$*WT#HG6eq zXagQ?9k~OYg<@i(k%f|4s@YeT&QJ2u6|z6-ww9+nkGEB&>Z(52A029Yd9GcOiniap z06XwC&6?`k+n_hqBh(yJIzJ2($$BbGV;xHU9W9QqPiuMR1XXl7N+hfpy5VVC(-G9@o$y8U@f?t0Jqk-E)fK7<^~VF~7Ri8p9{xbTR>el|&m zsO#hOsm}+p+_k@o+YNTAB{dH68P^a>2$Bxvs{*Fnqh2$-evj5ceSR5?%quAVbYWY_ zT;Bc6^L;%M=YEnEWGn7@Y>%!ZC#)}Kc2`h*ne%y4RRL`FaxQN7&38+!Y;wr*cX&?W z&O>-Icz_zN9|G^pJ)hj-FLq5l5ZJuW)_qW3)!Y8I0xB?*g{VklSJ!2+-<6B6@nCN$ z%d?OK;;OoS`4M;Jc;t0Y#4bb4YGS>)JvoxLlu~iwSA$H1J3s-Ba}^HgpSEew#Czr6#1t6$DRGd@|mQ*1K|Fl zGg1MFyDy2a66C~@+q1iCW8K5`e%1N2%r^>4sNN=?srHdaZb#Rw1)di9xVfEI5Hf@s zXmG&Hir9|M-5jr5RUuSKS$pOU+4o8>kxof)$$y6+b zhvUUA+I7lqno&YPdFs(_J2}`u``txI;hy6UIr`7kifliefp_=5AoJ1{EKf{Sfo!Gi z2~f6|xWXD%(R32PN!9C^K=E@C$X9l)? zE1pJIyN*NN^HJKP$x9MR4pXo0n*1=M)J|@8xYz1o2^>XQk5loV$cJ}-_fUb6c?gWr z9qUt`NvAbl319sp0?BJPVcW^JPIK`Vu#nV<(;*DRRoEc|^!>0#hQlj3?_j`(i7R(7 z!0wud_`I%^upVnyGd7mh$MHd?*B*QT+F`2pj|G}}D8oc4IfqknqP$S5x{-{#&|Fx; z=?iuz+_knAo(LJGXU})W2rhZr+yYTx*=!4D>dQ4;K|b78XW!fZ<)F`N^wh+)ixrPA z#Bgj0Tb|}MW6v(drZxOdx862#d~6bbXB2y7=hYVbRlh^`PF!Y6y44&=Nm6ByhzY>ei= z%d#(PMPrP=@brFkb79>Y`>l)|(FdBe%#l*qhETp^!m~$v_qD~X)K1Hb^SNbp%iE2% zGfhO$w;$VUxmA33M+MkxuvoE&L<=CNL!EEZ1LQTXAcrZR+Gd5nx#XA0lM2X^~jWYy8QIR+*dQ z@4LqjGM_CrpFEkw-{pl(_Yg$qYjv-S|pGTDcY@aa`{zB2 zw!e2AWa*zXQPQTHqqbDPpXe7A#0|NUu?LDU=Fgxamrk=6SR$?Mvlv;smOoB(Uu%?J zy?&55Qt0jElnAO4)we%z?v`&QDywpg!-<&wS%yIygS2^Dg%aD22qxRxu1D^tfZ6>^qHkmy_`L`lUp8yJiR3tScZ7c*@px~)%QPONv{dyW(sf-?bgd>2 zHX={h4Qs>Q$1hUK7$Go-J=@Y2{{=__*&9CjC}Q@HIBOxy;Re>I)%gw+WQS~h1ns#b z5O-gyb9r>bsZNvvQ~1XXzVORd$BWDzxWC32-t$76bgw?D-TffuwQvc^)mtv=^(EN& z_sodG@zUEX9a9rgP|)jHJM)07#x7wyRIYzF6HrrD?eU3|BJ3=xIpV!Dpe5$?k01^Q zh_0X7DxkkpXI!E7UAgG>E~(2^XB5cK?vX822u&#hrfZ|F)r`qLJDBJf8E-G(Ub|PbbD>k-wBD`l9ow&o!@_SK=bS*8HsW4JUq;fDTA+79?}7=8MO1kQsggaq z0X*6|m_@kATs`!S{-1{-dc+`*T~{_6-b-OnDKY@X$eXl7*E5io$8<9tZ2ZR_5Iby)p;N3bcYOI;ym z%;q7T{9Kg87=iFB$oTi*VryuLoR_@W6QZx$K5fnoz_S=DFD<|Aqd&wT22Fhsh# zF6-tBn1tR(<+Kj<*F#q>yDFtWWg(O#`)5W+R+>+G{jP0&4Kvbjmx@NUd(x(9E+_d_ z5OIs|HX07szK7X2PQ*A6zc#9Wh>w;?DH9fT2mBSB@~b$Ucij*=UJ7w6Jt}1K%W)uR z^2G1THWdW>}TWO=2!FWh^rI$4@@3|6~4#%O%#RP4Z|a2!-_yJ z^%9XsPj0O*s>Dg|CtkF1NCpC)g%D+V8vakwK3Oktr?f3wNxdA4$2~OXWN_X`@ZMGA z%i3zQijKcuOI`h&r{uk;qh8Z$8I*sP>{_Y%d|S+{mz=-NiF|zM8u6ZM&Ake>wOc>$ zYKwixQFL&G%)+}0>gKX-`kXiyPxoBZ_%PQ{_cm<1nlA#is(9#iMr8(A7Q;*akx@Sy z{SheubM9!*Pf)b{5cg1rSJn`H+UTtQ{fRMG_UidvTkJ@bx;p*i?@!D9N`2K6Wary= z=t^Jpb-3;SMUWM;bldFDdhaU`>W9wv??+LTa%5RO1>*j%k1kh)4Wz*s+224`DS1e+ zEAyEi{5Ngt^kGdN?o9_4Rye<~&N%n`YS_r4p~9PvFea}tH6zXb#JHW*j+WtDM{+gg z1d3`dlzn&%YwG(aN>I02p__+_V&a-IJo+;JUpB6c<1X|&@8@`YaxzNnoB!awp2RPA ztVgnA;w}o-2MvD*v>Mj5*((h(++p}*xmz3GQlpix4-B&FrL5`?MA^?8V-V!~djo}h z4;2!9HfV7N27A6HUlu*>-ZGVF$@_1uF03FwX=45e*UR9P!`NP%`WD~lmaRdqmoHm9Qe%~58YHlfVjfLi3`>}zhx>WO z%r<&&^)36`gEq7AG^=WXj!c6b9VjxdJk%ZtZXSjzY)~(+8QBjCT zdE;EP=~*zuq3G_`$LrB|dhRXPm?9jV2TrUD`u9Fyd_DL^p~#OL2MOjPa}_26w_kI4 z;X~qnTIil5&cs3g=wd=(Ss1wK>76MMlL62Z*lT-RH+ky?!em5p{Vl!pW9OUJ@Am$t z&=~VQ>Jq??Q0f?H-cZ@vsHofaHIQ0e^s?B@ixTmnwEUM|e150lF>$`(#&uYw1%fg$T_7CVwVb}_!|NtmQ~OT7SJ5%ZVQ)>w z$a>M&$8!voAeVo?Ky8==hLP=Bu<;%*!btj}N{x(FhIOzcl}aZWOd{MsMQ_x56Si?r z(q?T=I^Y-?g)s+Yuc4djS1hE4YDPgDYI3T6bh$fK`FX*!(a)&Cm8!+pB}sl$s|yox z@~gBg@1iIplMkWlmV3=^KD+G33pm@;i(`fzCTK%Mj>V+sUd27)R*iohHDPKom5?B8 zxR>k~Oqp*fjC#wOjq@ZvGvdkc@|arox9v8nD$t4?pi!Ag>$ew3%9m;1Jxp)AMy(YW zM4Gf9A39IKv!e_3Mj4pvn}GeoTh3+4zrf3{yenSvH{;k=uEPXZfL3nq=b2AC_hL8u z%4=-1qBhtHZPBPrAlZ{J!Fz10u-oqii|#KR4C1*sy=6b1NWU&$Q&tW@Z8h`%Le*ZH zIvm}5CHFXh%};TC(n2_PutEzK=>~OFGd1jXn*VLf+HYCpL-H+QQq)`h!V)PKC8%Zs zuRA!wb!Ifzo)2cON;PNwy>+}Egs;7XYJ*|B(aAT2&W~47KIsAF4?l#tIonZxjAx51 ztZ0Yk8U7z*)d2lqd*)21)zp%*p#BOQu8IdaOrV>?_3{IdDRh z##$yp48GIuX7#^=Rcoi#^xqr(`fGw$Qo`!mdS*4F@h22GER~Q6?O$BZOnwYg3ewY? z$@+1}5%1-uiz`W7{6M2!A-l^y-j8J&6Fj}}t`jo!kr@5@g=?7EPRy62dmR#VZ*d=4wBQOX*oLkn+q%Rxn0fpPo7EFUFjSu#xuS+DbDA?W1xQHQkJ^MRHPso z^vRZlsDCEgq68w{ht#P1j)n#-Zqny}`Fd{UoG-l54xPX1kZ=&1x+T>QW=f^%?~PQb z?4D;N2k5I^409EaL!%-fi;K{BPj=?26V=k=3&MRWDarlB!g0 z%XSZ;>d1`&ho2x2%1}YrW;FM$sF@dlrI|U~I7s=2prZ_tXlcKji=MPilJ)4{n(IPfaT){FF01omYQIv>OsaO?U{MPi z-*Ds(hTgbG_@z9dM&4 zArELRMYk#1WjeEGKefh+`t>v^w8RhUR1H$4suzFu-SK(HUC)J)iM5+3rt~?dwnRs| zKl?RRn$9dmuH!LxzxxZH3%k>!j>Hn4b2}7qgWe_z$@VH;fR%XqQV9bVS^;Lz46Cxt zXD0=hOdhaF)eOORZ)63&XBba~M*nmEg3k5l(rZ~LmaMw!63gOMfR zXXQW6+e4M;^4O5o6Yt<8?TzrL1RKRXfo7cF5u647dquzsT2)_NzTP{;z*2R66vqy_ z9xmNE8sEF9l&(>TPHyRbCbKg{kj!HC^4T^fh zYRe?Q^=^{X;BST3iY?u4<mHk^!;-p*wEGa0z?MCy@ z#PKWt3baxKC{A;#=j_8p#&XD}{n6g6mJyIMa+mw430@MqZua9)zzEhX|L?C)+o?Qx z1yOw{QoD2wQ2a{jq!GmuHvQKqV6OlAQHoXhr~d>RR>6D!Lk0%%hk*X{zrO*2{J%~v z`(FWC|9Nfy$EdW$cz~(WDKp_vT5$ygm9fp))=8&omk>rO|A-a9>ZpfP4ocJiEC)=S zm9}UJaRb^=;UWHmoJB*7 z&w#|6aZ>`Q*|he_E93_oHe*YuYa1Ta;|Cl7+4Pc`!m{f z{+ARWLEAFnPX8hGQT}5J;9tgmSqJh|JpDiPF8t?>L;jyY#{HlE;KAGb&nx}!p?F&U zz~M43vlxGI=gpt@EC!o1%>|$*Q{gns*Xh^-QU9~iW*zKaISWrzo8aUM6s}c*)H9c zr^y+r_aWH<&-_@19x&2EUXPScxfO;4dz~;D~OGOi9*5AFJ#fUXC8da{9bX+)M<5N#8 z1Kzb!0N1fN^aj3xjmRGK`kC_iZ$NK- z1t++_0-ppHh@omE-htv%0``N^VvANg@MrfL>A5SDyJ4n2t}S?GX+!&|+EKvcf>Tt7 z9gcV$2E%?b3%}T%U<=q=ZZS)2Yne(5Ktdgnjb*)U<}a#enE8w~y3Q9gmd1dh1)(m# z8!^sA`viEb;lTNKx{@)0_ug0-aJz#_-Opa}XlFp5m>5u&4v<^83Rq1NM$Z$0YK#fqga?8_i)NMr5lQv*4NfiNF87{S%ZfL>b2H<@uF3U z?3)7aDF2uOfhvPEWky0g1*!p`Ss}fnv->_P4-h}7E?KT!jf#Ry!CMApR%J+vGG4QZ zqXOc8C4sytFHX$?aoiKoFG=rk_zq}i@~QeLhTdD}gqY-aG~&(d?P77d0oQoS`^?@E zro4KDk<0xzl&AaCWK5VjB7w?l99)SP4`q84Ncn|3l?zF`f#r!5(%g|zS)$k)jizq? zLbDJwSEsk+w`GSHT|YIWZ#8itjz9DacpcpTkT8`5W|J}~aB3C18pY%NG(-%M|7(=> zlwJ>TR&qIV(ke?tmmLDLO9g;Lov8cJenr%vtW7x2$OaHlfUhPg`j+NTVOt;aRxAIy zJPkyP9;zn|{4^813V=-b$xxjp_yNUDIvKxKy^tg12b8FjCAsf&N*>y^8xi)dri8ug zCZTpO9@>XJ%{dAv%;_8%9ceRUaoyeT8Q2D&Du(7^xo-H*(mMxj1?3aQLyQ5 z18BfXt&A8kcnM%Uj=&qNx_^VuiZ?a1YlKnG4|BK`46J%xV`v1vn)`G}yfNb$i{ ziBMe+<&<;VkK)y5ZN!vqMVtDv7OzwDcL8r6zJ7&Eu+o3InuWBqZcg=nJTYN`}Jj4`4?=?QP>* zk)HW26;V&j6uh&)lon)N30!($dvOP=%?Sta*46=?Ep&4m zM2S&g6`6Q=<03Fkv00Lyq<}l|4z)5DxksPTRzjS)iT0d~KtTR>dbCGY)#kMf;6cAb z7jFf50@ymd6+S!}f9Zs74cr?%3KX-jP~2HL8yDX^NxqHeR@XAo+Kj0fI+L)}VsmNGBMpH7%C}G1HJN36I;ve+@#Ox)& z_q2_K z`TC`F2|fL3i|m>Xvgan=x7-vf~qkf%va{V z0JNqu;KvyQK>gWVXKS;s0@lW^L(n%08c@HjB?YNoS<6&_hP#@lxy;6z5AXq3)$eV- z6O_p(`72?K%4x*U8HyK;pRQb~J7KeE+lxLyx_4m)K=ml`ADvI~-8F_lt_4x93$sN` zJaWn-idW?Y-k&{orG0Vthhb(3 z@&Zo_wcxTJ9`;QKYtY;lztV(>sHv!P{PTd4%lH6pp@>HQeU_<)(~(cHL?{O9%2SV} z*Sf~I!!Wqa9>P+425A%6RQttm5%Iv3ub<>}6Wk{dzt}OASSbWoR#+nj_h8-fd2^b8 zI@?@9<2(MZV{PpR(A^S{q>cDf(ahwhQT685&lmh})V*a`lzZFuJ%FHqh=mG>pn^&( z(v2u0NC*resW{SI(gL;!C?yTjLwA=!4APy0(k(gkyvOOfuKT{8`+48({rWufX|1)b z%^1$}|36~ie|ubXH*I3|Wt!|h=_LUAU74RJlQwUFdkl4#iHMX7{;x@`%TH*%N@lp5 zke_?9Gw5W_MLM3A2CP5LJ*?Ufw>Se^8O*2PVBgPRt+Z>V8pZAv;10XTC7M7in0s=>cvReB>91*icOy1L zb21cUlG4v(u~$q-7yC(c$ZgSX$~Ee#5&8SUyB<`m0>t?z!k9x&w3l%nD%idigUdH^ zPR)9*;Nz0|&%&rG-cs2{)d);qx3V+l)HrClu)@J=X1RrZ)&yq$*|v-`DI|+nk6=Bo ztzU;3CEN;iFNi<0)g~(=K~W;+_2azc1f(Jqa(NW*pPghW&wf)j*#T{^4J#oRDQf

    faAWR@|rbz(k#O*lIF^(FN#X(UHr=BGr1feC4h9Nm!zVc76{jA?rL-tE2a%4vMx z4@hF=f6`^5S`i@T)OF2vy!*4s$kSUSLDvH%Hb09M?=fSK#jE|mb@r91V`h4OCC0tR z#eb+`BHqmnxD>;^GKN`b9e>C9!e4Ks<9*`IqKBo zUG67e6F@8yOZd<41osG z`{!!9hD%1JcP3i17Xd?BQJtZ3wG8_a^cAwuvOdpQ^KOrqxgkk|x#I!QwCu|Um)U!Q z%7NE8Oyl-}LBLlqsq%iu)*%adv+OVhAOhcnH#0NXi2oKkZUf-4Gx-)9L5G<=+Too&;~0{0*1sb#bF{^Dv7#~k|QLL%&dCD70&MP+=j<~$gRS?e08LyIiYyj`l?;5FldAxv+ zyF*BQo6uSD_Jn!vV}30;f+7rRR4)MTmuP*^bCdF&TcR470D}OB*5x~N zm70G9LZsWY67LLP5L#%z%zQr+Q)44j~!p2T?j0)6aH4Fng+#YeWKT zScW;)o{$r;i*@w-c?-O#h8}gzs_5&a>;SsA5vlGQD04`)5&8FNE{^T}9U*M@1)Z+O zmPy+XrNEx7=KXr-P^{||y$h{`^MbaJw4Pt{^v{U#-j3nCCiExm#a(F4ODEwreF(&Y z;7KPKOd_n8Bk%bTlGB*zuaFz*_3F?71t(ohuKhA4ecI_Lb|Qs=ovI(p|7Sj@#v0l^ z`A@Ij@O|xWO8eRV;_1t@?mzJB4a;KQUA_M~Xv|af^*mrtJ@7U|#Vw(?)HEGDPTK~& z05sw5REyG4^4FC{SySmi!*$np&hZuINSxcp1KF@+Ut*(->o_`Y!94%}z(DLysZClWP!6UDOeHm54p zRaZdbf#m@q+x)Ja@!%KJusfQynq(|=h3MqGJ_Gj_uyXW0;eDNHE`pU$ajr}eBSEn; zO~Lr)#T}t(AWFG3N0!`Y*ay+T)rW70K=I+=f8@4LgU+3~uJB_(`54a5tqm+5VkD zu3$BnA<9H~Iz_s<>4zAzoV_%qZSfxk4~w91(Hnj%QxW0tT3(qEcz1?-PAp)r9lfwNgP_)3t{Lp12yOKDKs-|SVd+ciGRM)R$$PV z*O>29px%f>tMWW|+hvP0HzJybo!m~qJ3B2{H6ryRmxu!eH>8E8`C3E zsE>%#EoiLOJCtg(t^I!Xt8VDqJ(>}~>!-eJfJV33Zsx7I|7Q)(%DA+nYM3H7869#3 z0YcK$*Nv&y^fw;Aut+1PdctX}{TJ=KhD#qVAe<+PyxC75{&aV(EBc-hKB|W2c&Mjl zgeK~qF&yI6+X+rwyCx-Zl$iF6IT;VO0CcZ1W?jOdol>5g-^3H4r01uQXafx>+6hj$ z$%^oqk&2Rx*k3Ash26ifuSE^XItocgSBBsRAiP#R@4i1=QEjnbuno;(&~ZQ$zS(ty z35i9=mzO!Lwk+7_4KNUvl^Lk}0Vk)71I=(foyv&ebh7)aA)6Wr9Row3hcp~#H_*4u zQP)r`!pOVATDn#PJo6iTmQ}AbV9wwPkH|!b&WX&6$zzY8%UGyfYh7#c%ZPIy_>zaf z;CW1Ec?{_JO6@D|f%p`^&YfWwq6)8$SFL?~LYho^egl=fNzKzBQn z%pGGA?MI5~-j&p!#+bFa?VbDKTskLH{WOMjsy)hdt$Q;gkZY>dYesN`id@N|i60!TKnzaewY z-?!K;tvfyYFu+C dcQ=Y4VCILV}^pT(4bt&yBO4kKyx8v-AFA|?8FgLS!jC_b zTDuRZ^!jD~XI$-7n)a0@EZnM5b>4r1iAEax;+r?0!Xy{Q)83NB2|aPYa!vI zsGvd^z@tufZ|AJm`QX-K&14mrcIVD%S)e`!QUZi;uqk$d~aKJCur)qK7Sn z3waNg(IiJODcD52)@YF>6PUU<%QPFon@Nk$mn%1y!n;m0Y2ma_m#P}^pNG3-4Z|DA zBqmrt?111-d}u>2YSc&OTUV+1T_DH7oM<-Rm@Wieyapxo^wfu*=}f|8i%VkLA`qeN*dTOPip^&Oq`>(X9dB^$$HmWW00my1q+#$=-4{&qi<*cr>=;CSUU z>KI+E>fuDvlDa9wjb2JQ%sYOfrLfFNa_xo>5Vs8s%iNoSnAG%ylmI3SUeLU|F>78$ zMlbY|*G7+){&5Ya^gQ-)Ehac|PJ;#+ZaZ$}yIH=OZZEz(&m2vZ+XAro2*H7T2_37m zya?zfyO_p<^)hqsBHo|I)VBjf)f|uUps^v0w-d)j-8UCb?7y+8+R${l(7RIgw1vUt zC~`+w+rCL7eeNsHkePrZ!Bvy1-P8|8@82Tpb=2=dU1xePddxAaS31L}NA_#7j1h;- zFd(7B>vjOJUT!HKdL>ge!PjYdbVTUoEpt~mnYT)E;541#P&Q*Jp&*$*SVJ1_zNlL- zsme(1VE5V~VIXL6D@3mAgegnNU=P;l%u@Ux`HpqPo%`hPofx00aH$R2#l|g3= zjt1F3Bhd{_3y?6>yk@`>`P^bouHoc=gc{kMznq}qd7tcSmBJ&9oVSuYVkE4|j`zx) zU`+YsQ}%*DrWR>F|M}eRfH!7Xw(BZ%7PuCDPFktG>)vNk@?^+E z9#n6pJPbspvQA0L1d)J^N@<7Lzac-*{~*I-3iuMoO@#0s1rR|J5_ke6|HxQ0$qvRq zc7ZQ&5WnCF1D1RFDt~{kq&xI{PjX?5qYZGTObDas7zNb>-+yNVNuQ=+;BSP@f|+_b z?3VuflZ5{N->UrcfBzr0u$zbmn_0}e-uGnkRgiP2C+4+Rs;e9xkarOkq!uIY+F9}w zc4ZO&xhv~-IB)Xva|hT6&n%9R1mS?o62#h>s=}Oj@gHKGx05+ zW|3KL)7-mr%`p21e?Af|lmE2Y`X!a&@F%JO;=I2H^X)!)5f~_V}?VK0E&` z?Sog4d)CDl6V>$YbX7Nlkd;}9OI0(lw|w7Jw!SL~AIO{yUJPzw9;_qV{pd$sV-cv1kuXWZ)|0g> zyX)h$BLZk^tFEScaVhS>iX-r~J#qdUs>MclPb$9;@k6E+F3XT}Lft==C6-tvCU1m- zL*9vTFw^z@_I)4zOWpxTomVIBwNA4ycw|W{_bpXr!jhj05TW-@=6cS5=*t56pa;{> zgb;4;n5vc5o$G`PAM5R+9m9BaEnS?JjcS-B&;KEW8)yzcZ83a&=e>T|Okcamme1&j zB}l>!>8I*9@Cg1McpJu}|L4*}L6Z7MpyH(Q4fqtRAfo}kQT!T=by#+ z-%K*CV}?%6I}UXcuN4mLL}z*tO6^v?q20F5g}sE1b09$vZpET?_;_@)3hk zk8P{guR^lbQ{-o#1gz}8a$45uQ|4ZTL!YO)#B5E_S$#h$%l6|JL?AX)1GJ0P*@j~C zAG({r4$oiulkHQ`7N#PkOK8nnL?+ANg*7FtyEbAqGt9jAw^OS&ae7gZhU!Ti5$ZkY zjatk?GYOe;|L7R`6}X+Rio5fWSaW#!&ymEt0sU1jPR_gP70Q0MtDrPySIy1+YYMNjcP(^5 zWEKw)$Ncf@sN?<$fO`1?@twoY;M)DYr$-WIK#(*w^e*aITI#JMx6?3xAQKsGXn3OV zwmqyG$gFuo8YqUBse4;>N`G3XJrEl^7~ZW#Y4L1U32>e)^kiXsww~awpR1{}ux8-e zjMK_o*d5t`M8hxP2G%M^J=)2w;+TbSJDbcQV|})5Okz0ha31wh19#&ONRZyrE+XXw z(OH(+H-^pGDJ4O#pYj%9VXd_sbuBRI2aT0WGdRx7R02F&2^El0SUz5){9%T{(Q6DB7s^Bi&+|gaGxGz3X`UohO zdxo}C_xB530;!MPgOo~&qrE$v8l`VQa}-fSuNE38HE7BR>6u|0#6{-J4Mf>oQTaX8 z+7R??7eqlN{qZS%!`&5rt&Pd{|lHuj**rkVOqxkx&JmqJMmlV5Bt$P)D-7-ux`xbelxTDO|fv|S+ zj(tB8IkLLJFF!x`dwX~XoZ603UDM&83D`D#+$LxH!FJbau7e@%-O;&2o(8Drwa9mI zi6?=EJ#b2ualMhOxAFmZhON?#ibA6^oFSaSq19iWTfE?kCVqmtfUjeBQb7E%6xEb? zpMdj2p$wC?>7Pe;7%0sgDJ-tlTW@{1An=n=VV4+3RsKOmYP-?%%)^|479om}hRNnL zy5RxbS@)Z6X#$198PgHn`zM7%a5LiSw^n<~l05o~N7E{6W~~tdElYE~by$5Z+&;4@ zv8rwR$80c&e~cdi+30)OZ=70oW_mc?e2czo3g6ScoWfPO*M7tuHtVe4uo&q>j!xi2 zoOP_ip)-htXqwcxQ`yWemJSU|vx~#W?e&)lNEJe0I;d1@RQqA${kS>iYL32}&dTk@ zjA`IUY#!9GwL5@&AMsQ_7$QN{CKfLn)8b8>EHrb$Rb3`Y-V%O*WY4-zQJ>0kOU}?^ zyvb%Ul=t2yD4bZED-9T@Z=1`z1KcHM%%bf~W)M`L>qCnV&&;7jnURAM9Cc|hh+(gh zOmKF)gQP%g{j-Dv7D?Bfx795XZiD?Fx!|MWE<3M-H5K;}`A-rJ(cIqv1v4Dwl1S7Y2EhDZha(XW%ZgwQV4H2?sJ=6@Obwv3F-{_Bt;PpO~IL zh$~>|<>l6%6MX|qZ*u|jvT-HH*mR&w-5gC(sEmaX_fq9rZ+_p1Q6#9$-`9?kvNs6f zqg%DPAFk&I5varIYQC22EecUGj>T`Mc@CBB)hr(JV5$KyN=vxr#3v#J+H=k6YjNUk zkwk^dAb2jgAU<|wX&Q7Bi=@rVS*{KB61yRcg=`@B4j_Pp=lk?8uPV!(km(WoWDX&O zw>4ZjH*IL^gV>k*h<`T14Yl#^?%GSkkdx?FZ#{xs{YcdEz$k+L@q06wa5px$oF?+S z&Qo%enc&wi9e`=IZT0LmQ+MZOd%rXrvr*A4i#@U9dVYy> zy;A#LyHcXx-8RdmTFWEV55N+p^RN4JeD7e`fyn4j9{@V$yqsdM*!XD_>g(UV(#ETh zR6w)zmXBCz7VkM}ru|_HlW6$iys%uO-;h|GQP!@ZY`dP8&`az{csttGiNOsOv{jAm z9yBu70OtkJGR;qQHd>$Hg&VZE~DY$mr8+HBsA;K`G=I?wxh0ib4og|at`Fu{Yx_KT_6 zE0O*6DSczqlM_v+mX@EXkGyj35x@-Z=`{p0Im9hDuNm6MqB#SHalD4x>1bW(aN zn_a)RWKTAT>M)|BuRhu_`$hRY@4T|3m-$e_`>N~PB0|DcvufOBi=W^H=nhAm4b(JeM{eyuC+GFn)QIWpn=8yx`tq^g&gC zRaLc?xrkt>q~++$x?Yh_q2)-&Qe~_lsAgL2M4~?e1{hq z+t&}Z`Jel(aE#M717&TwOIR*&3FCEYZqY5?AlK`ur|oWS`y>#x8+lQ7tnKneguNBZ zu=!b6^W{fiZOr%=A4a`FQn6}9Y>f<~kGW%1G0m~x@=e-4Ceg5~K#56eUGX>>3(>@f zGt?6+skgGVs~7x9i_KYnSf_=66JbuM@&`va=aK?vmO-Al4r#Gkn(c{jr_A`*Q=i>E zj0|`2Z|tg1HgN2+;*6;Iahr=JVT1EItuD1#pvj*94mYxKW|oG>z3>G2A$?YXY=@;-hihYGe`LF^b$|8*CK)d7`Z|mPBGK8DL-dBjI3cSwr zwMgLm_cl8lbShJf}B;!Uj1(^y|=SQ2RpmGc>BlAw+>VF?sSQZY3X~G z^RMNzB}`9~1U-x3t-Nm3K6RhHc@uKIEq@o5X{Or?h=H=|@tzkUn^`|y5HnU}W`J+8 zpiDZ0poeNjVq{0YH5z&!M9lPw2*vg_IWEoi+2*YE#nqLZQW^N>uwQcOv3Cx)Ze3_Z z_jpzh^B^@ZkE4zZZVBB(tKSHx3?Y%sIvT6ZV8HafizFYOFH9HzwBm)cKj;FnzG zT!DQ;&gZh}X!y#aDZ`hx+`kYUnz`(!>PsgN@6b|Nun3`89wFl6?}~L2nA_FjHenJg z69vw?;jt#eL2B$W0!hCax3OFwnX8Gth{1S2!LhXmjFUyE2&&_zTMTO@@vCpG_QjVfZ=o(h=SZaPG;n+n zmV49mTLOy}khRJiKp(j9jmF|{yE+vpS@?l*v_y(XvzhsDC5(EwdS!Fx9LW=wWSrxu zYxU%K1F<6eW#l-zbuDTM(Y0{J_HFO>d-p9N&ipOs044{r8DEj9nwaCe8D&=c8KEK7 z#nA$$-Q5oh&8M;H!!B)1#UR710BgoY0wXGD=Ox3|qEg$5H!1B8QqtFFI(sF)=Gov? z!akXyDmgw|?fw!Q%3YGk&`6G4c0q_tQBs$*+qv~%T!fINJStociRjKfoEVI)zIkR&9V-Pj?W`sr5Z z*;7=h^Zw6{{v{co@#Gv{$7a7*{`Vc(cu>-&(fTB)i;4!=?*Z10yzFl25IF|p{5+)2U&PykB~8{^*T*z)DxYR5wJNol%`k-R{Vuco zwf(?h?=~j5=es^MZLt>KW_|w0O!~t#3`1Cl?xsF}&}IP1FZ(;u*|^-TqHxOoOK8=r z=~LDqSc_jAsp6a{uQ}LxA628ddiIC``Q;!ee|Eyg-D4ywoOi;EYm}?^$RAtYCFAn7 zF$rIeZ6t1-`eNXBg~uqP&Li?w0%4yP0lT%~9giyl7+-OM$_J-VZvG>yMd8!sPILI-ZkjFSW9E2Ta0Hj=6=>>bIH~VHan(o3 zzyG_K==@b|y*Y6zur%N<=6ypLL=3C!rd&^$qPD^e4d~s;`+mgQ6VwTXE?P`3P zaTMpvB(=_!w-T?PJYL+htJr;*YxME9gm){r^L&dUQ#S)*tFpkZ&1G0kn*BYW;O*c- zP~KdvJUcRdjK!?7VvY&F>J*x-vKd(BR57#&n9bpByP@LcPx~7_Notk1?+xW1ND#cU zh|5M1SMZ(=ZdmerrYUA`ITa2{V!Tr=k3bY2_Qgqe!~H&_00)-6Z}r@HW&igMQ>)y| zgJqW=48bJ&g4DiSIfK^q$s8VrKW-nP60DwFYpY?AV?XH5wra?Rp9fapy`ipA*3igP zq!ESCRzy-D?%jHS7fkCgumwMF(`Gr)RFmIB!aGWhVkG)(MP{jPZzUU!gR&=xYWi2) z$}g3e*iliOFgkZD#zo2*vsq1CVysvT*fcpkk)c;qZo%&s$V}MBFng@V(41SB(i+{G z+%Cuj3+%;`U&OtU!+}Fr4VUcKej-@VeXps)dr%-$P!959zO2u6Gzol#%0sKmf!4mM(ljyE6){+`+eLRTqGI;fB|Oye{Fu93TBP@aTmlPBW}43t5L3 zrv+N_z|^>L(dJ;Q25)GG8S7|5hE2zq4_del!y8)%fxNq429w`wrjWV!s>EZ*?n^N( zixvv^wscCfT3~M?5v&_vo)$oW&;$H zouL%i*{g_49C+#bG;fr%eS*egnXC~btWN$D8WHp<6bs+qFZWApl}*j)To{_8UrP37 z8G~9w0P`9*v-mTXdj^T!=w#1kyw@7WH_kiDkRpn>m%p;TSD>( z#sQ5uNxBT&h*@fr=GHo0D9gc8$yU*}Kt>GS%X7!zi$$Qj-o{aH3%srsu)ZAv-Q6g7 ztopO2tE%Tt(-JBgXzKr@E^jz2?__U~b;Q%y9NWEmVgBqi0pST7$GUcET}-TNQ5w%o zbg%qY6LX=P?kCVXhu*^!0^_vgMgoG{ljEa@l}%g@ytZCDO)aG;bcWH3Ib^t$6zyJbM z?Wery8B@>}5M?fa)iZ{cFt?(@r4Vf)&P0lV_`H|C=9KdID z3z>HR1gq*<6RFdO;#R)Sy1H97bRD^L1tgIfNC^Mu<6mhpa;k{pqEk#Eu zhcTG)Z0klA*%P`)*X8=~wuy8cdaODI#MjF;PKHix9m(!FPh7#2Fps>+q!g$Lkl*B6 z;l1Z^+pvUEGTb)Gv9x7nRHJIt8BQwG*D8zT+=ycDaxI36INQ&Ds_A>O6 z$`*Pjl)2#^etrdPOv|zQn}eKddYf-1eufT_bNh*`HZWIXJ~;MxRRaZ<5f~6lCUbu* z`_pu^ch|nxdTq97r51$0KE`~?c&TjIb#)Mo+e221k$?FG-gpB+>)-z8+G^6RWi1>P z6~mb_;w`@ohGy;Rdk&v3tl8grUsY_IZBxzYY3=tq_5#~{$2APOHnVGPNsgl#IO~7! zNj*D8bavBN10c2wh)8ZR;bOzAMEentsCQ134fZkYGfcEXDscw~^StiFkx;?y?GErT z;++APvq=w%l0#89oP6D1*xR-0^=6saxa{4*p3VnjI3Gw^21Z=?pPqoJI zTV-RKfTy@ia(k#Jxw-%Q*{MPO5wTLE>D&et6O!$&4ZGewHXhk4c{@^~-THA(+*-E9 zcc%sIdd-Fs3IJjr1kMKOTr=J(^TmgPg({Kmho_2!<+17R_`lW5yjho|Yre%kjmI8)-_&6gtHfWi9~lbw<(!09B!bMm*BJyc z_VLZ5?Uz4C7R?O?Uv7x$FjOKLL*@)S?oL?c&wOGtdl~j-b)R*z4?@tZGh@G;G3i^= zR_f2un5f$_ec;IUFHo*}rIZOPwru0+Nmt&7F*`zkL6h1h3oq!iPa}%~CzM?pdqSyyz-2yEkuhqw zytunuZKqQM8kT^F>)%FQ=V?fbYw0`3j-$y+uPJJBYNWlZL)Vqj6f8yU9*dlK zVt2~@b5_g9?08`SGyPP&kB8kkLZCePrBn6zQaqw{8J~`@Q_p%dJ|$?e^JMqQ+Ux99 zxq$Z$gGCq)Z3qN-c{JZm183W`S|n&u|3pYyX);pajS`&{p5I7CdQr`a?0KkU?nliPfM> zv0mBQ_lgmwp^}$9L91m_8m%f;xosM-{82*NUHwYE5 z8z^~~{Jw0`B+k7~=#~MAIk~t%ct$`ddR~%xu+DX&@kGV!tNd)PkG&n`d1N{H9s`e~ zgxp_w7Ml6Z|3qKW%WHn8yZ=gQc(-%!TVDFa!-eNow?K4*1H+baSE{59^;ESf-gIeP zJ(bI*np87Oj{9tTRpl0)b+shs%po_))(c1uiq6FU6gN;NQ(fo_X`D{coq>%m4YNQj z?F}609T0Xv@qgOp=@HGuArf7d$v>pUCB?H(jANzrMMcj4f2nf#1vF|TB}P_tGo<`) zTtD9d3RG#eFM{AA`R8LoiO!1L8op^=<`}UGE_)UlBS`Q0*XPR&0>uHIp?#OEgw&Fm zkW1Ejb&k~ks?9m66_&q8{=4-p$B+|N7i+5&>n7C|%as z!$EE_?n`CJ$x#x`!(=QA{8CZZ)g+q;aHRA7rz1UmS{Oj0iC{|P0*nAlC@7a$?j=FQ zlAQ6OfBnL0qBKt>?S9`bbRm=G2);NdhGKC#Z0ST6%xhQ;;sF%PN5m>oZ7+FPjprZz z*S~~dLy%_sKT~|NZ+tOY1ZKll2nowe+S*?p$CC6QOz5BN9^@aiKr8oeJ1#VqU@cBYeOi(13L1jN!Tx~#< zzPW#2W)Li|Wep+h>XzWkbRNKjv+W2d$BLUlj%Go+dTRaFHn=QD#*6w43gG8I2u4(H z{qiy6eA@HEMxc?)MO1qAZQfw6isCo>B&OxhDAa1jc@b_jW5oSTil+-I{!hm{J)-xM z=GXws{UE5^7s4R1@D{-d{Jltc!eP%=P>{}&imeRfW8Qm$RPe;GE(>O$(zO5->Ns)> zCl4AX(QZs`j&|PHrPA?ZC9NR(8>gs1kLK++E zdTwMGi>nIex?q53xxJ?|3xz;zOF zUxmJ+I4%`>tM^9c>wGH+g|xo&{>)?|@JZyqA$tH}+`G~_Y{qX-(?h~27L4k)aoJR) z#R4eaOHQ&WeBW}7ml44o>)tl-iDM8jFRlG>H(6g1M6#sva6%P=5&UYG7)dJ+&en6e ziZE;s3hBp(EF`E53?RDM+7(_DIPz8w)wCA0NzPBjgn}Jn=f5rRqrgEpWh-XTuC+GL zk;@q6TM1SRmu3iTj-mcqf7eeYM1S7OaERjg1sae4-4Ld0R@nB_WXDa(#(cGzj9t0h05pPe2xI+~R;{iC&WgTi3gZ9a>qk?{@RoW!p~ zmULr(&Bpz|sz7>r8_lMX%;uaNCXE~;C9y=OYe9ih2mNmAGrzK3Bj2&WD%@J9=c{AZ zd!>l^QAyVI8=gDshxRWbvJcrl74OJwX(@OLE5L4Kc+n878Go(yeS7P_(e?LcWaDb2 z7PaE{*HQ&v5e2)QArDyuslwkVn#$r5UAr$l8za$@Q)R2;DWAC{2DAlkFcW2;SnX8g z9RMiBsVYN*ZCEY3+zPfHg5z4jfEEW(kJFXaII%6Kk#fvs{Oz{ZY}BFf6F^M zMAX+bIZV4jM@=YjUK}hN*NX6pB=Ut^QHm_BT|ivc0a`J#JDZF1zE$8+74SZjWM<&{ zXkm?=*u2E;>2=lPvOaCLFvnL%41CmHX_>zh10~HNY1nSS@}T=TI_M5b7`W!k;`2$b zAMlfEkwo;<-vD2;eGJwu?a3EhME$6j+BNkQe^`uNZf)C_G7-q^Y1cS><9VYy{2)C2 z&{U_djfDxEOHl~r;5nD*@OBD&RBrlVOATUft%&!(z>&POJsnq(Gk1=xlY`e7o%}*} zg!kG_!A*y+MSv1`K14a~v^V|r{*1F@O|iqYavy#6b4SZ^<_^#3rCt6vm#eKvVUY`# zddzr3pi8sRu&rM+E4OCm=lN4x>s>1P#BY#L`3PLBE>?;y%RJ@8k$j9|^rG4I5Q-Dc zK^J9*S$_2MqeSyY-R8N4X2j2-r`m_t@_=U2R+Wv_GX3KKcdnncY)v?*7I#LM+Y@B< zz3*EhW}}SS1kcXuA1Us8FI3|K2FXy*8!v<9@Qs@+PCZHfMBlRqg5iice+Mp=ih#RT zE@0Bgj*e%z~~j;Wv1Ch+<#bP%Ze=kyY#1Mys<$i0)ODQ6ZP2JEU~Pso(84EZN=t z`g4LmFPe_U#7;wgbSeqs9I8(uc8L;>a1Ic$73T!X_}pq?T+RU##L{Rn7*Vpp`r5%{R7=>-)K@oAH=qi}p{yK=4Qw$SX_nH5m)mv;S z7mL90(bum!D7H~<$m&=7T?&i;oPJ)Atx(sXutuInG zPmHwHAM15<=({*cX8!Z>C)6UgT?dx5B8Y*)Bf3@mA5PuBC*$JV0w`DZ`vF$rFf^GjHQ7qxw z=jG6+0XAM2P?U*leG3BxBld}MAGqL-zu^@J=!I}smb__-zTsau91&c09!zq1W=8L) zhI>6G+r-z7dS6HqIp}M$#T}WuAa?+#Fz7;-1xTxquZBS*b+O2Dpfl9^5Q-)JT2xm? zeG&(6g6Z=F9NBvc_f!qs&yB%F>?gW6THN>PvjJG4l)pFxWv3CqQ=FTz`KMZ?tx?in zk#_GNy#kOxddZ!G3oa%v91CqlyJ9f43h^ROFUiO}A!ld(A3pv{Z=#pszy!j^IQsLN zB05CrKb`y>vWsuO>(y~&Y(e2xCbF`3v$V=y2{!@cX6*5J5@sLVMfb|MjP8dEbvHS@ z7h+OnJ8Cb4%29MO5Hr<6cLM`m^f%&`SUPjYy%z)aML!M(hz6i#Wc{T1TcA1p^+vym zbMssCnGZ_)sL|S6G}gV+UsY*s%1MhP)cMfo*02vN!P0!gD;10R50}1*YMiqDeP(i$ z*$G5i7~OEe{U;QNr^mZgpZ)-+)4ak{bJk=AHJ1^m@Cuney;pT$I}U3++8d;Xx~M(& zz(-f$bnA<$k85pbG}EP9s=oN&z%YKDyzCf<(G0 zZMu`bnA-HhyjBs|QD^8HPIi;LxEnDOYl}NSUwwIawdt+rKM%sf;tLMr^Oj-^(wntp zw56EP+W`_a@S-G8Y_q*mSibVAPf|JEx@_`{&@;7v+47&MQ_nukCK+wI<1_w}`fT~+ zgG4ztot~R8j25mSMfs}bDziDu1)MiSV(6o$(F32L1o*GDexT$|T9nYrecvymY2DHv zL}f`&9% zMBCRM4?%AIF7{~T_d}K&QeP|$T5RY8UWC0lbbJ_&-KR+QysqT4KStWqilO(kUeyqX zL-VZg)iHrgTj8Sj1Xyl0e5Qza2}}}*c!^KI8XZ!DP7#sA6~KLqw_oUcTNR^9zdq{h zs4_vUWLHlqC1m(qa9iexxiAEk`*Gs|>Z2Ac4?PIiKq=`A9S(jKdbBLK@gI50k7_8e zhc4lJuEwX|J;SAK1Uncf!YqTHq)F@f66LNGrQj^qyg>rgn0C!@-#hg@L!s{ZAy^eI zr2m6%>hJ0vyAlEpe^xVj_S{lT^O=&&);c8WTR`n}F51k9{IWvGwU4YcC!FN5#^{Iy z%9a-o(tp7(hwSTBK3~6Bw;LbO2@M5o>x-?BZGGm{)}crXz8jUb{)l`3!wvwiU{62l zzU(wm1TzPv8$U~Vd--p3d`s{bBe&|gafn5nK{eU(lzyVqK5dxU zZ>1uZUwX~PHFEKbtm{sXZ5pCvCA*zZuWvAa{}rmBsp*xgHh7AhIr{Zq2UncW$F8JZiWpo0j)!A@73|CI zAX9-y9WAb4QrEA4A-Z^4enS+0X(UK3HI*nB;)JDmtKgmuy(yreOqjj49(^GT8H^>K z&yH+UqQ7c>g#DVhMQ`Rg9rG0dQMz2s?Z++iDXTwls_3zYZ11c~f4#~jC}NW7zH40O z0s!KYgX(7bXpW@IJ{K}s*b1vUiTf22zv*qTK-g%y8do~WnO*wzq%q{eFU@1Z^{0IM z>hc|BG25iV1@?{DlgE``E8wd=N48bkpg4N545f?jt?R@oDZ!sU!>oKObA)?jB%NfK2z}kt9307`TohrzI?j@4qTzX56;2iwrzA;=6 zd1#u8hPKiQjJnxe`J}}LB2Q>Cm9uB>JI1a3m+$`&`2H&$@8v2%)1Q3wB+*sZSSaZ> zO?p!NSn^aGos&Pu8viG@*U+R+`DRh|^Km}gc)#~P^r?s^bh^gCgG8FGXMX7A{jxdA9R^Q zYBhMP>~&z`GQ5i1l^%0uZ}TnhkbT$4y5-k*r*23d-S@5ya7H7wd2sQ(ipEl+j?@2r zv>r^y`nrBmt2>~NZ0ZS8yOIg|bh3M^49SY&o7~=T+f#aZfp_v$s0=n!llNMN^sFqc z#KiwQ7rw5quViQ^Hm$xC#{D|SBmM13+yh2=6{XR^!N_ViK3|vjr`N=d1qU}?^_x7K5=#j-mEA> z!CWz;E0fx$u+RE8S}DDqa!tPicJ~nKM7`)_J&<@h_u$4oh?|Q;j8Na#7)Ob>0vV)v zA0}bdA&OSv$HlAMFDFNv3|@T(!><-JF8F0H{psvY`p**ELnqj^49V{i*(4e=Y7X}h z$VNo$C*;#vKfYBE5mFd~#gYzraJ~=vdL&&o+)dFP&5_GWv#X^Z+xF~e59nC!rHE7G z!-1AsRfkKUQ`Rl`Y1dk3pY8nX>q|AyacBp5y{YX3KCV?DMb$zR_0Iskn@`a0PGatx zmTMNXA4YbHdV7|yn*s(Vf^RmRgBbVjgwAY4PfEmk^c)`$Fu5`wI4DQmYs(6)+tG1r z(y}^=-IN2L8aLa=>90_&sn$P_efIn9)Wmg^TQm9`>c{u*w~Z|=7XnyrT%FY^LX$_Z zGmGoEj?UfU@C)yG*$oUvHO==a4OW`EPybxZxGlB2P*4v}7c>Q}F4@3~TzcvI?Llfa zw31s!W!IaeLA-VqceL#s6Vqb9UlHR#c<=PXja&%;&yFJ_H;N1D8*x?6ix1blzIHE6 z!`r05KHm7;#J9uxiFC=sDi3g*47s(@(9nd2=CN080h1<-x*c2j7z3B&hqDIH5;6mn zu0{2zlmbh(Jtp6s60P- zoxADi@_OdtkC)xRzwX$A^S(JNIApd37gX^P_3XzxI;NUfnVv%>F*`Y$Lyn*L?#xPw z^|Yn28nuj>vN|gD5Af{I*e8Vf#AH5qhu*olIP2u^r&m_sWiYtae)K{~^E>=e23~{8 zt>QKlR7q8)+O6K{LU zaZYh4%QCLE*zLRzwEd5>M%+p`tF~sg_T++U(h`kUMYNemoVWDnO;DO zWV2O5`)iCngQ0V?`Ka}+UP~fCMM8Y=g}L%&Q}-V?Z`T2m2)9dUYy>nEC+cUho?*>e zt61`HjVtyhC;vc^(7grj)@Jtws1$LmSdEIt+uzf($9MC{Wv_Tomb)PoVHK)4ZnK&s zCDPjAvSrPl87iYQG_6x`ZfzVDp88@0XZ_^ws|6y=p6eY% zkKs7)gR%_j^xpQHY#-aAMbtOhC$~HC{3O=2NA>Vqvmf9b3rfTd7Bjx1HSf_F#5so5jK^FQYUA^WRgs_pG^a_OsXjhh;ba z<^6iFg?-z^4;I1oXsU{5$))qBghM@4A2Xz;IrD;;(J{zo!;$ z|DJ&7^t8%)4qQ?_63qBoYgd@ZR;33c3Z;Oo7# z1kPXcA4@>-jF(3wTx6-XHJ+`=S z9;qJ-)Ulx2yBWl|_X7K3yWibqOz7hPwi-bOx&hC>&@^XYyZpBlcBsIC1wbEz zBpDd4xBy46z#u@l5jsKW;0v@20!#&Is4%52)?Pw_XaE0y)yWkVJKo)8NNCHuwi&i{+S`0(DtJJc_5hrxaL u&2@mfy7arcp-?WZK8N>ha+e;cY11Th$r{d-rC&C-rVFFoui?x zor#qt7vc^Fg6}rn3wwKOJAQU{i+_6s!phc|o$+Ch2E5C8YbgyoJUoiaxc{9nPUwcu z^7oV$f1u+0X=(IqG^yd%;Q^QTG{d9FKsv-%De{58PO%VvP^75yHB=2}*4M=^%0Zr% z(Ag;aiAuad*Nk^#;p7dzki;954@ebkFRtru7ac8>8K=8FBj(~>KhRe15mQy4TUc1g zR-WaPS8;cDuQ~x=0}pRUJU&QvL9kO)s0dye|?=M)YliM?4&2@xvvC8QWim;1O_HtuQnAdp@%_z9*z zkBx_iCrAA+kxQI#gYZJxzBM#FQBetJ)2q3kqka?JgI_HaaI{x@^yo8NspaT`-`;_! zS6lQQwJfEZnBlVg>Z8NGQrAt>;Tn(1rQx#9$8r3>e5htS6FL|A+U^8X3m6%G4=;Gc zUft_?u!+vqrQRW}Bch{lTgb{7IWLtdIq}suPc2WgKS!NitI$ANEuRICE-Hq{BGv<5 z-d}2=W!9gop_cy`sb1x5Q@L2!x;USaP%05XUO~9u{*iZBaC>B`w0+s@$Zgy*MUuv) zfyVjgi6~#2^>*IjkqSE=MY-Yow~J|_K$rzvCm1_G<*FnP|XxRjdz)e!F?kY zm8zOJJX;G6F{YbJNbQO*D})q?a@y6O0+;9?23qHz#iJ{V6LjlGR;|f6p}oGnBkNC< zCgE}A;jkRJSGioX_kn1+E9H&cr+Z!dFSZs39Wi-jsM-XNEe*Fxf2Km$2wPRhhnow1 zODhxgTT5l*L%*W*;`?$=CtT+`<-NY%DSVbjChNY(ZgC}jf2JZmukHh4&bzRjSy{zi z1~vv!ku*0y>^&{UeN#m^`C-u2{wfzcx7BYH7GGbVpHUAH+=_O?qVs8A2HtM&P@t2o zYwb#r)LZ;Uf0mBxRP#3&6K|H%qI6N2m~(i|9>_{8zxr!M zihHll5_c^0J-Aq6Gxe}?Av;IAXGqX(>q*Opn?>;b<5Y9hD!dK-FW+3uNbs~xzz@|l zFv63HeE0MK>r_jadde@SGKoaKi~1wnON}h0v|Oq8HxNb77Y7P%k+%=kdev6acPBnL zwf#!%v;G4o^lZM@L5{%SIm0?1{PPR$nHQ|?Y3Bb#V+RW8r!ndB3D|BqR<+z0zt?Ap zHRQ!xJ$R?xH)tYsf6odZ4ff~j(b^7;Rl8N97x+p(d`#CYF@1_jW$>IUnaI_t z?9X%R%T^uTQ#g@N&Zb#TNNl*7%D~+!Ulmuq6g}dKUn^NHR8c&M)Tu;mjpGxLT4TJH zO3*`ER@H{a9iPtg1#Q{1^H$8L)$JL`j7KyC(+DnXRfcaB!S@-qC>u3W%~r7)7V0g1 zgspy4WIo7=w$#R_sP0r{+CppF1ra{;+dX_Uy#2xL^$@#qk?`xii|+fYO;~}PblcsI z1&t%L6JOe9Z_&w$qy1UoJd>VuB%?Qt*G@gH_K7dnN<$QCNNp3BwdwN}?5SIO6j*1n zed_+zJJ?IqeJAFc)_!8BXJ9?$nvk%R)!gwgT|({T3Ifg z-yJKU0_e!)iuw{%bmly*_d^=JBydkJ&Z{>Wukm=dr)iqHeI;2mj{k9qNl&9G8oAUV zT+CLYqe}Q3jnsKso0A-S+qGTqaE+pjc+M?xDgjX#;c^+fL*Z``_WnSj$xorlU;otE zi?WWxX*0ZBy~|cBg*|IhvV-bFw0*q>Ytt=H(I?LNA~jAhJaS^GV(HgvPot<&(5OAuFu{GzU*Lh%VgP%MHB$%6$(vEyw*HmOT`m4Jrf>E-1eVLg z>ZhxI&wRv+-X_IYQCgcz31Mu$-!*yy-|&9z{#t&F|a6~lHbKOZ=8Ccg3fqIzD} zw+V43?#qHWPk0!Uyq{oJgks9Wiew#Ko)8~-me^AJd8KUyRKdFp)l7x!-!^}=)Cytr zDMve6y4-p^?>a2>o*ouuQY7%3UmbH>9{j{-H-gfUMePh%I$0IwcS)2X#P9PDUO+mf zBqlnohN;O=5RYwd{t(L6W!U)Ps7RM)K3I6G;}It9;6`+5LGXE#QQG_dvl)qDLXVcG z)yLVZXTH2Vg?N%Cxs4rN8b3NL6G(rZf__0Ww!wdqO}A=5(B6C(U3(a@=qvMVS9fmm zx^}77%4~%5@arMV%gDK(XKCH_k9L}bMX@;qjhS1Dw#6e*;qiUQHG>hECA13y$xW|_ zg#L#x!><^;8cu*ca=x9o!(t9!jpB2)DiryA^l#W@MyA*w_IF-?;mF5Mj6R8ESUXC8seb#LhtIOwR4leJ9taTc#RE z?R(@_Kk`_}aMD_7vhlJp%0~Z8&w-lhGeLpSwqDOxN_$7;wb`f66jQ36uWR`!UYWJR zr1;|13YZob-c{JJX%?Sz5B8t;U@Bv) z4|-%-t+YquwzWt(K!Lk?TZ()xYX5c{!VQL?LsZxd&DNhEW2*O1znjod zT>GmtVSH(JV(iGDglRH>oNb|z`^67B&-Peu6W8TixH_^w-4aIP{-(GsMELOD;X78O z_4*RD_rmp^^@O8qj^mFkYh^o~%mzL`wY*BL7w^8-@?~`%a87_1RNhnT?$hrjzaj&I zwPJOfZdvL5SbfxV$7=V^^Tt#Yy_Kz=pPigHO@7C_B@_g^xO&2M5UW8#CBsI~R15W@ z9G8arf_iGUhs^T7(F%KxTtEx`$dFI?vRk{^uaz}+MlysZ$P4=Msip(yyiFOZWtO8O z#ZIFR>ZlsCEDib9bhKyU)Jm1h`pBwuB)cAsUcRm%Z;kWn-`al)(qU%>*{bBj@wgJ%i> zdu>x?p-asNyAKfGp+ikU3!~Ia62<35Leax=$u8M$#G9d!arz1J*efv~HfY4o5Yt>c zYNWDiI9jPE#tOC!78#Gu4y4Ob@#+A$8NI_c;u1=;G*n`@zLK5*SWMuks~lF#H(CM5 z+mpkL^m|DihF{~*%?@atDE;3tHoBql7VoxKkg{8|zRXeYs4dyg z?l|Jnzt*s#EJ24syknmqygE}+d9zb+TYKOa#Pq=E12lsfA!HuyUh|C?vQkwc4-_% z;xQZNg!1UEBpgT*JL_aD?-XX#7X3b(bXBTrTVz-Qf9|WI9V>g^?-I1Gom}A!lbN;{ z$GxSp%IDsaPG<$2u;zN6ztaR5UsS$+guZxa&b4RPN4*Nm>NIC|_>E=igz&VL{q@e_ zA4y`PN0PzUD0!wNn%JmQHdeOqscY?X7Y2(m_G%Xh(!v!d6(5H6OMck9O+NuWw-h>a zMJ3X|NF@AvTHCqNZx_(FA5oI*UJMw^FFadSx-fJ${C#rzleOtE`E*yRxyQMsFA2oc zx69KV!sg~)R9@MjN)`CZJ8G{?M=04I93GRhc;5p#W;2wMOJ*e)v6?t8&7LDA$KbH9 z+=K7IGiKA15_rOp^IdG%oSOrz|Fex4yB{cbz=|&qI8!zRa>u1M$?sT=0VT+fr$PoY zaKBPu4BKMj7E?U)#PpW3yaoe54Zg8cn!0Pq_3z$YPLJEkHsZyXB@vKgv?pMuM+Rsmx2K7tEoLXqVSyU?Lx>Y~TTqIfRU|KU!@LaOBqiUSXFpXIZ zUy2P_)3r2CSK_p6H*Un^PxmGs?O!XFD@qZnwzQ0|2g;| z{Sk+vapnuDPnh&{3EY|MZjC3!QX7)%eDX)|S0$GwnKo#{YCW$s%Jngp;ue_(MVIb_ zvBlDmY(F2w?UIpcSMD{T;kH9JuGz{q;Dwre(0!uYg*`_q>CYojE^zivk z;iLPin6ys$CK;V(CZ{U@)63E6jOS7JE~L|a&LkJRr@MY_X`LYOwb?F%DJpEpBD8BN zcIyuN4(Z5kcCM_L=b7nb1n#a6RvIjRS07<+aI36~93ZnE*(q|7rtP^E3uni_js1&x zATrWOc0MUxd2Cg-wke6=_QEqI3Tz8?C5f{2m&%qz?`R6~=C^J4{N~EOo5d&T4t?!% z(oN9HjJ-Iv%~zqxPdUmnKS*5PRq;{COmTg@muI_~B^x~@?cPHub+L{J?=X6n{gua}Dp7SgPTNqf(g<C?^lqcplge%A>UA`W`C0 zEbq%vm$cW}5bQn7BqB4Em=_f;fAO)fNPN7&x~h|>NLbx!T*;=!+6h^bXaCpb{oRJU zLL(bPW2hhUmb>~aKQaQyJ%p=r-?z=+vsV4|%`{uOrJP>A=si7zc3YONtF)%jM15AG zW8K+oQKZwTBU?)Nez8j^H88JO*V)a1(8rA2kdaJS&g4@ty3Q%EdTGKi@pZBV2H)dV zSpvnS-sNYeri6y!h4xi=FKjUw>PoWm$5|b3nWw}buo_mB0HL^niGBb4ZQ=69o=(PN zYNu5i_x)~s58Ebo5371IV{&%=v}dC+B^KR9w0`Sf3E2mrE6zpc;dwez?CYQ}aMP85 z#&AyB>3+mkwvRrFJ}CeZ$MBk!Xg+SmZz>4w?>ISEiAeV061yyHugk=Ivqkd zb|!1kbJx?=>C>wWRhH^ZbXdT3=fRe|{A~?4Uu|WAi>w&M2d}0H8q!sv(3zH|d_?T# z^|qf|k|cQH+QgoJ&SG*ZDvB(udpS0$Jt}6HQE=}mGk_+$TDILo)-SP|ELD`)GPa@s z+cOjl@)lt{B5aMvb$@ops5w3gS)AqP9?5S88_f36G5@ zP#OyMr=39jteTP34SE?)Gl9zLk+vx}%t$*+I(of#7P%A}dDozC?T2rXZa&@f6`|O% zc-ajd75SUHmRWISTWoO(3y4HS)rP{}QFv^*bHdWM^5IW$nL<9XPnoGl%rvbF<_0o5 zbsR1hhp_%koAM3rq!3%#ey}`F=$f@u+r3yl#-r4VA<*vT&(kw-Ec(!ve$b9dk|?=n zFLdeFJfGiO<*cD@rlnu(2E0$=E2sT6&YzcQYrA{)Z&Y-$UmkuKQ((H5Jft)BJJPjU znyp%$y4C@k{*i{ib}e>jUSpPDciE;cJS}~kIsV=>#!fRUS}O%a1Cam!P~-*Rvol!DNmi`9(JO2yq~M zxeCEovQ&*c5MAx3*QSWqC83EkNSir*D{U!y=Px9UUm2}&@$a{$w_j_OqBs-M?Z-Uc08eD zH7;Y4Aa9~4yJW*!fqk*5vk}Zqz~Z-{$<1|ZCwnS8R(?J@GxsWY#iMy2x<4DsL$T?M zp#k$w?q(M%)i?OOZcjou)>~4>cJIMT`A>_`*ri$g(gsYTd!I;8$ltMxd;)ai#Q8Q6p2}k%H@^{$#XVCrU zB&MoGBmCzNTq&GdmU2+^xt-#z&5J6F3iietB|*I%BdnLBW8+n-wo?N?SyKvrw_Zme z>MiOU?A!YA!<|l~5LFcG7Q40Ef5msAmm8)_vq5=px>^y8c`nQ|UE5@s=sP+$=BcZ% zv!_=c?|35%_|wa_{ONwQfMd=;e$>;jXoO=m&G+zc5%J#ksUg>IQP+~rT|i&!+0$0q zt4!Y{Q1@a@8Gg7ITNqC2~%O}$bf|>0Y zdVfdORKne^YU@{UXtjSOS}Sduo-)p}d5xZ*=2m95?E7#};VOPQUFARhP%1KcwNCKF zX^O&b;-@RV;p)GI?%)gBCn0HX;d5`C%5OW*O}0v4IsfLdu+$1jayeF57;2Ot8gylzQFgJZj4Bj*EkGZ;{9(qf8R^(ix}gRMJD1x>pN* zUYST|^h;MDq8(0*y&sMP1o!%{DjLC3Y&%453K1iT^1<^KLpqn6Nk)B!ZQquHiiPZ zQJ;8Z1{m*i5O~WfU>J)P{E{5^;a?)Jz(gu3bB~G-9PXKubr3^^u4Zew9z$ z_vRn?zD}YUUwj`AJ$v@-WXWaw6N$9u+(kc#<2^6Ea-;9^FD)cfp%BHdQR<0^QmU!8 zX({1S-RsbI&BLlO2MKHIGj`j5$Twmf^HB(rDgH&aUy(Aah7{OB~1X-=Ud>*l0f z9FqAn#_4jdKnQ=#+MJzgrP0zU)K4V>WO{A1z0cw(pL*O09r4o%KNlF}oEk_Ol@c-3!-Za&@T6gZGF4NN3`D!6O)hTtmm)4si#TQhs z4VZ03#D0-{m~|`K>FgSqA(c7G6D23mMF^IvKu&zddi+5956ERy>>KB5=DD3T7dH+0 zSas{N@;VS51)ZK|(q*bEGqBD@r)}7#CBHEfjfzG*siF(xftm_tsOI%JYrj28csp0Sq8s13SeW@0%c^Id z#jM8+0ZTR$-Ex`II8_kZNvF#7V%=UGuPj9f$_%TM`%dU=-_;*F8ymf81QO#G_*?c< zA}=rG=R7g|#e6Q0(Ar~J^)q)xdi1UJ^JB!-A1VAhb$p_h4<65L zt0h>h{En1d?`l6?E$p$C^_Tm;{D?!gIt6{N6^i%v2tU(BBL=kc)k{kEy|v96-u}gJ zW*1`n>-$aTaAw6D9FK_)ygK6rrDwXT-JE!9?B}~ziG}w+?+LK5upD+jVh`&4$ZMs) z+n=Y^w7on&esJ(ZjQD1B6I#!U8brL`U(C1FiQ1zDo* zyR0z`G=2-9kY72pM9rt~6d89iM*mUtN+nYs2AvFv@fhET<}!X9J9Y%- zP<;8Ll-tC@_Of~hSNHX`HL^=eKx;VtPUjU6@klbp)$+H(8-E2xD6MuG7g67Lx9A@OOWHZ%fhg@uIjHU=YaDL1x1 zAFFb?t`|16^l@ZwI~~pMTKfR5wqw(2EA5vj@h6SjW65mC_#gH{ZC=r&KI?Fw$n)rV zW8nEp%Uxak<@{aGC>B+gI*x;Q->^szS)u)v`qNFOOO^P9eQ$qv8y*KBC$cxR;h(mv-cxx{+YB5SdS9_lW-6mL=V@GDanSUMC z6AK%BFI`PP=t(#v-4W>ZoICKd2f2OPC5VQf@%zuZS0taTZjL!VZwhueqUAJ@$_~C| zRkivsyR+m!@cslb78?ou59`xSs5&?nFyl5_i_fd0`0zEh?JbsOKKNbX1$#+({L2n#;nmUL zpFU6OETkfKmqw+}MIo*Q1!9pgqm#XP6H7R$yaGnIiyH7q>_4s z=7Qh`jl=fC`R}NY(b{Fm_vwLWM(^~^CVw>;QdiLukGXEjlq(?ZzfBgTUh0Q^xDcE; zWMGWH6vpx+UBG&1+@3=Rf4SrtN#BIUuk-zaVsWNXqi$1xt|KsDP!?yHsVloSr#>n6n(`V^Z zFFD)qYLB-0B|m>%!wYV_eUmWtto{978%1A@%{YY_oqM~wSthS*gukniuxW9hDmGuL ze{Wuxmd=@dGp&u#ufm~_$LE8B1a8o`5`(bBFn_Um05?WUW_OE@3 zx3tTx69+#z(S+}~w@zJd$446y{rX1r&CVhO37`fs<+~t#?JE{!k%=R+C+utY7{YEYLRz;Yg`O+HvyCb?5T!E%0ld$!m6TQO_5(j1hBPMnbIrL23X}{jaaI;%Rf9qK zU`7Y?kE0HEF{3+PM|NFw_hhLwxZB*&5fwK7Fmuk;N)dTG+8d@cp3EB3ls$?A*hl`R-r7VqU$QykP zqJn9u4t!ZUCFILD^$zZaw>=U}HswQ;ff*b6O6UE+KM1Cy(XjL=lz)GGiSXp*$^EZ;V zOJV7rvL<|pSr)m!Ymt&XEh@2lREsWS&2%|+`&x_DtX6hsiYC`W(8C8Lbb>g|AW}V0 zTKGlM;%FsWFe6=WC4A=B1$El_B!cHz&VxSqgxc4o$sQ`dFISL>ygl!!uNo~QQKS-j z_gE=H@%0d!F$CnCz`OBC=l)rzb)sn%mhZ7+b_~MtR=0A*B(z=zCdQoiHpt5OOSNho z<&aY;5IF!&6nW;uxXTjbWP^IeFW!U4#9nt#RaIShT82yZT9UfQZPikB30qYi^@N#Q z`0`Z?>kIRAcdVj!HO_|aRqbIbvE|9e)4D@vHx%R%B5KQT7UY;J*7J%#Ra)2hYST+g zE8t0qN0c~}zkqh)lf4FX$F$jVSP!Jv9q^rR9Ck_4$`!J?ZOl!i&kvQD?SpM`s{ZVS ztE8n)C#ui`gr%c(;l6w?~~s@ZnQW}{rgV{xeT6|)e;#J zpHIlWn2Fas*6XO`gj8|RJjjGnTz>d<(`(Zg96L^R7oqaRu-)8cP!m50B*^fpP)U!v zD99L2H3sR_ZZC}MdX$^#rpZJQR2_!N3!P8BG7dhQ8W`oFm>sZ=Q8f#%g06CZ_q#}K z3a*G<4~v|VM_10#4qDf({mjK{S0>o-A#o%0$?Akjc;nBr-r5V$|5oLNejB)h^)&@O zjTVO#b|B}_bhI-SBCRX%tl{lv4e~Wier+T1wR;>j&{ZsTUDdX})xA0!R^ z-32XNjMjqy3Or(@b@sBOz9x7b^0oJTh&dtoG7vyTA@}irr0_*PaA1q2F);eF%E{TA zbNbJprj9Co3-b1rP6hz~sk|8W2^EpX?BToQ!+?pL@{`f3(fov^15F zdwCyHXPAKe_6ssrwPGQU-GO*Px9<0)Piwj&8LpkL$*ZO6v*H*m2h5OX5jRMoUX;C1k(Qd#e&koyB0G zp&Gb)0sj64)B=tJ@5oq3@N50h;Pvd)6F!9Slk#vr$wD z;U{K}@*Vbj;yB zEp@4Q%s;<8br$79OwE6{4gC=@3tagDXLcNf<=s<#1p4%8kU zEEAbaA7AACZ&5Ln;FlH@8nzArytaUS*Pr;{)#<5}loU1uq65roL)gPIj=FB!*bwQxnYW&oJZ#;RD(y1 zw_x=_;Mfx5nbq%r1dax8nJofCQsmcy2lN@r>q=hRr9-%)925w`SL9s!^uU? zuDf`WlH06b_HuJ5Y$|+Hf)+vyYko9$( zqd~S2pC|KHJR=3MB8%CMI7grZvRcA_E)^o-cPIs^!g{De)dT^NcAHBJl~vVKc$Hms zkP0~3Ew+g24JB5kRH*^OEbq+7w0W-Q2UU0D8*s5fPMza7X~w!!w%v1FjCNCt%1m;u z^GT5m(d~7~gUA*cV?>m$>n*v~^JTeGNWI5h2HIb5WZ~@_8;-XYxsu`GwY=4h`-~@q zccd}?BK4O+4Uv(7BrcSLxgep_nC%oUe7G7CN$ty;dl~WkxV(5THb!xCy@NPGy!@wo zf7$LsGIG=o$}{47RXAA}WDC__ua^#6+KtwyJMc|JlC^B(@~U_ukAJr6Ka5~e9a#r9 zBNn{vch)H&R%2a>@!^|`)Y`mRV8|EY!hW#$NgVlDE-v8HDHY{P)%?j@+Ma|iVIeKTqZ1ol*J+N<|$law&<; zr53}B**VBUC~#>z|M*yit$Obhr$)vP_O|7Jm_LW5Ku$qnoTph*2pL3tzYuDH{)OJG z=a4^q;^PA8raF|Rmm=ksaUoqd?UM_<&stL7=L^k6_f~iunOUFmvPD9;P zgO#6k2#&Q*ufra|f8uLyN>V3L*|R;YPKifBcSX^5m)#zT_xbLCe^;56XNX_i?orGLEdQfT%rS@v>u z6x=Nhut+(J*^a}&DyHf$M%o_p7r*OAA^JJ0=KseO0d##%sFDi@-KxBAvu zbWp{4PYS-qyDr?~O@P3S78D%wABhjPpw=<9pcMX+@0?BWqH(OzjQXkXM?}flfPb5` zS3yLS^u8i_b6(llRa>F#rUKhvGE{e-z0T=Ox*Y`6A4T_$lP@_rS?S= zL8?RXF1r8*>?k*7+07jF6C!8w7C&+jUcd{j7SE@N?aRTVd)3b?Gw_uzL+8zIq0ygA zb8|Hy(c{N|eUusRe{XX7|Nl6=e_jH;vs{nk@0--WAufYrp#>@3JP3RBXUNkI7a7aP z&N@H>lIp(mXVpB-J_1tapYgPix)!jXQ)ot84HdUQfiN7cbSi@-rwLhdH;4h#FLHv= zMDDCpE(sg@vTVxlo7=mvPcwd3pTsSppT@u2ps?{9@{U-)V$&*ZV^PV}2b^P1aY(`_ z`x&g-iV6QyrzWo5v;GpxYh{Vc0QLYjYQX_15Mc`Bg%5fo5jv)T$7ML$A>Lkir|$7G=| z$2jEv+FNdu?uM(pmgZ$6wgIjEQXRP76k5-&U9Jy%-PUUyf>YP^l;QU>V2;0mh~;#v z5hJd6g5rm&9e17z5}^|#b4?K{()U)0$?^GQIX;Azf(se)7eOet_L`yp->rFeYfMJy*<^&26IJyN7@eB+MQPDh*o`$APW+*3-&jX6d1-G?F8 zHAjbTZZk2)mx*#9swfx3`7IV=X$!ylK#H4Q$Weov2dihvG?5(y*-F;YteLIzA_u^C_? zpYOYOp3snxkNp-5Ung4{t47});6`gd2Le<|Bj`E+EYpg;YQ-mriWi~UsuERX(lT)T zCFm+w4UPQJZY>b#6Ac#j+%I=SsO1hw#Hnj~K%@%7oP3q5ja0ZTWfFh5+C=Nri5nJZ zKwtRt>EEO3i2B}z!VY=^msMUaD(n3xbyv4L(#REKTWHh2;#EmWk6$|SHL5NU0$e>un2kN&5y$v_8Z{?MwJk_VXW*F4yimb3D)?KK^>g7*Mm+d>+N5N_-6z z-AA0B(8;kC9(!B2I&z>{B8|Q!O9W_N2+)U|W9h)alh%*C`K;wJlp2)KUN7Etkj{bB z`px0I+sALn_n!R~B_t2aAlF)63q7AU)9gCn?&9+DduDyv5!|M|%pC4e1k@nR;ajd#Bj?b=fcM~&f`ox*WbLZ(Wj0u>XQ34M0w&sm=7~{?10Ds8mjoFMAGH$_D z8ipB`s{?;p&op_>Qu{QBrJvbrcD_d5)|fPvYykF-kcnc~v&4;@0N7)4J^)IA;}_R4 zj{<1~hX82Ia8i@5{KwY++SD`o=bI)BjcN?}!edn|?Bs1JSxD0l^RNOzDgj#YEwQP3 zdkhm>(F+_AR+c_a$))?U3X*<>;qfvK)!O0Y68l$ohrDZdUtBcwc0%S2?C3E5Rny+g z_X{o&2%RCd+$T>V&u&k7wI@Tq3`*=U5RQ=*P}gt9%)o*~SWgP#rfB?f1_O9+Ybz?| z`}=c>_P)N!w>@GP;(+OI-z?<>+KFD2XjO~5;DFg(Yh};a_4xBONW=m4H5qTp&|zS6 zpaog!Z&sRdT0TYVMOR$Vfg1ULd_*b&=-&3s5^sp-*dq z-!Za&iuk@hFdl;6yEp)yshE-rBv`G;NG{;rJ6pj2j<0nZ!MCDv*2!#2INZqi++#UX z-ep<2#KWqb9!SQb(v0heK=Ddpo(e3V|K~>k^7VNV#sLtBM^>(Ko2HuTp1pYOGt6ua z!>%2<3+kS2-7ARJ4!{7C>7yt_32wtg&j8f5o$8_I=O04W>@G0Wf8;hJU)$8grH1Ex zc;S14_L4mas)M1JA5j6YtpR}TIvmGRmG{V(|CPpX^YW$p@53^UGZ(HJQFL z8mgXFHfo>`x&KTq_HF^pY7MiMjZ7ADD~Z*8$cT4kQO$=2n7cXGRgcfPF-H0&6x^A? zcHVJw<#gEs=sTJa+gIlPn_+iEwaa#V;(LyBaJ*`vL%bC6V_s3H_4LpJ1e2#*&Hv41 z2?SrEou8*#6NGE4VN?ZPQnmJ-6{*n#+Mxv`<BbUsk4>u;=ZMgi*h&qGIlL;3y2o@PDq^?DP< zEu{uQT0z$h_{f_J4idh?FlvN}ZP^EJ5GN$%C}#w>c9erOqZ1aHtNHik{{l_lGmS=m zV}+DmccgE+98|YFnC2-p?PJ*kJr}q7V@fYB*z&MZQXPM)0dGxP+lnhYAK83Bau_VB-cpg%N8+~8Oz&Kuwxql%A3DAV)h2WEnuk(e{ESnm1f zJt^S2iAzdW&Vums8v1{}UhN@3hlj^4{6gSj=|5gq45@#aaOMfupHG0oeOLuZ>Cl-i z`Thfs#n6-Z`!437q?cNa*PK4qsz3maS^CNQId%uy!m+Xw^|VDswQ!1Ius z^H0U`c{^eG9_(%w+0Ay~HwuCSTIzM=iGi4V1e+F5J>~$&`VjQw%R~aOEd&oXdUy=K zlj20vgJ0}k(i}DLcWQukwf;NaKjCn!>3m^#AO6@vB7gs>p8KjVn?_+n-^aKAL)L%k zDfE45Q>Es)t`wYhiVzSz5ds^uQdgMAeBkFy9-egO3^jqLbFn%5jsi~E-5zxsU!sX` zqV*cVN8CO79>F^No?cShs0FBn0hqYO0Oy9lv5M5^!wrs6jiDUOsQB$O<>K!T_BAOm z`j0&VzL5)t`CkLc$Mf;@Z%r>0R_UG%c#xzgfDJ%QA7-wkdk0NsITf@)9BT9O^M{C!*`$`r+*4mb(Pv%>P0JtoJ4^Jkl<=}6?En{j z$BY33;MD;|RTQZQLp0{UzDM+zn5hpJ8V0m~;_Jx^^SMo6DJ~(A=Cbz(!K*8-!b79_ zauyul|M3rQN)1bCb;JW^8Gh-|x$mEGf?CxR9K zzemXbf4xD6(#PF*>GmV0wJb41mx9Hn341+HK0&C|xHJB4Ck9Lc9tdr~SXDL|v%(ia z;gv6^96>P(%^xo|3B#$sIDrf{b#Z1U^EPhIVZbm~w|WSt@tAcb`$pW>=*I0eoT7}= z%(S(&W6_j&-k)ykspZ4<7D2$e=fq!XQzXD>BFq9Z6oon)ucPszdia63`Gwc!>p6d38MBRE3dteIAV}jbP|k^ zFSl8QgoNTRyhJ%*P(g_Ta)UZyHd=+C2OIqOUK3Sx;k}9dgkGt+229d@#tnL2z560m z-`(E6*sQbw>NX@N6bp~3GnC#I&>M^^9hVBhHN$U=6Y?11KJ^>s{ElauTZwS;1L9Jl z$DU&j$o{coA&>iT6W_cCfN{)V&Q7LhL&Q})|MAt-Q$N`;R6)g`+^J=7QdqO%AEiE9 z_5Hoj>$=K80|Nu3v)oQtZ7_6vV4$AioWWaD<6^7vF^KCdbKc?%FtzB-*Bd{`OFR$P z6?Y7PZS+5>w7i^RyHp1&Js^acc(}+3S*<7VzOXmrFgoA6*jI03-@Kl@Fb=&LI)f{2 zR34c@vT4~30UKGZi+FgR#}3;xGem6cIw8Yykx#e!bu&z-;g~g!^}c+T26)Iuun6Ap z_+Wy;52iLCj@E;rWsXBl#_=wUIqK)}yv<+XEQ!z*+}ONe!abWC(>qg5A(gX0UUhn1 z()xf)TNN3#+m50-;suAfx!|`PiQ&q^H1j{Zoi5<80RH@9=Z!AOB^;>(X&1<~8qm|X z9RLAp>5s2M_&>?4u2TkunQqo5@S9;cLBPPUHPYcF5k5GRBBD4`Q6#v#(C`tfV)APX zKmxE>qYUzYFz+p1Mh7yQ@r!nnw?2PI0V5TX4hLGlV}d!3JikT;=pteF{QNt^!@L>jp?|z&5u+R;mXm02eh}!H_R9@!6;Bh z>ax}IEy2gO3u%BFF--%v%kj@8RfYlmkHTIx)jN{`TZeng!-14sxnLsp!$h*%)}V17 z;O?yWsCQP#|Cv5r$#~tLn$NZY|M6u)%dKR_+ccYz$&17QR;@3?@U zZ#KCrY&Did^Q$#Ve%f;79;;ZD(r}TCfR6x+|H_pBKAJph5CO*`Rs?%kZUv5 zh_z~ebRq}>Zv&v?T6CvMeNY+@ z`bl&RFteHqX$;F9C>a(oTnqRFwBW4RC{7O2=DF^)037yN`?WW2L|&| z(qRU43U@LI#g_r_xLUneKK(dC2X=sJ$qe})}W!H=E*+KLCQn_Q=uGg zV*mt}aj<3-TBlY;4Dmgc7=)|hhuL9t{)nNvX zEkfW1BO~JjI3f>^?8ab(7s|&QDRLn$GVzG@C73rNkXA)JYb#J)oGa}CAKK?xkOgX3Gog4Nlt+d}Vv^1gA;cKR*r{;fZ~ zg~4*c_UK@HnA&M%V!@OY^nem3S12JmJrra#eOqekg(fCp;R8^(b&CFwMq77|DHw;h z8x3Fhs#$XLGMYrtX7Y8;sic`}%hlWQm~Sb-SFk4!pp=x3$PVYg=yfUhhEY22@2!iH zjyQuXPC`^U6KiG;;S9?m_@(2z&J*|mfkq^>?T#0?`;|5Y`Rl|&JBhf?aBxKIwet$2 zrb6*+VK4>CoEjW6qn^1AU~UWOz#tBnLk<>48n?^0hRl{|k9H*A2?jIFIMip0NHhPF z^ReRF<4&0XXyZ%xIJM;P8=P2x^`RtSPE#vqDVX5oIsW|SJ9R|(Y`uGL3QvY#zl5B5 z?Q_*N^L#z%7z=&}5c0uk`ECI2N8H1cLdmnquKycdOs4=DSo8kwT*?;itO}%_@X@{< zD>xFdvx;DTZs#T^9)H3#`8+n(0f0{_KpET){CbA-YZv}LShX|hw0xXP9^()H!7sN_ z0@Y8}W%6KA4eGki-(=M)%_TH=;grgcnMXlI`*~HaZnu zY|`^#NsS!$5#FDeN9zJ}Q-?19JJ&>uhR^>+K{4z4_&oC49mmBd>aAjw*Zm329hb*O zaYD&|V46tvNPx|#+wTIELVwllVeK6FRX9`yt5O+vk}Ney_Tbv;D3e+JVeX+?;<;x1 zI9mepE|xfK3R2Y@_n_DacUVJ6-r&G9XaDIgBOS$MWdq^JfgT|CKGedV?mlQ*D9F%! zNegQl{%*yHo(F$8rf3Z0S*+JD_K`kpmnYp{c`?{sVP}kv%N~I?jJ^JSSHa>v?u?#C=|R@mO*G@Wi@^g8S)eW*MoW*V~i)uCJA#2A-}9bi-CO;Tzu_heSbz zMdpzcVEawKZUEydwerU+!`25^o_D0$nps1$7-?=*Kjvl;?L&$5ucC}DpdHK{yA4Jn zb9M3YD2of1f0>KnH8&=!6Sps@;)OoIP^DEDT@coJ^Dx)QFIFRyQe39j9Cs?rd(GR& zZ{BPOKlq;4p?kJ21sss!dj9w_;5B#agTu&e4k?xMuBW7Br#50)RI|lR3y%MYF3SH2 z2Tr8gg3xK@Wcr5?`>U4-+{^Nc7Kel{+TE7UYei3wzK`_%Ty$ÙZ^mN1!4t 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