有序集合zset
之前在使用redis的时候就发现redis的有序集合十分方便,再写关于排行类的统计存储时,用mysql十分麻烦,而用reids的有序集合就十分的方便,然后就想看看他的底层实现,而却发现他没有使用AVL,红黑树等实现,而是使用了一种叫做跳表的数据结构,却是一种十分的简单的数据结构
跳表
跳表是一种相对简单的平衡数据结构 跳表与AVL、红黑树等相比,数据结构简单,算法易懂,但查询的时间复杂度与平衡二叉树/红黑树相当。
跳表的原理#
跳跃表的思想来自于一篇论文:Skip Lists: A Probabilistic Alternative to Balanced Trees. 如果想要深入了解跳跃表,可以阅读论文原文。这里引用论文中的一幅图对跳跃表的原理作一个简单的说明。
其中
: a 表:单链表:查询时间复杂度O(n)
: b 表:level-2单链表:每隔一个节点为一个level-2节点,每个level-2节点有2个后继指针,分别指向单链表中的下一个节点和下一个level-2节点。查询时间复杂度为O(n/2)
: c 表:level-3单链表:每隔一个节点为一个level-2节点,每隔4个节点为一个level-3节点,查询时间复杂度O(n/4)
: d 表:指数式单链表:每2^i个节点的level为i+1,查询时间复杂度为O