From 45edc73aa27a0cf0dc83f052a5b3be018cb53100 Mon Sep 17 00:00:00 2001 From: soldatkinao Date: Mon, 18 May 2026 22:11:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=BA=D0=BE=D0=BD=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- soldatkinao/lab1/results.csv | 121 +++++++++++++++++++++++++++++++++++ soldatkinao/lab1/task-1.py | 110 +++++++++++++++++++++++++++++-- 2 files changed, 224 insertions(+), 7 deletions(-) create mode 100644 soldatkinao/lab1/results.csv diff --git a/soldatkinao/lab1/results.csv b/soldatkinao/lab1/results.csv new file mode 100644 index 0000000..805a4ed --- /dev/null +++ b/soldatkinao/lab1/results.csv @@ -0,0 +1,121 @@ +Структура,Порядок,Повторение,Операция,Время (с) +LinkedList,shuffled,1,insert,3.1302744999993593 +LinkedList,shuffled,1,find,0.005220100050792098 +LinkedList,shuffled,1,delete,0.014845799887552857 +LinkedList,shuffled,1,list_all,0.0055240001529455185 +LinkedList,shuffled,2,insert,3.9573061999399215 +LinkedList,shuffled,2,find,0.005903499899432063 +LinkedList,shuffled,2,delete,0.012860000133514404 +LinkedList,shuffled,2,list_all,0.005526799941435456 +LinkedList,shuffled,3,insert,3.934717500116676 +LinkedList,shuffled,3,find,0.005851200083270669 +LinkedList,shuffled,3,delete,0.015433399938046932 +LinkedList,shuffled,3,list_all,0.005478800041601062 +LinkedList,shuffled,4,insert,3.927386400057003 +LinkedList,shuffled,4,find,0.005423200083896518 +LinkedList,shuffled,4,delete,0.013300799997523427 +LinkedList,shuffled,4,list_all,0.005344899836927652 +LinkedList,shuffled,5,insert,4.010202700039372 +LinkedList,shuffled,5,find,0.006096000084653497 +LinkedList,shuffled,5,delete,0.013918899931013584 +LinkedList,shuffled,5,list_all,0.006746200146153569 +LinkedList,sorted,1,insert,4.09783950005658 +LinkedList,sorted,1,find,0.0430095000192523 +LinkedList,sorted,1,delete,0.01721159997396171 +LinkedList,sorted,1,list_all,0.005465000169351697 +LinkedList,sorted,2,insert,4.133864999981597 +LinkedList,sorted,2,find,0.0456748001743108 +LinkedList,sorted,2,delete,0.016983899986371398 +LinkedList,sorted,2,list_all,0.002011100063100457 +LinkedList,sorted,3,insert,4.122705399990082 +LinkedList,sorted,3,find,0.045870000030845404 +LinkedList,sorted,3,delete,0.016401699976995587 +LinkedList,sorted,3,list_all,0.005049800034612417 +LinkedList,sorted,4,insert,3.772368999896571 +LinkedList,sorted,4,find,0.02993709989823401 +LinkedList,sorted,4,delete,0.011476899962872267 +LinkedList,sorted,4,list_all,0.003602599957957864 +LinkedList,sorted,5,insert,3.264690199866891 +LinkedList,sorted,5,find,0.02624980011023581 +LinkedList,sorted,5,delete,0.01183390012010932 +LinkedList,sorted,5,list_all,0.0017556999810039997 +HashTable,shuffled,1,insert,0.005876099923625588 +HashTable,shuffled,1,find,3.350013867020607e-05 +HashTable,shuffled,1,delete,3.0100112780928612e-05 +HashTable,shuffled,1,list_all,0.004497800022363663 +HashTable,shuffled,2,insert,0.007247900124639273 +HashTable,shuffled,2,find,2.9999995604157448e-05 +HashTable,shuffled,2,delete,2.95999925583601e-05 +HashTable,shuffled,2,list_all,0.00580970011651516 +HashTable,shuffled,3,insert,0.004507799865677953 +HashTable,shuffled,3,find,2.2900057956576347e-05 +HashTable,shuffled,3,delete,1.8700025975704193e-05 +HashTable,shuffled,3,list_all,0.003462200053036213 +HashTable,shuffled,4,insert,0.005082499934360385 +HashTable,shuffled,4,find,3.1800009310245514e-05 +HashTable,shuffled,4,delete,2.8799986466765404e-05 +HashTable,shuffled,4,list_all,0.007747200084850192 +HashTable,shuffled,5,insert,0.004538299981504679 +HashTable,shuffled,5,find,2.2900057956576347e-05 +HashTable,shuffled,5,delete,1.9300030544400215e-05 +HashTable,shuffled,5,list_all,0.003729799995198846 +HashTable,sorted,1,insert,0.005079899914562702 +HashTable,sorted,1,find,5.079992115497589e-05 +HashTable,sorted,1,delete,2.550007775425911e-05 +HashTable,sorted,1,list_all,0.005039500072598457 +HashTable,sorted,2,insert,0.004276499850675464 +HashTable,sorted,2,find,4.079984501004219e-05 +HashTable,sorted,2,delete,2.110004425048828e-05 +HashTable,sorted,2,list_all,0.004337100079283118 +HashTable,sorted,3,insert,0.006273699924349785 +HashTable,sorted,3,find,3.9400067180395126e-05 +HashTable,sorted,3,delete,1.919991336762905e-05 +HashTable,sorted,3,list_all,0.0032929000444710255 +HashTable,sorted,4,insert,0.004404899897053838 +HashTable,sorted,4,find,4.0499959141016006e-05 +HashTable,sorted,4,delete,2.0800158381462097e-05 +HashTable,sorted,4,list_all,0.006671200040727854 +HashTable,sorted,5,insert,0.00421059993095696 +HashTable,sorted,5,find,4.0999846532940865e-05 +HashTable,sorted,5,delete,2.140016295015812e-05 +HashTable,sorted,5,list_all,0.0034396001137793064 +BST,shuffled,1,insert,0.015235899947583675 +BST,shuffled,1,find,6.360001862049103e-05 +BST,shuffled,1,delete,9.159999899566174e-05 +BST,shuffled,1,list_all,0.0042282999493181705 +BST,shuffled,2,insert,0.016312200110405684 +BST,shuffled,2,find,5.859998054802418e-05 +BST,shuffled,2,delete,9.659980423748493e-05 +BST,shuffled,2,list_all,0.004191800020635128 +BST,shuffled,3,insert,0.015240099979564548 +BST,shuffled,3,find,5.859998054802418e-05 +BST,shuffled,3,delete,8.849985897541046e-05 +BST,shuffled,3,list_all,0.0036266997922211885 +BST,shuffled,4,insert,0.014052000129595399 +BST,shuffled,4,find,5.9300102293491364e-05 +BST,shuffled,4,delete,8.119991980493069e-05 +BST,shuffled,4,list_all,0.0027294999454170465 +BST,shuffled,5,insert,0.013222299981862307 +BST,shuffled,5,find,6.059999577701092e-05 +BST,shuffled,5,delete,7.970002479851246e-05 +BST,shuffled,5,list_all,0.0028162000235170126 +BST,sorted,1,insert,5.109697200125083 +BST,sorted,1,find,0.05814290000125766 +BST,sorted,1,delete,0.027696199947968125 +BST,sorted,1,list_all,0.004435899900272489 +BST,sorted,2,insert,6.02595020015724 +BST,sorted,2,find,0.05516729992814362 +BST,sorted,2,delete,0.028573499992489815 +BST,sorted,2,list_all,0.003455700119957328 +BST,sorted,3,insert,5.749598399968818 +BST,sorted,3,find,0.04719489999115467 +BST,sorted,3,delete,0.03186570014804602 +BST,sorted,3,list_all,0.002738000126555562 +BST,sorted,4,insert,5.19493699981831 +BST,sorted,4,find,0.052105900133028626 +BST,sorted,4,delete,0.028118600137531757 +BST,sorted,4,list_all,0.005104599986225367 +BST,sorted,5,insert,5.953492499887943 +BST,sorted,5,find,0.060425500152632594 +BST,sorted,5,delete,0.024722500005736947 +BST,sorted,5,list_all,0.004347699927166104 diff --git a/soldatkinao/lab1/task-1.py b/soldatkinao/lab1/task-1.py index 006070b..16c8eba 100644 --- a/soldatkinao/lab1/task-1.py +++ b/soldatkinao/lab1/task-1.py @@ -76,6 +76,99 @@ def ht_list_all(buckets): rec.sort(key=lambda x: x[0]) return rec +def bst_insert(root, name, phone): + new = {'name': name, 'phone': phone, 'left': None, 'right': None} + if root is None: + return new + cur = root + while True: + if name < cur['name']: + if cur['left'] is None: + cur['left'] = new + break + cur = cur['left'] + elif name > cur['name']: + if cur['right'] is None: + cur['right'] = new + break + cur = cur['right'] + else: + cur['phone'] = phone + break + return root + +def bst_find(root, name): + cur = root + while cur: + if name == cur['name']: + return cur['phone'] + elif name < cur['name']: + cur = cur['left'] + else: + cur = cur['right'] + return None + +def bst_delete(root, name): + if root is None: + return None + parent = None + cur = root + while cur and cur['name'] != name: + parent = cur + if name < cur['name']: + cur = cur['left'] + else: + cur = cur['right'] + if cur is None: + return root + # нет детей + if cur['left'] is None and cur['right'] is None: + if parent is None: + return None + if parent['left'] is cur: + parent['left'] = None + else: + parent['right'] = None + return root + # один ребёнок + if cur['left'] is None: + child = cur['right'] + elif cur['right'] is None: + child = cur['left'] + else: + # два ребёнка ищем минимальный в правом поддереве + succ_parent = cur + succ = cur['right'] + while succ['left']: + succ_parent = succ + succ = succ['left'] + cur['name'], cur['phone'] = succ['name'], succ['phone'] + if succ_parent['left'] is succ: + succ_parent['left'] = succ['right'] + else: + succ_parent['right'] = succ['right'] + return root + if parent is None: + return child + if parent['left'] is cur: + parent['left'] = child + else: + parent['right'] = child + return root + +def bst_list_all(root): + res = [] + stack = [] + cur = root + while stack or cur: + while cur: + stack.append(cur) + cur = cur['left'] + cur = stack.pop() + res.append((cur['name'], cur['phone'])) + cur = cur['right'] + return res + def gen_data(N=10000): data = [] for i in range(N): @@ -90,10 +183,6 @@ def gen_data(N=10000): # 5 повторений сохраняем все замеры def run_test(init_func, ins_func, find_func, del_func, list_func, shuffled, sorted_data, exist_names, missing_names, del_names): - """ - Возвращает список строк для CSV: - [порядок, повторение, операция, время] - """ rows = [] for order, dataset in [('shuffled', shuffled), ('sorted', sorted_data)]: for rep in range(5): @@ -149,7 +238,14 @@ if __name__ == '__main__': for r in rows: all_rows.append(['HashTable'] + r) - # Запись в CSV + # бинарное дерево + print("Бинарное дерево...") + rows = run_test(lambda: None, bst_insert, bst_find, bst_delete, bst_list_all, + shuffled, sorted_data, exist_names, missing_names, del_names) + for r in rows: + all_rows.append(['BST'] + r) + + # запись в CSV with open('results.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['Структура', 'Порядок', 'Повторение', 'Операция', 'Время (с)']) @@ -164,7 +260,7 @@ if __name__ == '__main__': avg[(struct, order, op)].append(t) print("\nСредние значения (5 запусков):") print(f"{'Структура':<12} {'Порядок':<10} {'Вставка':>10} {'Поиск':>10} {'Удаление':>10} {'ListAll':>10}") - for struct in ['LinkedList', 'HashTable']: + for struct in ['LinkedList', 'HashTable', 'BST']: for order in ['shuffled', 'sorted']: row = [struct, order] for op in ['insert', 'find', 'delete', 'list_all']: @@ -172,4 +268,4 @@ if __name__ == '__main__': avg_val = sum(vals)/len(vals) row.append(f"{avg_val:.5f}") print(f"{row[0]:<12} {row[1]:<10} {row[2]:>10} {row[3]:>10} {row[4]:>10} {row[5]:>10}") - print("\nГотово (ну почти))).") \ No newline at end of file + print("\nГотово!!!!!.") \ No newline at end of file