美文网首页
定时器实现 & 红黑树,跳表

定时器实现 & 红黑树,跳表

作者: 365_9163 | 来源:发表于2020-09-01 10:38 被阅读0次

跳表:是为一个有序的链表建立多级索引的数据结构叫做跳表。redis中zset数据量大时底层数据结构使用跳表。

redis中定时器使用的是无序的双向链表。时间复杂度为O(N),redis作者在定时器备注了可以适当优化的措施:

1 尽可能让数据有序,2 可以使用跳表完成

redis定时器注释

回归正题,跳表:

其他地方借图一张如下:

跳表是基于有序链表所实现的,为了实现快速的查找,在做节点比较的时候跳过一些节点以达到快速查找的目的,是一种空间换时间的思想。

如上图,此跳表总共三层(level = 3),redis中zset在数据量比较大时,采用的即是跳表实现 其最大层数是32,再插入节点的时候随机生成层数,最大不超过32;

如上图为例,头节点不保存数据,按照上图分析插入操作:

插入之前要先从上层到下层临时保存每一层的当前节点,然后随即生成新的newlevel,如果newlevel大于level,则对于(level-newlevel)层进行初始化头结点 。

插入14前,没有数据只有头结点 ,当前level默认是1,用temp[0]临时保存节点,

temp保存临时节点

while循环是找到下一个节点,比如插入34时,while之后level1 层 x节点就是23;插入50时,while循环之后 level1层temp[0] = 43,level2层 temp[1]=34,level3层 temp[2]=14;

保存完临时节点后,随机生成新的层数,

随机生成新的层数

14插入时随机层数是3,大于之前默认的level =1;对于level2 和level3就要进行头结点赋值,temp[1]=header;temp[2]=header;

然后进行新节点的插入,之前遍历都是从高层向底层扩展,插入操作要从底层向高层扩展。

节点插入操作

插入操作之后,形成了temp[0]->next = 节点14,temp[1]->next = 节点14,temp[2]->next = 节点14即header[0]->next = 节点14,header[1]->next = 节点14,header[2]->next = 节点14;

14节点插入之后,链表长度+1(单指最底层的链表);

接着插入节点23,临时变量temp值为temp[0]= 节点14,temp[1] = 节点14,temp[2] = 节点14; 随机新的newlevel =1,说明23 只出现在level1层,进行插入后temp[0]->next = 节点23,其他两个节点不变。

插入节点34后,各层链表为

header[2]->14

header[1]->14->34

header[0]->14->23->34

以上就是插入的大致逻辑分析。

删除操作类似,先从上层开始向后遍历然后向下,删除时从下层开始向上操作。

跳表实现定时器demo源码地址:跳表实现定时器demo


红黑树:一颗节点非红即黑的平衡二叉树。epoll底层使用红黑树。

红黑树插入 查询,删除等基本操作时间复杂度为O(lgn),跳表搜索插入删除操作时间复杂度接近O(lgn),最坏情况下变成O(n)。

做范围查找的时候 ,平衡树比跳表操作要复杂,平衡树上,找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其他不超过大值的节点,相对而言,跳表的范围查询就比较简单,只要找到小值,在第一层链表进行若干层遍历就行。

从算法实现难度讲,跳表比红黑树要简单的多。

红黑树也是实现定时器的数据结构之一,具体实现不再详叙。

相关文章

  • 定时器实现 & 红黑树,跳表

    跳表:是为一个有序的链表建立多级索引的数据结构叫做跳表。redis中zset数据量大时底层数据结构使用跳表。 re...

  • 跳表 && 红黑树

    散列表:插入删除查找都是O(1), 是最常用的,但其缺点是不能顺序遍历以及扩容缩容的性能损耗。适用于那些不需要顺序...

  • Redis:跳表SkipList

    原文链接:SkipList 跳表 为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay...

  • skiplist

    跳表同时是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样...

  • 跳表

    跳表定义 在原有的有序链表上增加了多级索引,通过索引来实现类似二分查找的快速查找。 和红黑树的对比: 跳表的建立 ...

  • 跳表

    跳表 跳表,又叫做跳跃表、跳跃列表,在有序链表的基础上增加了“跳跃”的功能 设计的初衷是为了取代平衡树(比如红黑树...

  • LeetCode之Design Skiplist(Kotlin)

    问题: 方法:Hard难度的题目,含着泪照着题解写的代码,关键是要了解跳表这种数据结构,跳表和二叉树、红黑树都是二...

  • 跳表的简单实现

    跳表(SkipList)是一种检索效率非常高的数据结构,其检索效率经证明与红黑树相当。但是,轮到实现复杂度比较的时...

  • SkipList跳表

    一,概述 跳表是一个随机化的数据结构,可以被看做二叉树的一个变种,它在性能上和红黑树,AVL树不相上下,但是跳表的...

  • Redis深度历险-跳表

    Redis深度历险-跳表 跳表是一个比较经典的数据结构,非常有用但又不像红黑树那么复杂,非常值得学习;在Ridis...

网友评论

      本文标题:定时器实现 & 红黑树,跳表

      本文链接:https://www.haomeiwen.com/subject/btorjktx.html