コード例 #1
0
        // Search for element in skip list
        private Tuple <SkipNode <T>, SkipNode <T>[]> SearchNode(T data)
        {
            var current = head;

            // create update array and initialize it
            var update = new SkipNode <T> [Size + 1];

            // start from highest level of skip list
            for (int i = level; i >= 0; i--)
            {
                // Move the current pointer forward while key is greater than key of node next to current
                while (current.Forward[i] != null && current.Forward[i].Data.CompareTo(data) < 0)
                {
                    current = current.Forward[i];
                }
                // Insert current in update and move one level down and continue search
                update[i] = current;
            }

            // reached level 0 and forward pointer to right,
            // which is desired position to insert key.
            current = current.Forward[0];

            return(new Tuple <SkipNode <T>, SkipNode <T>[]>(current, update));
        }
コード例 #2
0
        public SkipList(int size, double fraction = 0.5)
        {
            Size     = size;
            Fraction = fraction;

            level = 0;

            head = new SkipNode <T>(default(T), Size);
        }
コード例 #3
0
        public void Insert(T data)
        {
            var searchResult = SearchNode(data);
            var current      = searchResult.Item1;
            var update       = searchResult.Item2;

            // if current is NULL that means we have reached to end of the level
            // or current's key is not equal to key to insert
            // that means we have to insert node between update[0] and current node
            if (current == null || !current.Data.Equals(data))
            {
                // Generate a random level for node
                int rlevel = RandomLevel();

                // If random level is greater than list's current
                // level (node with highest level inserted in
                // list so far), initialize update value with pointer
                // to header for further use
                if (rlevel > level)
                {
                    for (int i = level + 1; i < rlevel + 1; i++)
                    {
                        update[i] = head;
                    }

                    // Update the list current level
                    level = rlevel;
                }

                // create new node with random level generated
                var n = new SkipNode <T>(data, rlevel);

                // insert node by rearranging pointers
                for (int i = 0; i <= rlevel; i++)
                {
                    n.Forward[i]         = update[i].Forward[i];
                    update[i].Forward[i] = n;
                }
            }
        }