From b83848116b187d70bcf6c9668150dabd1c36524a Mon Sep 17 00:00:00 2001 From: mddcorporation Date: Sat, 28 Feb 2026 11:40:24 +0300 Subject: [PATCH 01/10] new file --- VaravinVV/task1_1.py | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 VaravinVV/task1_1.py diff --git a/VaravinVV/task1_1.py b/VaravinVV/task1_1.py new file mode 100644 index 0000000..397b757 --- /dev/null +++ b/VaravinVV/task1_1.py @@ -0,0 +1,2 @@ +def ll_insert(name, phone, head): + data = {'name' : name, 'phone' : phone, "next" : head} \ No newline at end of file -- 2.43.0 From c61dbc01a3d0089bf6d232e263b5e03f49824959 Mon Sep 17 00:00:00 2001 From: mddcorporation Date: Sat, 28 Feb 2026 18:13:05 +0300 Subject: [PATCH 02/10] almost finished ll sequence, only sort is left --- VaravinVV/task1_1.py | 63 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/VaravinVV/task1_1.py b/VaravinVV/task1_1.py index 397b757..df259ec 100644 --- a/VaravinVV/task1_1.py +++ b/VaravinVV/task1_1.py @@ -1,2 +1,61 @@ -def ll_insert(name, phone, head): - data = {'name' : name, 'phone' : phone, "next" : head} \ No newline at end of file +import random +N = [] + +for n in range(10000): + i = random.randint(1,99999) + p = random.randint(10000000, 99999999) + N.append((f"User_{i:05d}", str(p))) + +def ll_insert(head, name, phone): + data = {'name' : name, 'phone' : phone, "next" : None} + + if head is None: + return data + + current = head + while current: + if current['name'] == name: + current['phone'] = phone + return head + if current['next'] == None: + last = current + current = current['next'] + + last['next'] = data + return head + + +def ll_find(head, name): + current = head + while current: + if current['name'] == name: + return current['phone'] + current = current['next'] + return None + +def ll_delete(head, name): + if head is None: + return None + + prev = head + current = head['next'] + while current: + if current['name'] == name: + prev['next'] = current['next'] + return head + prev = current + current = current['next'] + return head + +def ll_list_all(head): + return None + +test_data = None +for name, phone in N: + test_data = ll_insert(test_data, name, phone) + +test_data = ll_insert(test_data, 'User_02000', '99999999') +test_data = ll_insert(test_data, 'User_01000', '99999998') +print(ll_find(test_data, 'User_02000')) +ll_delete(test_data, 'User_02000') +print(ll_find(test_data, 'User_02000')) \ No newline at end of file -- 2.43.0 From 776ce4eec6eb899f7cc0b6b02d934abbfd842bea Mon Sep 17 00:00:00 2001 From: mddcorporation Date: Sat, 28 Feb 2026 19:01:53 +0300 Subject: [PATCH 03/10] finished functions, making tests --- VaravinVV/task1_1.py | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/VaravinVV/task1_1.py b/VaravinVV/task1_1.py index df259ec..8a5f41d 100644 --- a/VaravinVV/task1_1.py +++ b/VaravinVV/task1_1.py @@ -1,15 +1,15 @@ -import random +import random, time N = [] -for n in range(10000): +for n in range(10000): # вот сначала просят сгенерировать а потом 100 гарантированных имён ну ёмаё💀💀💀 i = random.randint(1,99999) p = random.randint(10000000, 99999999) - N.append((f"User_{i:05d}", str(p))) + N.append((f"User_{i:05d}", str(p))) # как в примере кортежики брбрбр def ll_insert(head, name, phone): data = {'name' : name, 'phone' : phone, "next" : None} - if head is None: + if head is None: # я люблю делать бесполезные проверки return data current = head @@ -19,7 +19,7 @@ def ll_insert(head, name, phone): return head if current['next'] == None: last = current - current = current['next'] + current = current['next'] # везде где такое это изменение текущей строки на следующую через ссылку в нексте last['next'] = data return head @@ -48,14 +48,23 @@ def ll_delete(head, name): return head def ll_list_all(head): - return None + data_list = [] -test_data = None + current = head + while current: + data_list.append({'name' : current['name'], 'phone' : current['phone']}) + current = current['next'] + + data_list.sort(key=lambda x: x['name']) # честно украдено со стака оверфлоу и не понял что такое лямбда я устал читать + return data_list + +#1 - вставка списка +start_time = time.perf_counter() +data_unsorted = None for name, phone in N: - test_data = ll_insert(test_data, name, phone) + data_unsorted = ll_insert(data_unsorted, name, phone) +end_time = time.perf_counter() +elapsed_time = end_time - start_time + +data_sorted = ll_list_all(data_unsorted) -test_data = ll_insert(test_data, 'User_02000', '99999999') -test_data = ll_insert(test_data, 'User_01000', '99999998') -print(ll_find(test_data, 'User_02000')) -ll_delete(test_data, 'User_02000') -print(ll_find(test_data, 'User_02000')) \ No newline at end of file -- 2.43.0 From fae14e7d1f321315b95e1752148dbe4eff47ca1d Mon Sep 17 00:00:00 2001 From: mddcorporation Date: Sat, 28 Feb 2026 19:36:32 +0300 Subject: [PATCH 04/10] problem with sorted list, needs rework in data generation --- VaravinVV/task1_1.py | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/VaravinVV/task1_1.py b/VaravinVV/task1_1.py index 8a5f41d..fcef729 100644 --- a/VaravinVV/task1_1.py +++ b/VaravinVV/task1_1.py @@ -1,4 +1,4 @@ -import random, time +import random, time, csv N = [] for n in range(10000): # вот сначала просят сгенерировать а потом 100 гарантированных имён ну ёмаё💀💀💀 @@ -6,12 +6,16 @@ for n in range(10000): # вот сначала просят сгенериров p = random.randint(10000000, 99999999) N.append((f"User_{i:05d}", str(p))) # как в примере кортежики брбрбр +#короче тупо в лоб, там всё равно вставка списка повторы не допускает (ну телефон обновится) +for i in range(100): + N.append((f"User_{i:05d}", str(f'{i:08d}'))) + def ll_insert(head, name, phone): + data = {'name' : name, 'phone' : phone, "next" : None} - if head is None: # я люблю делать бесполезные проверки + if head is None: return data - current = head while current: if current['name'] == name: @@ -36,7 +40,6 @@ def ll_find(head, name): def ll_delete(head, name): if head is None: return None - prev = head current = head['next'] while current: @@ -64,7 +67,26 @@ data_unsorted = None for name, phone in N: data_unsorted = ll_insert(data_unsorted, name, phone) end_time = time.perf_counter() -elapsed_time = end_time - start_time +elapsed_time_1_1 = end_time - start_time +start_time = time.perf_counter() data_sorted = ll_list_all(data_unsorted) +end_time = time.perf_counter() # правильно ли я сделал? навряд-ли +elapsed_time_1_2 = end_time - start_time +#2 - по поиску +start_time = time.perf_counter() +for i in range(100): + ll_find(data_unsorted, f'User_{i:05d}') +for i in range(10): + ll_find(data_unsorted, f'None_{i:05d}') +end_time = time.perf_counter() +elapsed_time_2_1 = end_time - start_time + +start_time = time.perf_counter() +for i in range(100): + ll_find(data_sorted, f'User_{i:05d}') +for i in range(10): + ll_find(data_sorted, f'None_{i:05d}') +end_time = time.perf_counter() +elapsed_time_2_2 = end_time - start_time -- 2.43.0 From 191fc23b529057339478ff611075266e6262f84b Mon Sep 17 00:00:00 2001 From: mddcorporation Date: Sat, 21 Mar 2026 15:21:43 +0300 Subject: [PATCH 05/10] reworking --- VaravinVV/task1_1.py | 69 ++++++++++++-------------------------------- 1 file changed, 19 insertions(+), 50 deletions(-) diff --git a/VaravinVV/task1_1.py b/VaravinVV/task1_1.py index fcef729..204a936 100644 --- a/VaravinVV/task1_1.py +++ b/VaravinVV/task1_1.py @@ -1,30 +1,25 @@ -import random, time, csv -N = [] +import random +import time +import csv +import sys -for n in range(10000): # вот сначала просят сгенерировать а потом 100 гарантированных имён ну ёмаё💀💀💀 - i = random.randint(1,99999) - p = random.randint(10000000, 99999999) - N.append((f"User_{i:05d}", str(p))) # как в примере кортежики брбрбр - -#короче тупо в лоб, там всё равно вставка списка повторы не допускает (ну телефон обновится) -for i in range(100): - N.append((f"User_{i:05d}", str(f'{i:08d}'))) +sys.setrecursionlimit(20000) def ll_insert(head, name, phone): - - data = {'name' : name, 'phone' : phone, "next" : None} + data = {'name': name, 'phone': phone, "next": None} if head is None: return data + current = head while current: if current['name'] == name: current['phone'] = phone return head - if current['next'] == None: + if current['next'] is None: last = current - current = current['next'] # везде где такое это изменение текущей строки на следующую через ссылку в нексте - + current = current['next'] + last['next'] = data return head @@ -37,9 +32,14 @@ def ll_find(head, name): current = current['next'] return None + def ll_delete(head, name): if head is None: return None + + if head['name'] == name: + return head['next'] + prev = head current = head['next'] while current: @@ -50,43 +50,12 @@ def ll_delete(head, name): current = current['next'] return head + def ll_list_all(head): data_list = [] - current = head while current: - data_list.append({'name' : current['name'], 'phone' : current['phone']}) + data_list.append({'name': current['name'], 'phone': current['phone']}) current = current['next'] - - data_list.sort(key=lambda x: x['name']) # честно украдено со стака оверфлоу и не понял что такое лямбда я устал читать - return data_list - -#1 - вставка списка -start_time = time.perf_counter() -data_unsorted = None -for name, phone in N: - data_unsorted = ll_insert(data_unsorted, name, phone) -end_time = time.perf_counter() -elapsed_time_1_1 = end_time - start_time - -start_time = time.perf_counter() -data_sorted = ll_list_all(data_unsorted) -end_time = time.perf_counter() # правильно ли я сделал? навряд-ли -elapsed_time_1_2 = end_time - start_time - -#2 - по поиску -start_time = time.perf_counter() -for i in range(100): - ll_find(data_unsorted, f'User_{i:05d}') -for i in range(10): - ll_find(data_unsorted, f'None_{i:05d}') -end_time = time.perf_counter() -elapsed_time_2_1 = end_time - start_time - -start_time = time.perf_counter() -for i in range(100): - ll_find(data_sorted, f'User_{i:05d}') -for i in range(10): - ll_find(data_sorted, f'None_{i:05d}') -end_time = time.perf_counter() -elapsed_time_2_2 = end_time - start_time + data_list.sort(key=lambda x: x['name']) + return data_list \ No newline at end of file -- 2.43.0 From d51f3fe51e7ad95a9c8493378ffe600e57fc09e5 Mon Sep 17 00:00:00 2001 From: mddcorporation Date: Sat, 21 Mar 2026 15:23:20 +0300 Subject: [PATCH 06/10] =?UTF-8?q?now=20with=20hash=F0=9F=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VaravinVV/task1_1.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/VaravinVV/task1_1.py b/VaravinVV/task1_1.py index 204a936..06f4567 100644 --- a/VaravinVV/task1_1.py +++ b/VaravinVV/task1_1.py @@ -58,4 +58,42 @@ def ll_list_all(head): data_list.append({'name': current['name'], 'phone': current['phone']}) current = current['next'] data_list.sort(key=lambda x: x['name']) - return data_list \ No newline at end of file + return data_list + + +def hash_function(name, size): + return hash(name) % size + + +def ht_insert(buckets, name, phone): + index = hash_function(name, len(buckets)) + head = buckets[index] + new_head = ll_insert(head, name, phone) + buckets[index] = new_head + return buckets + + +def ht_find(buckets, name): + index = hash_function(name, len(buckets)) + head = buckets[index] + return ll_find(head, name) + + +def ht_delete(buckets, name): + index = hash_function(name, len(buckets)) + head = buckets[index] + new_head = ll_delete(head, name) + buckets[index] = new_head + return buckets + + +def ht_list_all(buckets): + all_records = [] + for head in buckets: + current = head + while current is not None: + all_records.append((current['name'], current['phone'])) + current = current['next'] + all_records.sort(key=lambda x: x[0]) + return all_records + -- 2.43.0 From 3f8ed5a93aabb0d7f7ad96c1aeca65804d76d01f Mon Sep 17 00:00:00 2001 From: mddcorporation Date: Sat, 21 Mar 2026 17:01:40 +0300 Subject: [PATCH 07/10] ig thats it for now --- VaravinVV/task1_1.py | 185 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) diff --git a/VaravinVV/task1_1.py b/VaravinVV/task1_1.py index 06f4567..17dc0b2 100644 --- a/VaravinVV/task1_1.py +++ b/VaravinVV/task1_1.py @@ -97,3 +97,188 @@ def ht_list_all(buckets): all_records.sort(key=lambda x: x[0]) return all_records + +def create_node(name, phone): + return {'name': name, 'phone': phone, 'left': None, 'right': None} + + +def bst_insert(root, name, phone): + if root is None: + return create_node(name, phone) + + if name == root['name']: + root['phone'] = phone + elif name < root['name']: + root['left'] = bst_insert(root['left'], name, phone) + else: + root['right'] = bst_insert(root['right'], name, phone) + return root + + +def bst_find(root, name): + if root is None: + return None + if name == root['name']: + return root['phone'] + elif name < root['name']: + return bst_find(root['left'], name) + else: + return bst_find(root['right'], name) + + +def find_min(node): + while node['left'] is not None: + node = node['left'] + return node + + +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'] + if root['right'] is None: + return root['left'] + + min_node = find_min(root['right']) + root['name'] = min_node['name'] + root['phone'] = min_node['phone'] + root['right'] = bst_delete(root['right'], min_node['name']) + return root + + +def bst_list_all(root): + result = [] + + def inorder(node): + if node is None: + return + inorder(node['left']) + result.append((node['name'], node['phone'])) + inorder(node['right']) + + inorder(root) + return result + +def generate_records(n, seed=50): #почти в точности позаимствовано, просто понял что можно уже существующие в отдельный список заносить + random.seed(seed) + records = [] + for i in range(1, n + 1): + name = f"User_{i:05d}" + phone = "8" + ''.join(str(random.randint(0, 9)) for _ in range(10)) + records.append((name, phone)) + return records + +def prepare_datasets(base_records): + shuffled = base_records.copy() + random.shuffle(shuffled) + sorted_records = sorted(base_records, key=lambda x: x[0]) + return shuffled, sorted_records + +def run_experiment(struct_funcs, records, mode_name, repeats=5): + results = [] + for rep in range(repeats): + struct = struct_funcs['create']() + + start = time.perf_counter() + for name, phone in records: + struct = struct_funcs['insert'](struct, name, phone) + end = time.perf_counter() + insert_time = end - start + + existing_names = [name for name, _ in records] + sample_existing = random.sample(existing_names, 100) + nonexistent = [f"None_{i}" for i in range(10)] + search_names = sample_existing + nonexistent + random.shuffle(search_names) + + start = time.perf_counter() + for name in search_names: + _ = struct_funcs['find'](struct, name) + end = time.perf_counter() + find_time = end - start + + to_delete = random.sample(existing_names, 10) + start = time.perf_counter() + for name in to_delete: + struct = struct_funcs['delete'](struct, name) + end = time.perf_counter() + delete_time = end - start + + results.append({ + 'structure': struct_funcs['name'], + 'mode': mode_name, + 'repetition': rep + 1, + 'insert_time': insert_time, + 'find_time': find_time, + 'delete_time': delete_time + }) + return results + +def main(): + N = 1000 + base_records = generate_records(N) + shuffled, sorted_records = prepare_datasets(base_records) + + structures = { + 'LinkedList': { + 'name': 'LinkedList', + 'create': lambda: None, + 'insert': ll_insert, + 'find': ll_find, + 'delete': ll_delete, + 'list_all': ll_list_all + }, + 'HashTable': { + 'name': 'HashTable', + 'create': lambda: [None] * 10, + 'insert': ht_insert, + 'find': ht_find, + 'delete': ht_delete, + 'list_all': ht_list_all + }, + 'BST': { + 'name': 'BST', + 'create': lambda: None, + 'insert': bst_insert, + 'find': bst_find, + 'delete': bst_delete, + 'list_all': bst_list_all + } + } + + all_results = [] + repeats = 5 + + for struct_name, funcs in structures.items(): + print(f"Тестирование {struct_name} на случайном порядке...") + res = run_experiment(funcs, shuffled, 'random', repeats) + all_results.extend(res) + + print(f"Тестирование {struct_name} на отсортированном порядке...") + res = run_experiment(funcs, sorted_records, 'sorted', repeats) + all_results.extend(res) + + with open('experiment_results.csv', 'w', newline='', encoding='utf-8') as f: + writer = csv.writer(f) + writer.writerow(['Structure', 'Mode', 'Repeat', 'Insert (sec)', 'Search (sec)', 'Delete (sec)']) + for r in all_results: + writer.writerow([ + r['structure'], + r['mode'], + r['repetition'], + f"{r['insert_time']:.6f}", + f"{r['find_time']:.6f}", + f"{r['delete_time']:.6f}" + ]) + + print("Эксперимент завершён. Результаты сохранены в experiment_results.csv.") + +if __name__ == '__main__': + main() \ No newline at end of file -- 2.43.0 From ced958df1ecf48daaa154f26106213077466ea96 Mon Sep 17 00:00:00 2001 From: mddcorporation Date: Sat, 21 Mar 2026 20:50:47 +0300 Subject: [PATCH 08/10] [1] now formatted how it should be --- VaravinVV/task1_1.py | 284 ------------------------------------------- 1 file changed, 284 deletions(-) delete mode 100644 VaravinVV/task1_1.py diff --git a/VaravinVV/task1_1.py b/VaravinVV/task1_1.py deleted file mode 100644 index 17dc0b2..0000000 --- a/VaravinVV/task1_1.py +++ /dev/null @@ -1,284 +0,0 @@ -import random -import time -import csv -import sys - -sys.setrecursionlimit(20000) - -def ll_insert(head, name, phone): - data = {'name': name, 'phone': phone, "next": None} - - if head is None: - return data - - current = head - while current: - if current['name'] == name: - current['phone'] = phone - return head - if current['next'] is None: - last = current - current = current['next'] - - last['next'] = data - return head - - -def ll_find(head, name): - current = head - while current: - 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'] - - prev = head - current = head['next'] - while current: - if current['name'] == name: - prev['next'] = current['next'] - return head - prev = current - current = current['next'] - return head - - -def ll_list_all(head): - data_list = [] - current = head - while current: - data_list.append({'name': current['name'], 'phone': current['phone']}) - current = current['next'] - data_list.sort(key=lambda x: x['name']) - return data_list - - -def hash_function(name, size): - return hash(name) % size - - -def ht_insert(buckets, name, phone): - index = hash_function(name, len(buckets)) - head = buckets[index] - new_head = ll_insert(head, name, phone) - buckets[index] = new_head - return buckets - - -def ht_find(buckets, name): - index = hash_function(name, len(buckets)) - head = buckets[index] - return ll_find(head, name) - - -def ht_delete(buckets, name): - index = hash_function(name, len(buckets)) - head = buckets[index] - new_head = ll_delete(head, name) - buckets[index] = new_head - return buckets - - -def ht_list_all(buckets): - all_records = [] - for head in buckets: - current = head - while current is not None: - all_records.append((current['name'], current['phone'])) - current = current['next'] - all_records.sort(key=lambda x: x[0]) - return all_records - - -def create_node(name, phone): - return {'name': name, 'phone': phone, 'left': None, 'right': None} - - -def bst_insert(root, name, phone): - if root is None: - return create_node(name, phone) - - if name == root['name']: - root['phone'] = phone - elif name < root['name']: - root['left'] = bst_insert(root['left'], name, phone) - else: - root['right'] = bst_insert(root['right'], name, phone) - return root - - -def bst_find(root, name): - if root is None: - return None - if name == root['name']: - return root['phone'] - elif name < root['name']: - return bst_find(root['left'], name) - else: - return bst_find(root['right'], name) - - -def find_min(node): - while node['left'] is not None: - node = node['left'] - return node - - -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'] - if root['right'] is None: - return root['left'] - - min_node = find_min(root['right']) - root['name'] = min_node['name'] - root['phone'] = min_node['phone'] - root['right'] = bst_delete(root['right'], min_node['name']) - return root - - -def bst_list_all(root): - result = [] - - def inorder(node): - if node is None: - return - inorder(node['left']) - result.append((node['name'], node['phone'])) - inorder(node['right']) - - inorder(root) - return result - -def generate_records(n, seed=50): #почти в точности позаимствовано, просто понял что можно уже существующие в отдельный список заносить - random.seed(seed) - records = [] - for i in range(1, n + 1): - name = f"User_{i:05d}" - phone = "8" + ''.join(str(random.randint(0, 9)) for _ in range(10)) - records.append((name, phone)) - return records - -def prepare_datasets(base_records): - shuffled = base_records.copy() - random.shuffle(shuffled) - sorted_records = sorted(base_records, key=lambda x: x[0]) - return shuffled, sorted_records - -def run_experiment(struct_funcs, records, mode_name, repeats=5): - results = [] - for rep in range(repeats): - struct = struct_funcs['create']() - - start = time.perf_counter() - for name, phone in records: - struct = struct_funcs['insert'](struct, name, phone) - end = time.perf_counter() - insert_time = end - start - - existing_names = [name for name, _ in records] - sample_existing = random.sample(existing_names, 100) - nonexistent = [f"None_{i}" for i in range(10)] - search_names = sample_existing + nonexistent - random.shuffle(search_names) - - start = time.perf_counter() - for name in search_names: - _ = struct_funcs['find'](struct, name) - end = time.perf_counter() - find_time = end - start - - to_delete = random.sample(existing_names, 10) - start = time.perf_counter() - for name in to_delete: - struct = struct_funcs['delete'](struct, name) - end = time.perf_counter() - delete_time = end - start - - results.append({ - 'structure': struct_funcs['name'], - 'mode': mode_name, - 'repetition': rep + 1, - 'insert_time': insert_time, - 'find_time': find_time, - 'delete_time': delete_time - }) - return results - -def main(): - N = 1000 - base_records = generate_records(N) - shuffled, sorted_records = prepare_datasets(base_records) - - structures = { - 'LinkedList': { - 'name': 'LinkedList', - 'create': lambda: None, - 'insert': ll_insert, - 'find': ll_find, - 'delete': ll_delete, - 'list_all': ll_list_all - }, - 'HashTable': { - 'name': 'HashTable', - 'create': lambda: [None] * 10, - 'insert': ht_insert, - 'find': ht_find, - 'delete': ht_delete, - 'list_all': ht_list_all - }, - 'BST': { - 'name': 'BST', - 'create': lambda: None, - 'insert': bst_insert, - 'find': bst_find, - 'delete': bst_delete, - 'list_all': bst_list_all - } - } - - all_results = [] - repeats = 5 - - for struct_name, funcs in structures.items(): - print(f"Тестирование {struct_name} на случайном порядке...") - res = run_experiment(funcs, shuffled, 'random', repeats) - all_results.extend(res) - - print(f"Тестирование {struct_name} на отсортированном порядке...") - res = run_experiment(funcs, sorted_records, 'sorted', repeats) - all_results.extend(res) - - with open('experiment_results.csv', 'w', newline='', encoding='utf-8') as f: - writer = csv.writer(f) - writer.writerow(['Structure', 'Mode', 'Repeat', 'Insert (sec)', 'Search (sec)', 'Delete (sec)']) - for r in all_results: - writer.writerow([ - r['structure'], - r['mode'], - r['repetition'], - f"{r['insert_time']:.6f}", - f"{r['find_time']:.6f}", - f"{r['delete_time']:.6f}" - ]) - - print("Эксперимент завершён. Результаты сохранены в experiment_results.csv.") - -if __name__ == '__main__': - main() \ No newline at end of file -- 2.43.0 From 0352511b04d93fa32cd7bb7ab0c5c23a5b811f09 Mon Sep 17 00:00:00 2001 From: mddcorporation Date: Sat, 21 Mar 2026 20:52:48 +0300 Subject: [PATCH 09/10] [2] fixed missing folder --- VaravinVV/docs/data/performance_plots.png | Bin 0 -> 59247 bytes VaravinVV/docs/data/res.csv | 31 +++ VaravinVV/docs/data/tables.py | 51 ++++ VaravinVV/docs/data/task1_1.py | 282 ++++++++++++++++++++++ VaravinVV/docs/task1_report.docx | 0 VaravinVV/docs/~$sk1_report.docx | Bin 0 -> 162 bytes 6 files changed, 364 insertions(+) create mode 100644 VaravinVV/docs/data/performance_plots.png create mode 100644 VaravinVV/docs/data/res.csv create mode 100644 VaravinVV/docs/data/tables.py create mode 100644 VaravinVV/docs/data/task1_1.py create mode 100644 VaravinVV/docs/task1_report.docx create mode 100644 VaravinVV/docs/~$sk1_report.docx diff --git a/VaravinVV/docs/data/performance_plots.png b/VaravinVV/docs/data/performance_plots.png new file mode 100644 index 0000000000000000000000000000000000000000..f113c69413f10079db27340c1ee2842411e5e6bb GIT binary patch literal 59247 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

