SkipList(跳表)

 

跳表简介

跳表是基于有序链表实现的搜索结构,是一种动态的搜索结构,即支持动态插入和删除操作,且跳表查找和删除的平均时间复杂度是Olog(n),因此跳表是一种时间复杂度相对较小的搜索结构。

我们知道对一个数据集合的查找,最差的时间复杂度是O(n),即遍历每个元素进行查找;最好的时间复杂度是Olog(n),实现Olog(n)时间复杂度主要思想是每进行一次查找查找范围都减小一半,因此时间复杂度为Olog(n)的数据集合一般为有序集合,每次查找与有序集中的中间元素比较,确定下次查找的另一半有序集合的范围。

单一有序链表查找时间复杂度为O(n),要想基于链表实现Olog(n),需要增加索引可以随机访问到有序链表的某个元素,这也是一种牺牲空间(增加索引信息)换取时间(O(n)-->Olog(n))的一种方法。

跳表的结构如图所示:

最下边黄色为有序链表,上面每一层为一级索引,从上到下,每层索引将上层索引划分的范围进一步缩小,直到定位到要查找的元素。

跳表构建

基于有序链表构建的时间复杂度为Olog(n)的理想结构如下图:

上图构建的跳表严格均衡,每层索引都将上层索引确定的搜索范围进一步对半划分,类似于二分查找(二分查找算法之所以能达到 O(logn) 这样高效的一个重要原因在于它所依赖的数据结构是数组,数组支持随机访问一个元素,通过下标很容易定位到中间元素。而链表是不支持随机访问的,只能从头到尾依次访问。但是数组有数组的局限性,比如需要连续的内存空间,插入删除操作会引起数组的扩容和元素移动,链表(基于指针的树结构我觉得也算广义上的链表结构)有链表的优势,链表不需要先申请连续的空间,插入删除操作的效率非常高。在很多情况下,数据是通过链表这种数据结构存储的)。这样的结构时间复杂度等于Olog(n)。但是跳表为动态搜索结构可以动态插入和删除元素,这样每次插入和删除操作就有可能破坏上图中的平衡结构,如果要维持上图平衡结构,需要每次插入和删除操作后调整结构以维持平衡。这类似于红黑树每次插入和删除后的调整操作,如果跳表每次操作后都进行调整维持严格的平衡,操作会比较复杂,相对于红黑树也就没有了优势。因此跳表每次进行插入和删除操作后不会调整到严格均衡,而是通过简单的概率算法实现近似平衡的结构,性能近似Olog(n)。

跳表构建过程:

每次插入新结点时,首先确定插入链表的位置,之后为该节点建立索引。设定概率p和概率函数f,当节点位于第i层时,计算概率函数,如果值小于p则向上建立第i+1层索引,直到概率函数值大于p或者索引层数达到最大MaxLevel停止。比如概率函数为抛硬币,如果为正面则继续向上建立一层新索引,直到抛到反面为止或者达到最大索引层数Maxlevel。节点达到越高层级索引的概率越低,因此整体上高层级索引相对于低层级索引要少。

跳表理论基础

ftp://ftp.cs.umd.edu/pub/skipLists/skiplists.pdf 

跳表空间复杂度

跳表的空间复杂度为log(2n),简单证明。

每层节点数量为,n、np、np2、np3、np4、...nplog2(n),所有节点求和为n*((1-plog(n))/1-p),当p为1/2时,所有节点和为2n

跳表时间复杂度

跳表的时间复杂度为O(logn)

跳表实现

待续

跳表和红黑树比较

(1)复杂度:红黑树每次插入和删除有可能破坏树的平衡结构,需要调整,复杂度较高;跳表每次插入时只需为新节点建立索,删除时,只需修改相邻节点的指针,操作简单

(2)搜索时间复杂度:红黑树和跳表的时间复杂度相似,差别不到,都未Ologn

(3)空间复杂度:简单计算,红黑树一个节点需要两个指向左右孩子的指针;跳表,每个节点的指针数量为每个节点的层级数,节点的层级数平均为1/(1-p),取决于概率p,当p为1/2时,每个节点包含的指针为2,于红黑树差不多,不过像redis取p为1/4,则平均每个节点含1.33个指针

(4)范围查找:跳表范围查找比较简单,只需找到最小值后,在最底层链表中依次遍历就可找到最大值;红黑树,在找最小值后还需中序遍历查找最大值。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值