SkipList简介
SkipList是一种随机化的数据结构,基于并联的链表,其效率可比拟二叉查找树,对于大多数操作需要O(logn)平均时间。基本上,跳跃表是对有序的链表增加附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表,因此得名。SkipList可以很好解决有序链表查找特定值的困难。
SkipList定义
如上图,SkipList应具备以下特征:
- 一个跳表应该由几个层(level)组成;
- 跳表的第一层包含所有元素;
- 每一层都是一个有序的链表;
- 如果元素 x 出现在第 i 层,则所有比 i 小的层都包含 x;
- 第 i 层的元素通过一个 down 指针指向下一层拥有相同值得元素;
- 在每一层中,-1 和 1 两个元素都出现(分别表示INT_MIN和INT_MAX);
- top指针指向最高层的第一个元素。
SkipList构造步骤
- 给定一个有序的链表;
- 选择链表中最大和最小的元素,然后从其他元素中按照一定的算法(随机)随机选出一些元素,将这些元素组成有序链表。这个新的链表成为一层,原链表成为下一层;
- 为刚选出的每个元素添加一个指针域,这个指针指向下一层中值同自己相等的元素。Top指针指向该层首元素;
- 重复2、3步,直到不再能选择出除最大最小元素以外的元素。