数据结构之六(跳跃表Skip List)

来源:互联网 发布:苹果手机看书软件 编辑:程序博客网 时间:2024/06/04 19:28

跳跃表的优点:期望操作时间为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.       插入

先在底层插入元素。

再以随机的方式,1/2的概率,将元素添加到上层链表中。如果进行了添加,再以随机1/2的概率继续往上添加。两边以一个占位元素来保证每个链表的端点

这种随机提升的时候,可能会有最上层好多层相同的情况。但由于随机,因此可以达到树高为O(lgn)。

另外,插入的元素对输入没有要求,任何输入都可以。

2.3.       删除

删除直接删除就行,只是如果还在上层,则需要将上层的也删除。

2.4.       以概率1达到复杂度的证明

概率大于1-O(1/(n^a)),a可以取任何值。

跳跃表的层数以概率1为O(lgn)。

原创粉丝点击