跳跃表
2017-01-09 18:12
148 查看
转自:http://www.redisbook.com
跳跃表
跳跃表(维基百科):从图中可以看到, 跳跃表主要由以下部分构成:表头(head):负责维护跳跃表的节点指针。
跳跃表节点:保存着元素值,以及多个层。
层:保存着指向其他元素的指针。高层的指针越过的元素数量大于等于低层的指针,为了提高查找的效率,程序总是从高层先开始访问,然后随着元素值范围的缩小,慢慢降低层次。
表尾:全部由
允许重复的 member 的 score 值,还要检查 score 值可以重复时,单靠 member 域都一并检查才行。
每个节点都带有一个高度为 1 层的后退指针,用于从表尾方向向表头方向迭代:当执行 ZREVRANGEBYSCORE 这类以逆序处理有序集的命令时,就会用到这个属性。
这个修改版的跳跃表由 redis.h/zskiplistNode 定义:
typedef struct zskiplistNode {
// member 对象
robj *obj;
// 分值
double score;
// 后退指针
struct zskiplistNode *backward;
// 层
struct zskiplistLevel {
// 前进指针
struct zskiplistNode *forward;
// 这个层跨越的节点数量
unsigned int span;
} level[];
} zskiplistNode;
以下是操作这两个数据结构的 API ,它们的作用以及相应的算法复杂度:
函数 | 作用 | 复杂度 | |
---|---|---|---|
zslFreeNode | 释放给定的跳跃表节点 | 最坏 O(1) | |
zslFree | 释放给定的跳跃表 | 最坏 O(N) | |
score 和 zslDeleteNode | 删除给定的跳跃表节点 | 最坏 O(N) | |
member 和 zslFirstInRange | 找到跳跃表中第一个符合给定范围的元素 | 最坏 O(N) 平均 O(logN) | |
zslDeleteRangeByScore | 删除 zslDeleteRangeByRank | 删除给定排序范围内的所有节点 | 最坏 O(N2) |
zslGetElementByRank | 根据给定排位,返回该排位上的元素节点 | 最坏 O(N) 平均 O(logN) |
跳跃表的应用
和字典、链表或者字符串这几种在 Redis 中大量使用的数据结构不同, 跳跃表在 Redis 的唯一作用, 就是实现有序集数据类型。跳跃表将指向有序集的 member 域的指针作为元素, 并以 x 、 z 三个 6 、 15 分别创建三个 member 和 member 和 member 和 有序集》章节。小结
跳跃表是一种随机化数据结构,它的查找、添加、删除操作都可以在对数期望时间下完成。跳跃表目前在 Redis 的唯一作用就是作为有序集类型的底层数据结构(之一,另一个构成有序集的结构是字典)。
为了适应自身的需求,Redis 基于 William Pugh 论文中描述的跳跃表进行了修改,包括:
score 和 <tt literal"="" style="background-color: transparent; color: rgb(34, 34, 34); font-size: 1.1em;">memeber 。
每个节点带有高度为 1 层的后退指针,用于从表尾方向向表头方向迭代。
相关文章推荐
- 修复identity 类型字段数据的跳跃
- oracle跳跃索引的应用场合
- 思考--连续的还是跳跃的?
- 手把手教你写跳跃类游戏(3)
- 跳跃表数据结构
- Android之PopupWindow+ListView+在item顶部底部跳跃
- 状态添加Android游戏开发十日通(4)-行走,跳跃,碰撞检测
- 数据结构-跳跃表
- 跳跃表
- Cocos2dx CCJumpTo函数执行两次跳跃时,坐标异常
- Activiti5.14 流程跳跃/退回/驳回/自定义流转(中国式退回)
- hdu--2846--字典树<怪我思维不够跳跃>
- 跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总
- codevs 1365 浴火银河星际跳跃 题解
- 【高效算法设计——跳跃枚举】Uva 11093 Just Finish it up
- 【转自Oracle ACS--惜总】正常关闭数据库sequence cache不为0 sequence不跳跃
- uvalive 4727 jump跳跃(dp/约瑟夫问题变形)
- 【冀宝er要逆袭】Faulty Odometer-码表跳跃问题
- Java类反射(能力更上一台阶,Java跳跃)
- 【Cocos2dx】精灵触摸跳跃功能