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;
    }
}

 

posted on 2017-05-24 14:24  fupeng  阅读(988)  评论(0编辑  收藏  举报

导航