11G&9&h9q9j&ia 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 m=>L3fSh){7`9GUzNP!f8Nw?Vu root['name']: + root['right'] = bst_delete(root['right'], name) + else: + if root['left'] is None: + return root['right'] + if root['right'] is None: + return root['left'] + + min_node = find_min(root['right']) + root['name'] = min_node['name'] + root['phone'] = min_node['phone'] + root['right'] = bst_delete(root['right'], min_node['name']) + return root + + +def bst_list_all(root): + result = [] + + def inorder(node): + if node is None: + return + inorder(node['left']) + result.append((node['name'], node['phone'])) + inorder(node['right']) + + inorder(root) + return result + +def generate_records(n, seed=50): #почти в точности позаимствовано, просто понял что можно уже существующие в отдельный список заносить + random.seed(seed) + records = [] + for i in range(1, n + 1): + name = f"User_{i:05d}" + phone = "8" + ''.join(str(random.randint(0, 9)) for _ in range(10)) + records.append((name, phone)) + return records + +def prepare_datasets(base_records): + shuffled = base_records.copy() + random.shuffle(shuffled) + sorted_records = sorted(base_records, key=lambda x: x[0]) + return shuffled, sorted_records + +def run_experiment(struct_funcs, records, mode_name, repeats=5): + results = [] + for rep in range(repeats): + struct = struct_funcs['create']() + + start = time.perf_counter() + for name, phone in records: + struct = struct_funcs['insert'](struct, name, phone) + end = time.perf_counter() + insert_time = end - start + + existing_names = [name for name, _ in records] + sample_existing = random.sample(existing_names, 100) + nonexistent = [f"None_{i}" for i in range(10)] + search_names = sample_existing + nonexistent + random.shuffle(search_names) + + start = time.perf_counter() + for name in search_names: + _ = struct_funcs['find'](struct, name) + end = time.perf_counter() + find_time = end - start + + to_delete = random.sample(existing_names, 10) + start = time.perf_counter() + for name in to_delete: + struct = struct_funcs['delete'](struct, name) + end = time.perf_counter() + delete_time = end - start + + results.append({ + 'structure': struct_funcs['name'], + 'mode': mode_name, + 'repetition': rep + 1, + 'insert_time': insert_time, + 'find_time': find_time, + 'delete_time': delete_time + }) + return results + +def main(): + N = 1000 + base_records = generate_records(N) + shuffled, sorted_records = prepare_datasets(base_records) + + structures = { + 'LinkedList': { + 'name': 'LinkedList', + 'create': lambda: None, + 'insert': ll_insert, + 'find': ll_find, + 'delete': ll_delete, + 'list_all': ll_list_all + }, + 'HashTable': { + 'name': 'HashTable', + 'create': lambda: [None] * 10, + 'insert': ht_insert, + 'find': ht_find, + 'delete': ht_delete, + 'list_all': ht_list_all + }, + 'BST': { + 'name': 'BST', + 'create': lambda: None, + 'insert': bst_insert, + 'find': bst_find, + 'delete': bst_delete, + 'list_all': bst_list_all + } + } + + all_results = [] + repeats = 5 + + for struct_name, funcs in structures.items(): + print(f"Тестирование {struct_name} на случайном порядке...") + res = run_experiment(funcs, shuffled, 'random', repeats) + all_results.extend(res) + + print(f"Тестирование {struct_name} на отсортированном порядке...") + res = run_experiment(funcs, sorted_records, 'sorted', repeats) + all_results.extend(res) + + with open('res.csv', 'w', newline='', encoding='utf-8') as f: + writer = csv.writer(f) + writer.writerow(['Structure', 'Mode', 'Repeat', 'Insert (sec)', 'Search (sec)', 'Delete (sec)']) + for r in all_results: + writer.writerow([ + r['structure'], + r['mode'], + r['repetition'], + f"{r['insert_time']:.6f}", + f"{r['find_time']:.6f}", + f"{r['delete_time']:.6f}" + ]) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/VaravinVV/docs/task1_report.docx b/VaravinVV/docs/task1_report.docx new file mode 100644 index 0000000..e69de29 diff --git a/VaravinVV/docs/~$sk1_report.docx b/VaravinVV/docs/~$sk1_report.docx new file mode 100644 index 0000000000000000000000000000000000000000..25ba8358377364bf7600f02d884fbe8e77d8deab GIT binary patch literal 162 zcmZS0ElNqvWgro-GUPH8F{Ci00%;I%@Z7GH$B1bN6Pi$W#K(mZJMS<~F3pf literal 0 HcmV?d00001 -- 2.43.0 From 937738c8eb42fb2d041b7804e50019ff717e022e Mon Sep 17 00:00:00 2001 From: mddcorporation Date: Sat, 21 Mar 2026 21:25:58 +0300 Subject: [PATCH 10/10] [3] finished report and task 1 --- VaravinVV/docs/task1_report.docx | Bin 0 -> 15674 bytes VaravinVV/docs/~$sk1_report.docx | Bin 162 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 VaravinVV/docs/~$sk1_report.docx diff --git a/VaravinVV/docs/task1_report.docx b/VaravinVV/docs/task1_report.docx index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6cce9426c2743c4d848bc7a149ae1b501595f48b 100644 GIT binary patch literal 15674 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 literal 0 HcmV?d00001 diff --git a/VaravinVV/docs/~$sk1_report.docx b/VaravinVV/docs/~$sk1_report.docx deleted file mode 100644 index 25ba8358377364bf7600f02d884fbe8e77d8deab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmZS0ElNqvWgro-GUPH8F{Ci00%;I%@Z7GH$B1bN6Pi$W#K(mZJMS<~F3pf -- 2.43.0