• SkipList跳跃表(Java实现)


    取自网络https://github.com/spratt/SkipList

    AbstractSortedSet.java

    package skiplist_m;
    /******************************************************************************
    * AbstractSortedSet                                                           *
    *                                                                             *
    * Extends AbstractSet and implements SortedSet, and contains stub methods     *
    *                                                                             *
    * View README file for information about this project.                        *
    * View LICENSE file for license information.                                  *
    ******************************************************************************/
    
    import java.util.*;
    
    abstract class AbstractSortedSet<E>
        extends AbstractSet<E>
        implements SortedSet<E> {
    
        public E first() {
        return null;
        }
    
        public E last() {
        return null;
        }
    
        public Iterator<E> iterator() {
        return null;
        }
    
        public SortedSet<E> headSet(E toElement) {
        return null;
        }
    
        public SortedSet<E> tailSet(E fromElement) {
        return null;
        }
    
        public SortedSet<E> subSet(E fromElement, E toElement) {
        return null;
        }
    
        public Comparator<? super E> comparator() {
        return null;  // uses natural ordering
        }
    }

    SkipList.java

    package skiplist_m;
    /******************************************************************************
    * Skiplist                                                                    *
    *                                                                             *
    * View README file for information about this project.                        *
    * View LICENSE file for license information.                                  *
    ******************************************************************************/
    
    import java.util.Iterator;
    
    public class SkipList<E extends Comparable<E>> extends AbstractSortedSet<E> {
        private SkipListNode<E> head;
        private int maxLevel;
        private int size;
    
        private static final double PROBABILITY = 0.5;
    
        public SkipList() {
            size = 0;
            maxLevel = 0;
            // a SkipListNode with value null marks the beginning
            head = new SkipListNode<E>(null);
            // null marks the end
            head.nextNodes.add(null);
            }
    
            public SkipListNode getHead() {
            return head;
        }
    
        // Adds e to the skiplist.
        // Returns false if already in skiplist, true otherwise.
        public boolean add(E e) {
            if(contains(e)) return false;
            size++;
            // random number from 0 to maxLevel+1 (inclusive)
            int level = 0;
            while (Math.random() < PROBABILITY)
                level++;
            while(level > maxLevel) { // should only happen once
                head.nextNodes.add(null);
                maxLevel++;
            }
            SkipListNode newNode = new SkipListNode<E>(e);
            SkipListNode current = head;
                do {
                current = findNext(e,current,level);
                newNode.nextNodes.add(0,current.nextNodes.get(level));
                current.nextNodes.set(level,newNode);
            } while (level-- > 0);
            return true;
        }
    
        // Returns the skiplist node with greatest value <= e
        private SkipListNode find(E e) {
            return find(e,head,maxLevel);
        }
    
        // Returns the skiplist node with greatest value <= e
        // Starts at node start and level
        private SkipListNode find(E e, SkipListNode current, int level) {
            do {
                current = findNext(e,current,level);
            } while(level-- > 0);
            return current;
        }
    
        // Returns the node at a given level with highest value less than e
        private SkipListNode findNext(E e, SkipListNode current, int level) {
            SkipListNode next = (SkipListNode)current.nextNodes.get(level);
            while(next != null) {
                E value = (E)next.getValue();
                if(lessThan(e,value)) // e < value
                    break;
                current = next;
                next = (SkipListNode)current.nextNodes.get(level);
            }
            return current;
        }
        
        public int size() {
            return size;
        }
    
        public boolean contains(Object o) {
            E e = (E)o;
            SkipListNode node = find(e);
            return node != null &&
                node.getValue() != null &&
                equalTo((E)node.getValue(),e);
            }
    
            public Iterator<E> iterator() {
            return new SkipListIterator(this);
        }
    
    /******************************************************************************
    * Utility Functions                                                           *
    ******************************************************************************/
    
        private boolean lessThan(E a, E b) {
        return a.compareTo(b) < 0;
        }
    
        private boolean equalTo(E a, E b) {
        return a.compareTo(b) == 0;
        }
    
        private boolean greaterThan(E a, E b) {
        return a.compareTo(b) > 0;
        }
    
    /******************************************************************************
    * Testing                                                                     *
    ******************************************************************************/
    
        public static void main(String[] args) {
        SkipList testList = new SkipList<Integer>();
            System.out.println(testList);
        testList.add(4);
            System.out.println(testList);
        testList.add(1);
            System.out.println(testList);
            testList.add(2);
            System.out.println(testList);
        testList = new SkipList<String>();
            System.out.println(testList);
        testList.add("hello");
            System.out.println(testList);
        testList.add("beautiful");
            System.out.println(testList);
            testList.add("world");
            System.out.println(testList);
        }
    
        public String toString() {
            String s = "SkipList: ";
            for(Object o : this)
                s += o + ", ";
            return s.substring(0,s.length()-2);
        }
    }

    SkipListIterator.java

    package skiplist_m;
    /******************************************************************************
    * SkipListIterator                                                            *
    *                                                                             *
    * View README file for information about this project.                        *
    * View LICENSE file for license information.                                  *
    ******************************************************************************/
    
    import java.util.*;
    
    public class SkipListIterator<E extends Comparable<E>> implements Iterator<E> {
            SkipList<E> list;
            SkipListNode<E> current;
    
            public SkipListIterator(SkipList<E> list) {
            this.list = list;
            this.current = list.getHead();
        }
    
        public boolean hasNext() {
        return current.nextNodes.get(0) != null;
        }
    
        public E next() {
            current = (SkipListNode<E>)current.nextNodes.get(0);
            return (E)current.getValue();
        }
    
        public void remove() throws UnsupportedOperationException {
            throw new UnsupportedOperationException();
        }
    }

    SkipListNode.java

    package skiplist_m;
    /******************************************************************************
     * SkipListNode                                                                *
     *                                                                             *
     * View README file for information about this project.                        *
     * View LICENSE file for license information.                                  *
     ******************************************************************************/
    
    import java.util.*;
    
    public class SkipListNode<E> {
        private E value;
        public List<SkipListNode<E> > nextNodes;
        
        public E getValue() {
            return value;
        }
    
        public SkipListNode(E value) {
            this.value = value;
            nextNodes = new ArrayList<SkipListNode<E> >();
        }
    
        public int level() {
            return nextNodes.size()-1;
        }
    
        public String toString() {
        return "SLN: " + value;
        }
    }
  • 相关阅读:
    SSL评测
    EF+SQLSERVER控制并发下抢红包减余额(改进)
    关于游标嵌套时@@FETCH_STATUS的值
    windows下限制Redis端口只能由本机访问
    windows下配置Redis
    Node.js 使用gm处理图像
    Git 与其他系统
    git-svn 简易 操作指南
    git-svn — 让git和svn协同工作
    Git和SVN共存的方法
  • 原文地址:https://www.cnblogs.com/fupeng/p/6898640.html
Copyright © 2020-2023  润新知