Esempio n. 1
0
        private void InsertAfterOnCurrentLevel(SkipListNode <K, V> prevNode, SkipListNode <K, V> newNode)
        {
            var successorNode = prevNode.Next;

            prevNode.Next      = newNode;
            newNode.Prev       = prevNode;
            newNode.Next       = successorNode;
            successorNode.Prev = newNode;
        }
Esempio n. 2
0
        private SkipListNode <K, V> FindHighestNodeLessThanAtCurrentLevel(SkipListNode <K, V> startNode, K key)
        {
            var currentNode = startNode;

            //currentnodekey<=key
            while (_comparer.Compare(currentNode.Next.Entry.Key, key) <= 0)
            {
                currentNode = currentNode.Next;
            }

            return(currentNode);
        }
Esempio n. 3
0
        private void CreateNewLevel()
        {
            var negInfNode = CreateNegInfNode();
            var posInfNode = CreatePosInfNode();

            if (_head != null && _tail != null)
            {
                _head.Up        = negInfNode;
                _tail.Up        = posInfNode;
                negInfNode.Down = _head;
                posInfNode.Down = _tail;
            }

            _head      = negInfNode;
            _tail      = posInfNode;
            _head.Next = _tail;
            _tail.Prev = _head;
        }
Esempio n. 4
0
        public override V Put(K key, V value)
        {
            var node = Find(key);

            if (_comparer.Compare(key, node.Entry.Key) == 0)
            {
                var old = node.Entry.Value;
                node.Entry.Value = value;
                return(old);
            }

            var prevNewNode = new SkipListNode <K, V>(key, value);

            InsertAfterOnCurrentLevel(node, prevNewNode);
            var i = 1;

            while (_random.NextDouble() < 0.5)
            {
                if (i > _height)
                {
                    CreateNewLevel();
                    _height++;
                }

                while (node.Up == null)
                {
                    node = node.Prev;
                }

                node = node.Up;
                var newNode = new SkipListNode <K, V>(key, default(V)); //value only needs to be stored on lowest level
                InsertAfterOnCurrentLevel(node, newNode);
                prevNewNode.Up = newNode;
                newNode.Down   = prevNewNode;

                prevNewNode = newNode;

                i++;
            }

            n++;

            return(value);
        }