标签:lam 其他 目标 war 集合 表头 ima 数组 最大
跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而快速访问节点的目的
平均O(logN) 、 最坏O(N),还可以通过顺序性操作来批处理节点
Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(member)是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现
只在两个地方用到:
①实现有序集合键
②在集群节点中用作内部数据结构
由redis.h/zskiplistNode:用于表示跳跃表节点
和redis.h/zskiplist:用于保存跳跃表节点的相关信息,比如节点的数量,以及指向表头结点和表尾节点的指针等
这两个结构定义。
跳跃表节点的实现由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)复杂度内获取跳跃表中层高最大的那个节点的层数量(表头结节点的层高不计算在内)
标签:lam 其他 目标 war 集合 表头 ima 数组 最大
原文地址:https://www.cnblogs.com/Seraphire-yili/p/14042939.html