Exemple #1
0
        private static Leaf <K, V> GetLeafThatMayContainKey(K key, Node <K, V> node)
        {
            while ((node = InternalNode <K, V> .ChooseSubtree(key, node)) is InternalNode <K, V> )
            {
            }
            var leaf = node as Leaf <K, V>;

            return(leaf);
        }
Exemple #2
0
        public void Insert(K key, V value)
        {
            Node <K, V> newNode      = null;
            K           pivotElement = default(K);

            Root.Insert(key, value, out newNode, out pivotElement);
            if (newNode != null)
            {
                if (Root is Leaf <K, V> || Root.KeyIndex < _lastRootIndex)
                {
                    var newRoot = new InternalNode <K, V>(MaxDegree - 1);
                    newRoot.AddKeyChild(pivotElement, Root);
                    newRoot.Children[1] = newNode;
                    Root = newRoot;
                }
                else
                {
                    (Root as InternalNode <K, V>).AddKeyChild(key, newNode);
                }
            }
            _lastRootIndex = Root.KeyIndex;
            Count++;
        }
Exemple #3
0
        private void Split(K key, Node <K, V> newChildNode, out Node <K, V> rightNode, out K midElement)
        {
            // TODO Do split without addition buffer
            K[]  keyBuf                 = new K[Keys.Length + 1];
            var  childBuf               = new Node <K, V> [Keys.Length + 2];
            bool isKeyInserted          = false;
            K    newChildMinKey         = newChildNode.Keys[0];
            bool isNewChildNodeInserted = false;
            int  k = 0;

            for (int i = 0, j = 0; i < keyBuf.Length; i++, k++)
            {
                if (!isNewChildNodeInserted && newChildMinKey.CompareTo(Children[i].Keys[0]) < 0)
                {
                    childBuf[k]     = newChildNode; isNewChildNodeInserted = true;
                    childBuf[k + 1] = Children[i];
                    k++;
                }
                else
                {
                    childBuf[k] = Children[i];
                }

                if (j < Keys.Length && key.CompareTo(Keys[j]) < 0 && !isKeyInserted)
                {
                    keyBuf[i]     = key;
                    isKeyInserted = true;
                }
                else
                {
                    if (j < Keys.Length)
                    {
                        keyBuf[i] = Keys[j];
                    }
                    j++;
                }
            }
            if (k != childBuf.Length)
            {
                if (isNewChildNodeInserted)
                {
                    childBuf[k] = Children[Children.Length - 1];
                }
                else
                {
                    childBuf[k] = newChildNode;
                }
            }

            if (isKeyInserted)
            {
                keyBuf[keyBuf.Length - 1] = Keys[Keys.Length - 1];
            }
            else
            {
                keyBuf[keyBuf.Length - 1] = key;
            }

            int midIndex = keyBuf.Length / 2;

            midElement = keyBuf[midIndex];
            K[]           rightKeys  = new K[Keys.Length];
            Node <K, V>[] rightNodes = new Node <K, V> [Keys.Length + 1];
            int           rightIndex = 0;

            for (int i = midIndex + 1; i < keyBuf.Length; i++, rightIndex++)
            {
                rightKeys[rightIndex] = keyBuf[i];
            }
            for (int i = midIndex + 1, j = 0; i < childBuf.Length; i++, j++)
            {
                rightNodes[j] = childBuf[i];
            }
            rightNode = new InternalNode <K, V>(rightIndex - 1, rightKeys, rightNodes);

            int leftIndex = 0;

            for (int i = 0; i < Keys.Length; i++)
            {
                if (i < midIndex)
                {
                    Keys[leftIndex] = keyBuf[i];
                    leftIndex++;
                }
                else
                {
                    Keys[leftIndex] = default(K);  // TODO Fix it after debugging
                }
            }
            KeyIndex = leftIndex - 1;
            for (int i = 0; i < Children.Length; i++)
            {
                if (i <= midIndex)
                {
                    Children[i] = childBuf[i];
                }
                else
                {
                    Children[i] = default(Node <K, V>);  // TODO Fix it after debugging
                }
            }
        }