diff --git a/src/BTree.py b/src/BTree.py index 00acd74d27cc3f69f898198b8de73e1c3e6a951f..fa1b3bf76149edc72f90a95472a2523d1a59e989 100644 --- a/src/BTree.py +++ b/src/BTree.py @@ -9,6 +9,14 @@ class Btree() : def search(self, value): """ + Rechercher une valeur dans l'arbre + Params : + value : (int), valeur à rechercher + + Return : + (Node, index) : renvoie le noeud qui contient la valeur recherchée et son indice + dans ce noeud. + ne renvoie rien si valeur inéxistante Exemple(s): >>> Btree(2, Node([5,25])).search(25) (Node([5, 25]), 1) @@ -20,23 +28,30 @@ class Btree() : def insertion(self, value): """ + insérer une valeur dans l'arbre + + Params : + value : (int), valeur à insérer + + Return : + bool : (true) si insertion réussi, false sinon. + Exemple(s): -# >>> a =Btree(2, Node([12, 42], [Node([2, 3]), Node([25]), Node([50])])) -# >>> a.insertion(1) -# True -# >>> a.search(1) -# (Node([1]), 0) -# >>> b= Btree(3, Node([12,25,50], [Node([1,11]), Node([20]), Node([100])])) -# >>> b.insertion(10) -# True -# >>> b.search(10) -# (Node([1, 10, 11]), 1) -# >>> Btree(2, Node([4, 10], [Node([1, 3]), Node([25]), Node([50])])).insertion(4) -# True + >>> a =Btree(2, Node([12, 42], [Node([2, 3]), Node([25]), Node([50])])) + >>> a.insertion(1) + True + >>> a.search(1) + (Node([1]), 0) + >>> b= Btree(3, Node([12,25,50], [Node([1,11]), Node([20]), Node([100])])) + >>> b.insertion(10) + True + >>> b.search(10) + (Node([1, 10, 11]), 1) + >>> Btree(2, Node([4, 10], [Node([1, 3]), Node([25]), Node([50])])).insertion(4) + True >>> c = Btree(2,Node([1, 10])) >>> c.insertion(15) True - """ fini, milieu, g, d = self.root.insert(value, self.k) if (not fini): @@ -47,7 +62,11 @@ class Btree() : def linearisation(self): """ + linéarise l'arbre en une liste triée dans l'order croissant + Return : + list : int + Exemple(s): >>> a =Btree(2, Node([12, 42], [Node([2, 3]), Node([25]), Node([50])])) >>> a.linearisation() diff --git a/src/Node.py b/src/Node.py index 21bf61216ef850a36434550875eedb2e8b3d902c..e1d62d362891ccdd6b808dc0eb9b48896fc6b8b1 100644 --- a/src/Node.py +++ b/src/Node.py @@ -1,6 +1,4 @@ from util import recherche_dichotomique -#from Visualization import * -#from BTree import * class Node() : @@ -10,6 +8,11 @@ class Node() : def isLeaf(self): """ + verifie si un noeud est une feuille + + Return : + bool : (true) si feuille, false sinon + Exemple(s): >>> Node([12, 42]).isLeaf() True >>> Node([12, 42], [Node([1]), Node([25]), Node([50])]).isLeaf() @@ -22,6 +25,16 @@ class Node() : def search(self, value): """ + Rechercher une valeur dans un noeud + + Params : + value : (int), valeur à rechercher + + Return : + (Node, index) : renvoie le noeud qui contient la valeur recherchée et son indice + dans ce noeud. + ne renvoie rien si valeur inéxistante + Exemple(s): >>> Node([5,25]).search(5) (Node([5, 25]), 0) @@ -43,7 +56,15 @@ class Node() : def is_ArbreB(self, k, is_root = False): """ - Verification de l'équilibrage de l'arbre + Verification de l'équilibrage d'un noeud + • Toutes les feuilles ont la même profondeur, à savoir la hauteur h de l’arbre. + • k/2 ≤ n ≤ k. Taux de remplissage min = 50%, et moyen 75%. + n = nombre de clés contenus dans le nœud x + • Si x n’est pas une feuille : + • pour 2<=i<=n, pour toute clef x du filsi : clesi <= x <=clesi+1 + • Pour toute clef x du fils1 : x <= cles1 + • Si x n’est pas la racine, n est compris entre k/2 et k. + Params : k => number of keys in node Return : @@ -86,9 +107,16 @@ class Node() : def insert(self, value, k): """ - Return : (node, index) or Nothing - Exemple(s): + insérer une valeur dans un noeud + Params : + value : (int), valeur à insérer + + Return : (True, _,_,_) si insertion réussi où (true) si valeur déjà présente + (False, _,_,_) si l'insertion a été faite mais que l'arbre n'est pas équilibré, + dans ce cas on délègue le travail restant au père. + + Exemple(s): >>> node = Node([]) >>> node.insert(5,1) (True, None, None, None) @@ -117,8 +145,6 @@ class Node() : >>> node = Node([12, 42], [Node([2, 3, 4]), Node([25]), Node([50])]) >>> node.insert(1, 3) (True, None, None, None) - - """ (found, index) = recherche_dichotomique(value, self.keys) if (not found) : @@ -146,6 +172,7 @@ class Node() : def suppression(self, value, k, is_root=False) : """ + supprime une Exemple(s): >>> node = Node([42], [Node([14]), Node([50])]) >>> node.suppression(14, 2) @@ -195,6 +222,12 @@ class Node() : def splitNode(self) : """ + Divise un noeud + + Return : + (milieu, gauche, droite) : la valuer du milieu, de gauche et de droite. + + Exemple(s): >>> Node([10,20,25]).splitNode() (20, Node([10]), Node([25])) >>> Node([12, 20, 22, 40]).splitNode() @@ -210,6 +243,11 @@ class Node() : def linearisation(self): """ + linéarise un noeud en une liste triée dans l'order croissant + + Return : + list : int + Exemple(s): >>> Node([12, 42], [Node([2, 3]), Node([13, 15]), Node([45])]).linearisation() [2, 3, 12, 13, 15, 42, 45] @@ -228,6 +266,9 @@ class Node() : def __repr__(self) : + """ + répresentation d'un noeud et de ces fils. + """ return (f"Node({self.keys}" + (f", {self.childs})" if len(self.childs) > 0 else ")"))