Esempio n. 1
0
        private void SplitChild(Node parent, int i, Node child)
        {
            var z = new Node();

            for (int j = 0; j < _lowerBound; j++)
            {
                z.AddOrUpdateKey(j, child[j + _t]);
            }

            if (!child.IsLeaf)
            {
                for (int j = 0; j < _t; j++)
                {
                    z.AddOrUpdateChild(j, child.Children[j + _t]);
                }
            }

            for (int j = parent.Count(); j > i; j--)
            {
                parent.AddOrUpdateChild(j + 1, parent.Children[j]);
            }

            parent.AddOrUpdateChild(i + 1, z);

            for (int j = parent.Count() - 1; j >= i; j--)
            {
                parent.AddOrUpdateKey(j + 1, parent[j]);
            }

            parent.AddOrUpdateKey(i, child[_lowerBound]);
            child._keys.RemoveRange(_lowerBound, child.Count() - _t + 1);
        }
Esempio n. 2
0
        private void InsertNonFull(Node child, NodeKey key)
        {
            int i = child.Count() - 1;

            if (child.IsLeaf)
            {
                while (i >= 0 && key.Key < child[i].Key)
                {
                    child[i + 1].Key = child[i].Key;
                    i--;
                }
                child.AddOrUpdateKey(i + 1, key);
            }
            else
            {
                while (i >= 0 && key.Key < child[i].Key)
                {
                    i--;
                }
                i++;

                if (child.Children[i].Count() == _upperBound)
                {
                    SplitChild(child, i, child.Children[i]);
                    if (key.Key > child[i].Key)
                    {
                        i++;
                    }
                }
                InsertNonFull(child.Children[i], key);
            }
        }
Esempio n. 3
0
        public Node Search(Node root, int key, ref int index)
        {
            int i = 0;

            while (i < root.Count() && key >= root[i].Key)
            {
                i++;
            }

            if (i < _t && i < root.Count() && key == root[i].Key)
            {
                index = i;
                return(root);
            }

            return(root.IsLeaf ? null : Search(root.Children[i], key, ref index));
        }