diff --git a/ProninVV/aufgabe-1-data-structures/aufg1.py b/ProninVV/aufgabe-1-data-structures/aufg1.py index 90d121b..b77d1ae 100644 --- a/ProninVV/aufgabe-1-data-structures/aufg1.py +++ b/ProninVV/aufgabe-1-data-structures/aufg1.py @@ -106,16 +106,6 @@ def sorten(arr): arr[j], arr[j + 1] = arr[j + 1], arr[j] # ----------------------------------------------------------- -# linklist = None -# linklist = ll_insert(linklist, 'Sjora', '123') -# linklist = ll_insert(linklist, 'Vlad', '0000') -# linklist = ll_insert(linklist, 'Dima', '228') - -# print(linklist) -# print(ll_find(linklist, 'Vlad')) -# print(ll_delete(linklist, 'Dima')) -# print(ll_list_all(linklist)) - # HashTable (Хранится как список buckets фиксированной длины, каждый элемент — голова связного списка (или None)) def hash_table(size): @@ -172,12 +162,6 @@ def ht_list_all(buckets): sorten(full_data) return full_data -# Hash_table1 = hash_table(3) -# ht_insert(Hash_table1, 'Vlad', '000') -# ht_insert(Hash_table1, 'Dima', '111') -# ht_insert(Hash_table1, 'Sjora', '222') - -# print(ht_list_all(Hash_table1)) # Двоичное дерево поиска : Узел — словарь: {'name': 'Имя', 'phone': '123', 'left': None, 'right': None} @@ -233,23 +217,26 @@ def bst_delete(root, name): # стоим в нужном узле else: - # если у узла нет наследников - if root['left'] is None and root['right'] is None: - # обрываем связь - return None - # если только один наследник - elif root['left'] is None != root['right'] is None: - return root['left'] or root['right'] + # узла слева нет (вернет правого ребенка или None) + if root['left'] is None: + return root['right'] + + # узла справа нет (вернет левого ребенка) + if root['right'] is None: + return root['left'] + # два наследника (поиск минимального поддерева в правой ветке) successor = root['right'] while successor['left'] is not None: - successor = root['left'] + successor = successor['left'] root['name'] = successor['name'] root['phone'] = successor['phone'] # Удаляем дубликат преемника в правом поддереве root['right'] = bst_delete(root['right'], successor['name']) + + return root @@ -263,13 +250,3 @@ def bst_list_all(root, result=None): result.append((root['name'], root['phone'])) bst_list_all(root['right'], result) return result - -# derevo = None -# derevo = bst_insert(derevo, 'Vlad', '000') -# derevo = bst_insert(derevo, 'Dima', '111') -# derevo = bst_insert(derevo, 'Sjora', '222') -# derevo = bst_insert(derevo, 'weid', '0') - -# # print(derevo) -# # derevo = bst_delete(derevo, 'Vlad') -# print(bst_list_all(derevo)) diff --git a/ProninVV/aufgabe-1-data-structures/test.py b/ProninVV/aufgabe-1-data-structures/test.py index c12d590..7b8a541 100644 --- a/ProninVV/aufgabe-1-data-structures/test.py +++ b/ProninVV/aufgabe-1-data-structures/test.py @@ -24,19 +24,19 @@ def create_data(n=100): phone = phone_number_generate() records_sorted.append((name, phone)) - records_shuffled = records_sorted + records_shuffled = records_sorted[:] random.shuffle(records_shuffled) return records_sorted, records_shuffled -def run_expirement(epoch=1, elements=100): +def run_expirement(epoch=1, elements=1000): """ распределяем данные по трем структурам данных тестируем время операций (вставки, удаления, перебора) и записываем полученные результаты в файл """ # создаем данные - records_sorted, records_shuffled = create_data(100) + records_sorted, records_shuffled = create_data(elements) datasets = [ ("shuffled", records_shuffled), @@ -47,13 +47,14 @@ def run_expirement(epoch=1, elements=100): header = ["Структура", "Режим", "Операция", "Время (сек)"] results = [header] - linklist = None - hashtab = hash_table(elements) - bintree = None + # сразу будем обрабатывать и случайны и отсортированный данные for label, arr in datasets: + linklist = None + hashtab = hash_table(elements) + bintree = None # заполнение связного списка start = time.perf_counter() for p in arr: @@ -75,15 +76,15 @@ def run_expirement(epoch=1, elements=100): # удаление 50 имен в св писке deldata = random.sample(arr, 50) start = time.perf_counter() - for p in arr: + for p in deldata: ll_delete(linklist, p[0]) end = time.perf_counter() results.append(["linklist", label, "delete", end-start]) # заполнение хэш-тфблицы start = time.perf_counter() - for p in records_shuffled: - hashtab = ht_insert(hashtab, p[0], p[1]) + for p in arr: + ht_insert(hashtab, p[0], p[1]) end = time.perf_counter() results.append(["hashtable", label, "insert", end-start]) @@ -101,14 +102,14 @@ def run_expirement(epoch=1, elements=100): # удаление 50 имен в хэш таблице deldata = random.sample(arr, 50) start = time.perf_counter() - for p in arr: + for p in deldata: ht_delete(hashtab, p[0]) end = time.perf_counter() results.append(["hashtable", label, "delete", end-start]) # заполнение дерева start = time.perf_counter() - for p in records_shuffled: + for p in arr: bintree = bst_insert(bintree, p[0], p[1]) end = time.perf_counter() results.append(["bintree", label, "insert", end-start]) @@ -127,16 +128,16 @@ def run_expirement(epoch=1, elements=100): # удаление 50 имен в дереве deldata = random.sample(arr, 50) start = time.perf_counter() - for p in arr: + for p in deldata: bst_delete(bintree, p[0]) end = time.perf_counter() results.append(["bintree", label, "delete", end-start]) - with open('timedata.csv', mode='w', encoding='utf-8', newline='') as file: + with open(f"timedata_{elements}.csv", mode='w', encoding='utf-8', newline='') as file: writer = csv.writer(file) writer.writerows(results) -run_expirement(1) \ No newline at end of file +run_expirement(epoch=1, elements=10000) \ No newline at end of file diff --git a/ProninVV/aufgabe-1-data-structures/timedata_1000.csv b/ProninVV/aufgabe-1-data-structures/timedata_1000.csv new file mode 100644 index 0000000..95a6572 --- /dev/null +++ b/ProninVV/aufgabe-1-data-structures/timedata_1000.csv @@ -0,0 +1,19 @@ +Структура,Режим,Операция,Время (сек) +linklist,shuffled,insert,0.028301300000748597 +linklist,shuffled,find,0.002832099999068305 +linklist,shuffled,delete,0.0018718999999691732 +hashtable,shuffled,insert,0.0022233999989111908 +hashtable,shuffled,find,0.00019609999799286015 +hashtable,shuffled,delete,9.929999941959977e-05 +bintree,shuffled,insert,0.002081000002362998 +bintree,shuffled,find,0.00014569999984814785 +bintree,shuffled,delete,7.760000153211877e-05 +linklist,sorted,insert,0.02792069999850355 +linklist,sorted,find,0.0024707999982638285 +linklist,sorted,delete,0.001741200001561083 +hashtable,sorted,insert,0.002176499998313375 +hashtable,sorted,find,0.00019439999960013665 +hashtable,sorted,delete,0.00011420000009820797 +bintree,sorted,insert,0.12917839999863645 +bintree,sorted,find,0.007965299999341369 +bintree,sorted,delete,0.00476150000031339 diff --git a/ProninVV/aufgabe-1-data-structures/timedata_10000.csv b/ProninVV/aufgabe-1-data-structures/timedata_10000.csv new file mode 100644 index 0000000..eedb144 --- /dev/null +++ b/ProninVV/aufgabe-1-data-structures/timedata_10000.csv @@ -0,0 +1,19 @@ +Структура,Режим,Операция,Время (сек) +linklist,shuffled,insert,2.8069403000008606 +linklist,shuffled,find,0.028815499998017913 +linklist,shuffled,delete,0.015906399999948917 +hashtable,shuffled,insert,0.17993940000087605 +hashtable,shuffled,find,0.0018954999977722764 +hashtable,shuffled,delete,0.0012972000004083384 +bintree,shuffled,insert,0.03314669999963371 +bintree,shuffled,find,0.00022189999799593352 +bintree,shuffled,delete,0.00011869999798364006 +linklist,sorted,insert,2.925224900001922 +linklist,sorted,find,0.026056099999550497 +linklist,sorted,delete,0.015979499999957625 +hashtable,sorted,insert,0.15593369999987772 +hashtable,sorted,find,0.0014122000029601622 +hashtable,sorted,delete,0.0008025000024645124 +bintree,sorted,insert,13.357120900000155 +bintree,sorted,find,0.0936219000031997 +bintree,sorted,delete,0.040907499998866115 diff --git a/ProninVV/aufgabe-1-data-structures/timedata_2000.csv b/ProninVV/aufgabe-1-data-structures/timedata_2000.csv new file mode 100644 index 0000000..f41cbff --- /dev/null +++ b/ProninVV/aufgabe-1-data-structures/timedata_2000.csv @@ -0,0 +1,19 @@ +Структура,Режим,Операция,Время (сек) +linklist,shuffled,insert,0.1222989999987476 +linklist,shuffled,find,0.005472099997859914 +linklist,shuffled,delete,0.0038157999988470692 +hashtable,shuffled,insert,0.008049899999605259 +hashtable,shuffled,find,0.0003437999985180795 +hashtable,shuffled,delete,0.00024619999749120325 +bintree,shuffled,insert,0.004746700000396231 +bintree,shuffled,find,0.00016089999917312525 +bintree,shuffled,delete,8.469999738736078e-05 +linklist,sorted,insert,0.12316460000147345 +linklist,sorted,find,0.005846299998665927 +linklist,sorted,delete,7.130000085453503e-05 +hashtable,sorted,insert,0.008595399998739595 +hashtable,sorted,find,0.0003437999985180795 +hashtable,sorted,delete,0.0002158999996026978 +bintree,sorted,insert,0.5351322999995318 +bintree,sorted,find,0.01742980000199168 +bintree,sorted,delete,0.007677599998714868 diff --git a/ProninVV/aufgabe-1-data-structures/timedata_500.csv b/ProninVV/aufgabe-1-data-structures/timedata_500.csv new file mode 100644 index 0000000..c8dcdf8 --- /dev/null +++ b/ProninVV/aufgabe-1-data-structures/timedata_500.csv @@ -0,0 +1,19 @@ +Структура,Режим,Операция,Время (сек) +linklist,shuffled,insert,0.007393100000626873 +linklist,shuffled,find,0.001468800001021009 +linklist,shuffled,delete,0.0008425000014540274 +hashtable,shuffled,insert,0.000751199997466756 +hashtable,shuffled,find,0.00013349999790079892 +hashtable,shuffled,delete,7.670000195503235e-05 +bintree,shuffled,insert,0.0008823000025586225 +bintree,shuffled,find,0.00012040000001434237 +bintree,shuffled,delete,6.539999958476983e-05 +linklist,sorted,insert,0.00702620000083698 +linklist,sorted,find,0.0012153999996371567 +linklist,sorted,delete,0.0007512000011047348 +hashtable,sorted,insert,0.0007286000000021886 +hashtable,sorted,find,0.00012399999832268804 +hashtable,sorted,delete,8.069999967119657e-05 +bintree,sorted,insert,0.03012010000020382 +bintree,sorted,find,0.003360800001246389 +bintree,sorted,delete,0.0017866999987745658