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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值