1、redis 跳跃表是什么
跳表(Skiplist)是一个特殊的链表,相比一般的链表,有更高的查找效率,可比拟二叉查找树,平均期望的查找、插入、删除时间复杂度O(logn)。
数据结构均采用跳表这种数据结构:
- Redis中的有序集合zset
时间和空间分析
最坏场景:当每个元素的Tower的高度都是h的时候,查找、插入、删除的性能最差,为O(n+h), n为跳表的元素数目,h为跳表的高度。
空间占用:O(n)
跳表结构描述
跳跃表实际是一个有层数概念的双向链表。有头结点、尾结点、记录长度和层数。
头结点是傀儡结点,用来指向下一个结点。尾结点是指向跳跃表中最大分数的结点,层数是跳跃表中的最高层数。
跳表是基于链表的,在链表的基础上加了多层索引结构。在Redis的有序集合中就使用了跳表。
跳表是多层链表,最底层的链表包含所有的数据。越往上层,链表的结点越稀疏。但是,高层的结点一定包含在底层结点中。
跳表上层的元素来自最底层,是以随机函数来决定。随机函数0、1;当随机函数为1,代表该元素需要拷贝一份到上层节点。每一层级的概率的平均期望是 1/2,这个期望也是随机函数决定。
1.1 下面是一个跳表的示例
需要特别指出的是:针对数据中的每个节点,它应该创建几层的结构,是算法随机决定的。平均而言,1/2 个元素有两个索引, 1/4 个元素有三个索引,以此类推。
1.2 跳表的查询过程
1.3 跳表的插入
1.4 跳表的删除
1.5 跳表的结构体