diff --git a/lukovnikovde/docs/data/DataStructure.py b/lukovnikovde/docs/data/DataStructure.py index eb33ffb..f9343b6 100644 --- a/lukovnikovde/docs/data/DataStructure.py +++ b/lukovnikovde/docs/data/DataStructure.py @@ -90,7 +90,8 @@ def LinkedList(head, phone_book): start_find = time.perf_counter() for _ in range(100): name = create_name_phone(rnd.randint(0, 999))[0] - #print(name, ":", ll_find(head, name)) + phone = ll_find(head, name) + #print(name, ":", phone) end_find = time.perf_counter() time_find = end_find - start_find @@ -153,47 +154,43 @@ def ht_delete(buckest, name): #################################################################################################### -def HashTable(buckest): +def HashTable(buckest, phone_book): - print('=========== TESTING HT_INSERT =============') - Name = ['Dima', 'Alex', 'Ivan', 'Maxim', 'Olga', 'Lena'] - for _ in range(10): - name = Name[rnd.randint(0, len(Name) - 1)] - phone = str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + '-' + \ - str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + str(rnd.randint(0,9)) + start_insert = time.perf_counter() + for i in range(len(phone_book)): - print(name, phone) - buckest = ht_insert(buckest, name, phone) - print(buckest) - print('-----------------------------------------------------\n') + buckest = ht_insert(buckest, phone_book[i][0], phone_book[i][1]) + #print(buckest) + end_insert = time.perf_counter() + time_insert = end_insert - start_insert + + + start_find = time.perf_counter() + for _ in range(100): + name = create_name_phone(rnd.randint(0, 999))[0] + phone = ht_find(buckest, name) + #print(name, ":", phone) + end_find = time.perf_counter() + time_find = end_find - start_find - print('============= END TESTING =====================\n\n') - - - print('============== TESTING HT_FIND =====================') - - Name.append('Masha') - for i in range(len(Name)): - name = Name[i] - print(name, ":", ht_find(buckest, name)) - print("======== END TESTING =============\n\n") - - print("================ TESTING TH_LIST_ALL ====================") - - print(*ht_list_all(buckest)) - print("========= END TESTING ==============\n\n") - - - print('========== TESTING HT_DELETE ==========') - for _ in range(2): - name = Name[rnd.randint(0, len(Name) - 1)] + start_delete = time.perf_counter() + for i in range(110): + if i <= 99: name = f"User_{rnd.randint(0,999):03d}" + else: name = f"None_{i:03d}" buckest = ht_delete(buckest, name) - - print(buckest) - print(name, ":", ht_find(buckest, name)) - print("========= END TESTING ==============\n\n") + end_delete = time.perf_counter() + time_delete = end_delete - start_delete + + + start_list = time.perf_counter() + name_list = sort_list(ht_list_all(buckest)) + #print(*name_list) + end_list = time.perf_counter() + time_list = end_list - start_list + + return (time_insert, time_find, time_delete, time_list) ################################################################################################# @@ -248,49 +245,31 @@ def bst_list_all(root, name_list = []): def bst_delete(root, name): - running = root - old_running = running + if root is None: + return None + if hash_key(name) < hash_key(root['name']): + root['left'] = bst_delete(root['left'], name) + elif hash_key(name) > hash_key(root['name']): + root['right'] = bst_delete(root['right'], name) + else: + + if root['left'] is None and root['right'] is None: + return None - while old_running is not None: - node = hash_key(running['name']) - sheet = hash_key(name) - if name == running['name']: + if root['left'] is None: + return root['right'] + if root['right'] is None: + return root['left'] + + min_node = root['right'] + while min_node['left'] is not None: + min_node = min_node['left'] - break - elif node < sheet: - old_running = running - flag = 1 - running = running['right'] - else: - old_running = running - flag = 0 - running = running['left'] - - step = ['left', 'right'] + root['name'] = min_node['name'] + root['phone'] = min_node['phone'] + + root['right'] = bst_delete(root['right'], min_node['name']) - if running['left'] is None and running['right'] is None: - old_running = None - return root - - if running['left'] is None: - old_running[step[flag]] = running['right'] - return root - - if running['right'] is None: - old_running[step[flag]] = running['left'] - return root - - node_delete = running - old_running = running - running = running['right'] - while running['left'] is not None: - old_running = running - running = running['left'] - - node_delete['name'] = running['name'] - node_delete['phone'] = running['phone'] - old_running['left'] = None - return root ################################################################################################# @@ -352,26 +331,59 @@ def main(): phone_book_sorted = phone_book.copy() phone_book_sorted = sort_list(phone_book_sorted) - replay = 10 + replay = 5 - Time_ll_not_sorted = {'insert': 0, 'find': 0, 'delete': 0, 'list': 0} - Time_ll_sorted = {'insert': 0, 'find': 0, 'delete': 0, 'list': 0} + Time_ll_not_sorted = [] + Time_ll_sorted = [] + + Time_average_ll_not_sorted = {'insert': 0, 'find': 0, 'delete': 0, 'list': 0} + Time_average_ll_sorted = {'insert': 0, 'find': 0, 'delete': 0, 'list': 0} for _ in range(replay): time_ll_not_sorted = LinkedList(None, phone_book_not_sorted) - for i, key in enumerate(Time_ll_not_sorted): - Time_ll_not_sorted[key] += time_ll_not_sorted[i]/replay - print(Time_ll_not_sorted) + Time_ll_not_sorted.append({'insert': time_ll_not_sorted[0], 'find': time_ll_not_sorted[1], 'delete': time_ll_not_sorted[2], 'list': time_ll_not_sorted[3]}) + for i, key in enumerate(Time_average_ll_not_sorted): + Time_average_ll_not_sorted[key] += time_ll_not_sorted[i]/replay + for i in range(replay): + print(Time_ll_not_sorted[i]) + print("Average:", Time_average_ll_not_sorted, "\n\n") for _ in range(replay): time_ll_sorted = LinkedList(None, phone_book_sorted) - for i, key in enumerate(Time_ll_sorted): - Time_ll_sorted[key] += time_ll_sorted[i]/replay - print(Time_ll_sorted) + Time_ll_sorted.append({'insert': time_ll_sorted[0], 'find': time_ll_sorted[1], 'delete': time_ll_sorted[2], 'list': time_ll_sorted[3]}) + for i, key in enumerate(Time_average_ll_sorted): + Time_average_ll_sorted[key] += time_ll_sorted[i]/replay + for i in range(replay): + print(Time_ll_not_sorted[i]) + print("Average:", Time_average_ll_sorted, "\n\n") - #HashTable([[] for _ in range(10)]) + + Time_ht_not_sorted = [] + Time_ht_sorted = [] + + Time_average_ht_not_sorted = {'insert': 0, 'find': 0, 'delete': 0, 'list': 0} + Time_average_ht_sorted = {'insert': 0, 'find': 0, 'delete': 0, 'list': 0} + + for _ in range(replay): + time_ht_not_sorted = HashTable([[] for _ in range(100)], phone_book_not_sorted) + Time_ht_not_sorted.append({'insert': time_ht_not_sorted[0], 'find': time_ht_not_sorted[1], 'delete': time_ht_not_sorted[2], 'list': time_ht_not_sorted[3]}) + for i, key in enumerate(Time_average_ht_not_sorted): + Time_average_ht_not_sorted[key] += time_ht_not_sorted[i]/replay + for i in range(replay): + print(Time_ht_not_sorted[i]) + print(f"Average: {Time_average_ht_not_sorted}\n\n") + + for _ in range(replay): + time_ht_sorted = HashTable([[] for _ in range(100)], phone_book_sorted) + Time_ht_sorted.append({'insert': time_ht_sorted[0], 'find': time_ht_sorted[1], 'delete': time_ht_sorted[2], 'list': time_ht_sorted[3]}) + for i, key in enumerate(Time_average_ht_sorted): + Time_average_ht_sorted[key] += time_ht_sorted[i]/replay + for i in range(replay): + print(Time_ht_sorted[i]) + print(f"Average: {Time_average_ht_sorted}\n\n") + #BinarySearchTree(None) if __name__ == "__main__":