跳跃表的优点:期望操作时间为O(lgn),且以概率1达到O(lgn),即操作几乎总是O(lgn),而不仅是以期望复杂度为O(lgn)。另外跳跃表实现相对简单。
1. 跳跃表
含义n个元素的跳跃表。
l 跳跃表以多条链表来表示元素。
l 每条链表都是排好序的有序链表。
l 最底层的链表为普通的单链表,包含所有的元素。
l 每一层(除了最底层)节点的选择为其下层元素的均匀选择。而选择的元素个数满足:
Ls+Lx/Ls---式一
(因为对于查询,最坏情况为遍历上层最后一个节点,返回倒数第二个节点后往下走下层节点,且走到下层节点被均匀分割的最后一段的最后一个)。
如果只用两层则下层为n,则上层取n^(1/2)可以使得式一达到最小值2*(n^(1/2)).
同理,如果用k层,则最坏时间为k*(n^(1/k))。
K取lgn达到极致。即:
l 总共有lgn层链表。最上层只有两个端点。向下走时,每层段数依次为上层的2倍。即每一层其单段的长度为下层单段的两倍。
2. 操作
2.1. 查询
查询时从最上层开始,以类似二分查找的方式依次往下找。最差情况下,找到最后一层,这是每一层的元素都访问了一段。总的时间为O(lgn)。
2.2. 插入
l 先在底层插入元素。
l 再以随机的方式,1/2的概率,将元素添加到上层链表中。如果进行了添加,再以随机1/2的概率继续往上添加。两边以一个占位元素来保证每个链表的端点。
这种随机提升的时候,可能会有最上层好多层相同的情况。但由于随机,因此可以达到树高为O(lgn)。
另外,插入的元素对输入没有要求,任何输入都可以。
2.3. 删除
删除直接删除就行,只是如果还在上层,则需要将上层的也删除。
2.4. 以概率1达到复杂度的证明
概率大于1-O(1/(n^a)),a可以取任何值。
跳跃表的层数以概率1为O(lgn)。