From c32fd836b5ff10d8f6b0be1bfee3574c23bd8392 Mon Sep 17 00:00:00 2001 From: konnovaea Date: Sun, 26 Apr 2026 21:17:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=B4=D0=B2=D0=BE=D0=B8=D1=87=D0=BD=D0=BE?= =?UTF-8?q?=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