Example #1
0
 /// <summary>
 /// 생성자
 /// </summary>
 /// <param name="randomSeed">내부 난수 시드 값</param>
 /// <param name="comparer">요소 비교자</param>
 public SkipList(int randomSeed, IComparer <T> comparer)
 {
     _head = new SkipListNode <T>(1);
     _count++;
     _rnd      = (randomSeed < 0) ? new Random() : new Random(randomSeed);
     _comparer = (comparer != null) ? comparer : Comparer <T> .Default;
 }
Example #2
0
        /// <summary>
        /// 지정된 값을 가진 요소를 생성해서 리스트에 추가한다.
        /// </summary>
        /// <param name="value"></param>
        public void Add(T value)
        {
            // 추가에 의해 변경되어야 할 기존 노드들을 구한다.
            var updates = BuildUpdateTable(value);
            var current = updates[0];

            // 중복인지 검사해서 중복이면 추가 안함!!!
            if (current[0] != null && _comparer.Compare(current[0].Value, value) == 0)
            {
                return;
            }

            var newNode = new SkipListNode <T>(value, ChooseRandomHeight(_head.Height + 1));

            _count++;

            // 새로운 노드의 Height가 헤드보다 크다면, 헤드 노드의 크기를 키우고, 그 곳을 새로운 노드를 가르키게 한다.
            if (newNode.Height > _head.Height)
            {
                _head.IncHeight();
                _head[_head.Height - 1] = newNode;
            }

            // 새로운 노드의 자리를 정리한다.
            for (int i = 0; i < newNode.Height; i++)
            {
                if (i < updates.Count)
                {
                    newNode[i]    = updates[i][i];
                    updates[i][i] = newNode;
                }
            }
        }
Example #3
0
 /// <summary>
 /// 리스트의 모든 요소를 삭제한다.
 /// </summary>
 public void Clear()
 {
     _head  = null;
     _head  = new SkipListNode <T>(1);
     _count = 0;
 }