取自网络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;
}
}

SkipList跳跃表(Java实现)的更多相关文章

  1. 小白也能看懂的Redis教学基础篇——朋友面试被Skiplist跳跃表拦住了

    各位看官大大们,双节快乐 !!! 这是本系列博客的第二篇,主要讲的是Redis基础数据结构中ZSet(有序集合)底层实现之一的Skiplist跳跃表. 不知道那些是Redis基础数据结构的看官们,可以 ...

  2. redis skiplist (跳跃表)

    redis skiplist (跳跃表) 概述 redis skiplist 是有序的, 按照分值大小排序 节点中存储多个指向其他节点的指针 结构 zskiplist 结构 // 跳跃表 typede ...

  3. 浅析SkipList跳跃表原理及代码实现

    本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈“跳跃表”的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代 ...

  4. 【转】浅析SkipList跳跃表原理及代码实现

    SkipList在Leveldb以及lucence中都广为使用,是比较高效的数据结构.由于它的代码以及原理实现的简单性,更为人们所接受.首先看看SkipList的定义,为什么叫跳跃表? "S ...

  5. 【Redis】skiplist跳跃表

    有序集合Sorted Set zadd zadd用于向集合中添加元素并且可以设置分值,比如添加三门编程语言,分值分别为1.2.3: 127.0.0.1:6379> zadd language 1 ...

  6. SkipList 跳跃表

    引子 考虑一个有序表:14->->34->->50->->66->72 从该有序表中搜索元素 < 23, 43, 59 > ,需要比较的次数分别为 ...

  7. 算法: skiplist 跳跃表代码实现和原理

    SkipList在leveldb以及lucence中都广为使用,是比较高效的数据结构.由于它的代码以及原理实现的简单性,更为人们所接受. 所有操作均从上向下逐层查找,越上层一次next操作跨度越大.其 ...

  8. 5分钟了解Redis的内部实现跳跃表(skiplist)

    跳跃表简介 跳跃表(skiplist)是一个有序的数据结构,它通过在每个节点维护不同层次指向后续节点的指针,以达到快速访问指定节点的目的.跳跃表在查找指定节点时,平均时间复杂度为,最坏时间复杂度为O( ...

  9. 跳跃表Skip List的原理和实现

    >>二分查找和AVL树查找 二分查找要求元素可以随机访问,所以决定了需要把元素存储在连续内存.这样查找确实很快,但是插入和删除元素的时候,为了保证元素的有序性,就需要大量的移动元素了.如果 ...

随机推荐

  1. hdu 5952 Counting Cliques 求图中指定大小的团的个数 暴搜

    题目链接 题意 给定一个\(n个点,m条边\)的无向图,找出其中大小为\(s\)的完全图个数\((n\leq 100,m\leq 1000,s\leq 10)\). 思路 暴搜. 搜索的时候判断要加进 ...

  2. Java EE学习记录(一)

    话说大家都在说java EE,但是java EE的分层结构如下: 1.数据持久层:主要由一些负责操作POJO(Plain Old Java Object)的类构成,主要负责将数据保存进入数据库; 2. ...

  3. HDU 1018 Big Number【斯特林公式/log10 / N!】

    Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. Codeforces 586D Phillip and Trains(DP)

    题目链接 Phillip and Trains 考虑相对位移. 每一轮人向右移动一格,再在竖直方向上移动0~1格,列车再向左移动两格. 这个过程相当于每一轮人向右移动一格,再在竖直方向上移动0~1格, ...

  5. 51Nod 1272最大距离 (树状数组维护前缀最小值)

    题目链接 最大距离 其实主流解法应该是单调栈……我用了树状数组. #include <bits/stdc++.h> using namespace std; #define rep(i, ...

  6. PHP如何在页面中原样输出HTML代码

    字符串与HTML之间的相互转换主要应用htmlentities()函数来完成. header("Content-Type: text/html; charset=utf-8"); ...

  7. Debugging a SQL Server query with WinDbg

    Debugging a SQL Server query with WinDbg May 13, 2014 · Klaus Aschenbrenner · 5 Comments (Be sure to ...

  8. Android Studio 完美解决 “Android SDK Manager 无法更新“、 ”connection error” 的问题

    一.Android SDK Manager 无法更新 1. 打开SDK Mannger, 并选中启动单独的SDK Mannger.

  9. python 类和__class__理解

    __class__可理解为对象所属的父类 class A: def __init__(self,url): self.url = url def out(self): return self.url ...

  10. Google SEO 学习网站记录

    在搜索结果中创建良好的标题和摘要: https://support.google.com/webmasters/answer/35624?hl=zh-Hans&ref_topic=600194 ...