1、定义描述
跳跃列表(也称跳表)是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间)。
基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表,因此得名。所有操作都以对数随机化的时间进行。
跳表是按层构造的,最底层是一个全量的有序链表,上层可以说是下层的“快速跑道”。常用于链表元素非常多的场景,查询、删除和插入操作都会是一种负担。
目前,开源软件Redis和 LevelDB都有用跳表这种数据结构,采用空间换时间的思路提高对链表的基本操作。在 Java 的 JUC 库里有实现好的ConcurrentSkipListMap和ConcurrentSkipListSet,可以应用在自己的项目中。
2、跳表具有如下性质
如下图,为一个跳表数据模型样例
(1)由很多层结构组成
(2)每一层都是一个有序的链表
(3)最底层(Level 1)的链表包含所有元素
(4)如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。
(5)每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。
3、相关操作
(1)查找
例如:查找117
例子:查找元素 117
a. 比较 21, 比 21 大,往后面找
b. 比较 37, 比 37大,比链表最大值小,从 37 的下面一层开始找
c. 比较 71, 比 71 大,比链表最大值小,从 71 的下面一层开始找
d. 比较 85, 比 85 大,从后面找
e. 比较 117, 等于 117, 找到了节点。
(2)插入
首先,确定该元素要占据的层数 K(采用丢硬币的方式,这完全是随机的)
然后在 Level 1 ... Level K 各个层的链表都插入元素。
例子:插入 119, K = 4,当 K 大于当前链表的层数则添加新层
(3)删除
在各个层中找到包含 x 的节点,使用标准的 delete from list 方法删除该节点。
例子:删除 71
4、参考