diff --git a/src/BTree.py b/src/BTree.py index 6bb1dc813ad5cc274a6d05934432a206c54219ef..d10d42e18f1e8569b088801c617cf19e38d6dd6f 100644 --- a/src/BTree.py +++ b/src/BTree.py @@ -32,12 +32,12 @@ class Btree() : >>> b.insertion(10) True >>> b.search(10) - (Node([10, 12]), 0) + (Node([1, 10, 11]), 1) >>> Btree(2, Node([4, 10], [Node([1, 3]), Node([25]), Node([50])])).insertion(4) True """ - fini, milieu, g, d = self.root.insert(value) + fini, milieu, g, d = self.root.insert(value, self.k) if (not fini): new_root = Node([milieu], [g, d]) self.root = new_root @@ -53,8 +53,15 @@ class Btree() : """ return self.root.linearisation() - def isBalance(): - (truc, _, _, _) = self.root.is_ArbreB(True) + def isBalance(self): + """ + Exemple(s) : + >>> b= Btree(3, Node([12,25,50], [Node([1,11]), Node([20]), Node([30]), Node([100])])) + >>> b.isBalance() + True + """ + (ok, _, _, _) = self.root.is_ArbreB(self.k, True) + return ok def __repr__(self) : return f"Btree({self.root})" diff --git a/src/Node.py b/src/Node.py index 46c25371f53df0c70a1cc5ed9c3860c5f840d13f..6ea51f34ebf3c693282083743aff229a99d1cd84 100644 --- a/src/Node.py +++ b/src/Node.py @@ -1,11 +1,11 @@ from util import recherche_dichotomique +from Visualization import * class Node() : - def __init__(self, keys, childs = [], k = 2) : + def __init__(self, keys, childs = []) : self.keys = keys self.childs = childs - self.k = k def isLeaf(self): """ @@ -40,59 +40,69 @@ class Node() : return self.childs[index].search(value) - def is_ArbreB(self, is_root = False): - ok = (is_root or (self.k//2) <= len(self.keys)) and len(self.keys) <= self.k + def is_ArbreB(self, k, is_root = False): + """ + Exemple(s) : + >>> Node([5]).is_ArbreB(2) + (True, 0, 5, 5) + >>> Node([5,25]).is_ArbreB(2) + (True, 0, 5, 25) + >>> node = Node([12, 42], [Node([2, 4], [Node([0, 1]), Node([3]), Node([7, 8])]), Node([25]), Node([50])]) + >>> node.is_ArbreB(2) + (False, 2, 0, 50) + >>> Node([5,25,3]).is_ArbreB(2) + (False, 0, 5, 3) + >>> Node([5, 25], [Node([0, 1, 2]), Node([3, 2, 5])]).is_ArbreB(2) + (False, 1, 0, 5) + >>> Node([5], [Node([0]), Node([7], [Node([6]), Node([8])])]).is_ArbreB(2) + (False, 2, 0, 8) + """ + ok = (is_root or (k//2) <= len(self.keys)) and len(self.keys) <= k ok = ok and all(self.keys[i] < self.keys[i+1] for i in range(len(self.keys) - 1)) if (self.isLeaf()): height = 0 mini, maxi = self.keys[0], self.keys[-1] else: - results = [child.is_ArbreB( False ) for child in self.childs] + results = [child.is_ArbreB( k, False ) for child in self.childs] mins = [mini for (_, _, mini, _) in results] - mqxs = [mqxi for (_, _, _, mqxi) in results] - ok = ok and all(cle[i] > maxs[i] and cel[i] < mins[i+1] for i in range(len(cles) - 1)) - print(results) - for r in range(0, len(results)-1): - (ok, h, mini, maxi) = results[i] - if (ok == False): - return False - (ok_tmp, h_tmp, maxi_tmp, mini_tmp) = results[i+1] - if (h != h_tmp): - return False - if (m - - + maxs = [maxi for (_, _, _, maxi) in results] + ok = ok and all(self.keys[i] > maxs[i] and self.keys[i] < mins[i+1] for i in range(len(self.keys) - 1)) + heights = [h for (_, h, _, _) in results] + ok = ok and all(heights[i] == heights[i+1] for i in range(len(heights)-1)) + height = 1 + max(heights) + mini = min(mins) + maxi = max(maxs) return (ok, height, mini, maxi) - def insert(self, value): + def insert(self, value, k): """ Exemple(s): >>> node = Node([5]) - >>> node.insert(20) + >>> node.insert(20, 2) (True, None, None, None) >>> node.search(20) (Node([5, 20]), 1) - >>> Node([5,15]).insert(12) + >>> Node([5,15]).insert(12, 2) (False, 12, Node([5]), Node([15])) >>> node.search(12) >>> node = Node([12, 42], [Node([3]), Node([25]), Node([50])]) - >>> node.insert(52) + >>> node.insert(52, 2) (True, None, None, None) >>> node.search(52) (Node([50, 52]), 1) >>> node = Node([12, 42], [Node([2, 3]), Node([25]), Node([50])]) - >>> node.insert(1) + >>> node.insert(1, 2) (False, 12, Node([2]), Node([42])) >>> node.search(1) (Node([1]), 0) >>> node = Node([12, 42], [Node([2, 4], [Node([0, 1]), Node([3]), Node([7, 8])]), Node([25]), Node([50])]) - >>> node.insert(6) + >>> node.insert(6, 2) (False, 12, Node([4]), Node([42])) - >>> node = Node([12, 42], [Node([2, 3, 4]), Node([25]), Node([50])], 3) - >>> node.insert(1) + >>> node = Node([12, 42], [Node([2, 3, 4]), Node([25]), Node([50])]) + >>> node.insert(1, 3) (True, None, None, None) """ @@ -100,17 +110,17 @@ class Node() : if (not found) : if (self.isLeaf()): self.keys.insert(index, value) - if ( len(self.keys) > self.k): + if ( len(self.keys) > k): milieu, g, d = self.splitNode() return False, milieu, g, d return True, None, None, None else: - (fini, milieu, g, d) = self.childs[index].insert(value) + (fini, milieu, g, d) = self.childs[index].insert(value, k) if (not fini) : self.keys.insert(index, milieu) self.childs[index] = g self.childs.insert(index+1, d) - if ( len(self.keys) > self.k) : + if ( len(self.keys) > k) : milieu, g, d = self.splitNode() return False, milieu, g, d else: @@ -119,18 +129,35 @@ class Node() : return True, None, None, None else : return True, None, None, None + + def suppression(self, value, k, is_root=False) : + (node, index) = self.search(value) + if (node.isLeaf()) : + removed = node.keys.pop(index) + if ( not is_root): + if (k//2 <= len(node.keys) <= k): + return True, None + else: + return False, removed + else + return True, None + else: + (ok, removed) = self.supression(value, k) + if (not ok): + + - def suppr(self,value) : - """ - >>> a = Node([12, 42], [Node([3]), Node([25]), Node([50])]) - >>> a.suppr(11) - False - """ - found = self.search(value) - if (found) : - return None - else : - return False +# def suppr(self, value, k) : +# """ +# >>> a = Node([12, 42], [Node([3]), Node([25]), Node([50])]) +# >>> a.suppr(11) +# False +# """ +# found = self.search(value) +# if (found) : +# return None +# else : +# return False def splitNode(self) :