https://zh.wikipedia.org/wiki/%E8%B7%B3%E8%B7%83%E5%88%97%E8%A1%A8
概述
- 使得包含n个元素的有序序列的查找和插入操作的平均时间复杂度都是
O(log n)
,优于数组的O(n)
复杂度 - 一个多层次的链表。与前一层(下面一层)链表元素的数量相比,每一层链表中的元素的数量更少。每一层是有序的
构造
跳跃列表是按层建造的。底层是一个普通的有序链表。每个更高层都充当下面列表的“快速通道”,在第i
层(下面的层)中的每个元素按某个固定的概率p
(通常为1/2
或1/4
)出现在第i+1
层(上面的层)中,直到当前层元素个数为1
每个元素平均出现在
1/1-p
个列表中,而最高层的元素(通常是在跳跃列表前端的一个特殊的头元素)在log{1/p}n
个列表中出现。
查找
在查找目标元素时,从顶层列表、头元素起步。
算法沿着每层链表搜索,直至找到一个大于或等于目标的元素,或者到达当前层列表末尾。
如果该元素等于目标元素,则表明该元素已被找到;如果该元素大于目标元素或已到达链表末尾,则退回到当前层的上一个元素,然后转入下一层进行搜索。
举例见插入
每层链表中预期的查找步数最多为
1/p
,而层数为log{1/p}n
,所以查找的总体步数为log{p}n/p
,由于p
是常数,查找操作总体的时间复杂度为O(logn)
。而通过选择不同p
值,就可以在查找代价和存储代价之间获取平衡。
插入
和查找类似
插入80

80<=30?

80<=30?no

80<=50?

80<=50?no

走到nil所以向下走
80<=70?

80<=70?no

80<=90?

80<=90?yes, insert
