码迷,mamicode.com
首页 > 其他好文 > 详细

跳跃表

时间:2020-12-01 12:12:35      阅读:5      评论:0      收藏:0      [点我收藏+]

标签:lam   其他   目标   war   集合   表头   ima   数组   最大   

跳跃表??

一.它是什么??

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而快速访问节点的目的

二.时间复杂度??

平均O(logN)最坏O(N),还可以通过顺序性操作来批处理节点

三.什么时候用???

Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(member)是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现

只在两个地方用到

①实现有序集合键

②在集群节点中用作内部数据结构

四.跳跃表的实现??

redis.h/zskiplistNode用于表示跳跃表节点

redis.h/zskiplist用于保存跳跃表节点的相关信息,比如节点的数量,以及指向表头结点和表尾节点的指针等

这两个结构定义。

技术图片

1.zskiplist结构

技术图片

2.zskiplistNode结构

技术图片

3.跳跃表节点

跳跃表节点的实现由redis.h/zskiplistNode结构定义

技术图片

①层

leval数组可以包含多个元素,每个元素都包含一个指向其他节点的指针,程序可以通过这些层来加快访问其他节点的速度,层的数量越多,访问其他节点的速度越快

②前进指针

每个层都有一个指向表尾的前进指针(leval[i].forward属性),用于从表头向表尾方向访问节点

③跨度

层的跨度(leval[i].span属性用于记录两个节点之间的距离

(1)两个节点之间的跨度越大,它们相距得就越远

(2)指向NULL得所有前进指针得跨度都为0,因为它们没有连向任何节点

它是用来计算排位(rank)的:在查找某个节点的过程中,将沿途访问的所有层的跨度累计起来,得到的结果就是目标节点在跳跃表中的排位

④后退指针

节点的后退指针(backward属性)用于从表尾向表头方向访问节点,每次只能退至前一个节点

⑤分值和成员

(1)节点的分值(score属性)是一个double类型的浮点数,跳跃表中的所有节点都按分值从小到大来排序

(2)节点的成员对象(obj属性)是一个指针,它指向一个字符串对象,而字符串对象则保存着一个SDS值

在同一个跳跃表中,各个节点保存的成员对象必须是唯一的但多个节点保存的分值却可以是相同的:分值相同的节点将按照成员对象在字典序中的大小来进行排序,成员对象较小的节点会排在前面,而成员对象较大的系欸但则会排在后面

五.跳跃表??

虽然仅靠多个跳跃表节点就可以组成一个跳跃表,但通过使用一个zskiplist结构来持有这些节点,程序可以更方便地对整个跳跃表进行处理,比如快速访问表头和表尾节点,或者快速获取跳跃表节点的数量

技术图片

①header和tail指针分别指向跳跃表的表头和表尾节点,通过它们,程序定位表头结点和表尾结点的复杂度为O(1)

②通过使用length属性来记录节点的数量,程序可以在O(1)复杂度内返回跳跃表的长度

leaval属性用来记录节点的数量,可在O(1)复杂度内返回跳跃表的长度,它可以用于在O(1)复杂度内获取跳跃表中层高最大的那个节点的层数量(表头结节点的层高不计算在内)

六.跳跃表API??

技术图片

七.重点?

技术图片

跳跃表

标签:lam   其他   目标   war   集合   表头   ima   数组   最大   

原文地址:https://www.cnblogs.com/Seraphire-yili/p/14042939.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!