From 06ef89076a01c97e1765e0eba9774fefc85062b0 Mon Sep 17 00:00:00 2001 From: Florian Burgener <florian.brgnr@gmail.com> Date: Tue, 17 May 2022 21:50:13 +0200 Subject: [PATCH] Duplicate key can no longer be inserted --- __main__.py | 103 +++++++++++++++++++++++++++------------------------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/__main__.py b/__main__.py index ab4fb51..9cbaa69 100644 --- a/__main__.py +++ b/__main__.py @@ -194,6 +194,9 @@ def insertion_find_leaf(root, key): def bptree_insert(root, key): parents, leaf = insertion_find_leaf(root, key) + if is_value_in_array(leaf.keys, key): + return + if node_is_full(leaf): insert_full(root, parents, leaf, key, None) else: @@ -205,22 +208,6 @@ def bptree_insert(root, key): # DELETION : START -def deletion_find_leaf(root, key): - parents = [] - current = root - - while not current.is_leaf: - parents.append(current) - children_index = lower_bound(current.keys, key) - - if children_index < len(current.keys) and current.keys[children_index] == key: - children_index += 1 - - current = current.children[children_index] - - return parents, current - - def bptree_find_smallest_key(root): if root.is_leaf: return root.keys[0] @@ -275,7 +262,7 @@ def bptree_delete_internal(root, parents, node, key): def bptree_delete_leaf(root, parents, leaf, key): - if len(leaf.keys) > leaf.order: + if len(leaf.keys) > leaf.order or leaf == root: deletion_index = find_value_index_in_array(leaf.keys, key) leaf.keys.pop(deletion_index) bptree_delete_internal(root, parents, parents.pop(), key) @@ -343,6 +330,22 @@ def bptree_delete_leaf(root, parents, leaf, key): bptree_delete_internal(root, parents, parent, key) +def deletion_find_leaf(root, key): + parents = [] + current = root + + while not current.is_leaf: + parents.append(current) + children_index = lower_bound(current.keys, key) + + if children_index < len(current.keys) and current.keys[children_index] == key: + children_index += 1 + + current = current.children[children_index] + + return parents, current + + def bptree_delete(root, key): parents, leaf = deletion_find_leaf(root, key) @@ -417,48 +420,48 @@ def main(): random.seed(a) order = 2 - # root = Node(order) - # keys = generate_random_keys(40, 1, 99) - # print(keys) + root = Node(order) + keys = generate_random_keys(40, 1, 99) + print(keys) - # for key in keys: - # bptree_insert(root, key) + for key in keys: + bptree_insert(root, key) - # bptree_print(root) - # extracted_keys = bptree_extract_all_keys(root) - # assert extracted_keys == sorted(keys) + bptree_print(root) + extracted_keys = bptree_extract_all_keys(root) + assert extracted_keys == sorted(keys) - # for key in keys: - # assert bptree_search(root, key) + for key in keys: + assert bptree_search(root, key) - # for _ in range(5): - # while True: - # random_key = random.randint(1, 99) + for _ in range(5): + while True: + random_key = random.randint(1, 99) - # if random_key not in keys: - # break + if random_key not in keys: + break - # assert not bptree_search(root, random_key) + assert not bptree_search(root, random_key) - root = Node(order) - keys = generate_random_keys(18, 1, 99) - print(keys) - print("=====") + # root = Node(order) + # keys = generate_random_keys(18, 1, 99) + # print(keys) + # print("=====") - for key in keys: - bptree_insert(root, key) + # for key in keys: + # bptree_insert(root, key) - bptree_delete(root, 56) - bptree_delete(root, 82) - bptree_delete(root, 75) - bptree_insert(root, 80) - bptree_delete(root, 47) - # bptree_delete(root, 80) - bptree_delete(root, 21) - bptree_delete(root, 22) - bptree_delete(root, 12) - bptree_delete(root, 8) - bptree_print(root) + # bptree_delete(root, 56) + # bptree_delete(root, 82) + # bptree_delete(root, 75) + # bptree_insert(root, 80) + # bptree_delete(root, 47) + # # bptree_delete(root, 80) + # bptree_delete(root, 21) + # bptree_delete(root, 22) + # bptree_delete(root, 12) + # bptree_delete(root, 8) + # bptree_print(root) if __name__ == "__main__": -- GitLab