Пример #1
0
 internal BTreeClass(int order)
 {
     Order    = order;
     HalfFull = (order - 1) / 2;
     Root     = new BTreeNode(order);
     Stack    = new StackList();
     Stack.Add(new StackItem());
 }
Пример #2
0
        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
                    });
                }
            }
        }
Пример #3
0
 public void Push(object obj)
 {
     StackList.Add(obj);
 }
Пример #4
0
        // 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);
        }