internal BTreeClass(int order) { Order = order; HalfFull = (order - 1) / 2; Root = new BTreeNode(order); Stack = new StackList(); Stack.Add(new StackItem()); }
public FullProfileDTO(Developer developer) { DeveloperName = developer.Name; DeveloperId = developer.Id; if (developer.Skills != null && developer.Skills.Any()) { foreach (var skill in developer.Skills) { StackList.Add(new StackDTO { Name = skill.Stack.Name, Description = skill.Stack.Description }); TechnologyList.Add(new TechnologyDTO { Name = skill.Technology.Name, Description = skill.Technology.Description }); } } }
public void Push(object obj) { StackList.Add(obj); }
// Recherche de la Leaf L qui doit accueillir key (avec trace des étapes dans Stack). // Renvoie false si key déjà présente. // child = null // Boucle depuis node=L en remontant la Stack // Si node n'est pas Full // insert key et child dans node // return true // transfert moitié de node (keys et children) dans newChild=new Child() // insertion de key et child dans node ou newChild suivant la valeur de key // key devient une des clés du centre de node avant son split, et child devient newChild // si node==Root // Root = new Child() // insertion de key dans Root // insertion de node et child dans Root // return true public bool Add(int key) { //if (key == 273704457) //{ // Debugger.Break(); //} #region BTree vide // Cas particulier du BTree vide if (Root.NbKeys == 0) { Root.AddKey(key); NbKeys++; return(true); } #endregion BTree vide #region Recherche de la leaf qui accueillera key // Boucle depuis Root en descendant les children pour trouver la Leaf qui accueillera key // Trace conservée dans Stack (qui a une taille suffisante pour éviter les push() et pop()) // Début de la recherche BTreeNode node = Root; // indice dans Stack int idxProfondeur = 0; // indice de la plus grande key < key à insérer (ou -1 s'il n'y en a pas) int idxK; for (; ;) { if (node.FindValue(key, out idxK)) { // key déjà présente, on n'insère pas de doublon return(false); // <==================== RETURN } Stack[idxProfondeur].Set(node, idxK); if (node.Leaf) { // Leaf trouvée, on va procéder à l'insertion et aux splits éventuels en résultant break; } // On descend dans le sous-arbre susceptible de contenir ou d'accueillir key node = node.Child(idxK + 1); // Gestion de la profondeur idxProfondeur++; } #endregion Recherche de la leaf qui accueillera key #region Insertion dans la leaf et gestion du split en remontant dans l'arbre BTreeNode child = null; for (; idxProfondeur >= 0; idxProfondeur--) { Stack[idxProfondeur].Get(out node, out idxK); if (!node.IsFull) { node.Insert(idxK + 1, key, child); break; } // node est saturé, on va le splitter node.Split(idxK + 1, ref key, ref child); if (node == Root) { Root = new BTreeNode(Order); Root.Init(key, node, child); Stack.Add(new StackItem()); Deep++; } } #endregion Insertion dans la leaf et gestion du split en remontant dans l'arbre NbKeys++; return(true); }