跳表SkipLIst描述[完整的代码在最下方]
跳跃表SkipLIst,基于并联的链表,一种随机化的数据结构,在插入数据的同时就已经排好序,然后根据随机数产生上一层的跳跃层。(可以用来实现游戏排行榜)
SkipNode跳表节点的结构
跳跃节点一共有,一个数据data域,左指针left域,右指针right域,上指针up域,下指针down域。
跳跃表的初始化
跳跃表的插入put(Integer k)
1.首先查找插入位置SkipListNode findLocation(Integer k);【小->大的顺序】
查找插入位置的思路如下:
a.从顶层开始查找(找到最后一个小于k的节点),(一层找不到,就下一层)
b.若是找到该节点的位置,就平移到最底层
2 .插入节点
3. 抛硬币,如果为正面,就把该节点复制到上一层中,作为跳跃节点;
重复抛硬币,知道硬币为反面。
插入步骤演示:
1.首先创建一个跳跃表
2.插入第一个元素17
首先找到插入位置,在最底层插入元素17,并抛硬币,创建跳跃层,
下面创建了三层跳跃层情况。
3.插入第二个元素28
找到该元素在最底层的插入位置,插入;并抛硬币,第一次就是反面,故不用往上创建跳跃节点:
4.插入第三个元素23
找到该元素在底层的插入位置,插入;并抛硬币,随机网上创建跳跃节点,如图:
5.然后依次类推
基于跳表的插入,时间复杂度是O(logn),
解释:创建一个新的跳跃层的概率为0.5;若有n个元素,则该链表最有有log2n层,在查找到插入位时,每层的比较次数是一个常数C,所以找到底层插入位置的总体比较次数为Clog2n。
跳跃表的删除最小节点deleteFIrst()【插入按从小到大顺序】
首先找到最底层的左边界节点,
如果该表不为空,从底层开始往上循环,依次删除最小的节点
时间复杂度为O(logn)
跳跃表的删除最小节点deleteLast()【插入按从小到大顺序】
首先找到最底层的右边界节点,
如果该表不为空,从底层开始往上循环,依次删除最大的节点
时间复杂度为O(logn)
SkipListNode.java
package 跳表;
public class SkipListNode {
public Integer key; //关键值
public SkipListNode left; //左指针
public SkipListNode right; //右指针
public SkipListNode up; //上指针
public SkipListNode down; //下指针
public static int negInf = Integer.MIN_VALUE; //边界值
public static int posInf = Integer.MAX_VALUE; //边界值
//构造器
public SkipListNode(Integer key) {
this.key = key;
this.left = this.right = this.up = this.down = null;
}
public Integer getKey() {
return key;
}
public void setKey(Integer key) {
this.key = key;
}
@Override
public String toString() {
return "[key=" + key + "]";