当前位置:网站首页>【学习笔记】Redis中有序集合zset的实现原理——跳表
【学习笔记】Redis中有序集合zset的实现原理——跳表
2022-07-27 15:58:00 【棉花糖灬】
面试的时候被问到了有序集合zset的实现原理,本以为是基于红黑树实现的,其实是基于跳表(skipList)实现的。本文主要讲解什么是跳表,它是怎么查找、插入和删除元素的,相比于红黑树它有哪些优劣。
本文参考了文章redis中的Zset原理。
1. 跳表
(1) 跳表是什么
跳表是一种多层的有序链表。先考虑一种特殊情况下的跳表,如下图所示。从底往上分别是第1~4层,第1层用链表有序地存放所有元素,然后从第 i i i 层每隔1个元素取一个元素形成第 i + 1 i+1 i+1 层的有序链表,并增加第 i + 1 i+1 i+1 层链表节点指向第 i i i 层对应节点的指针。这样的话,第 i + 1 i+1 i+1 层链表节点个数为第 i i i 层的一半。

在实际实现时,每一列并不是分成多个链表节点,而是如下图所示的样子,一个节点对应上图中的一列,在一个节点中设置多个指向其下方和右方节点的指针。这样只用增加指针而避免了节点值的重复存储。只是上图中这种表示方式更容易理解一点。

(2) 跳表的查询

还是看上面这个图,如果要搜索46,从高层往下依次搜索。
- 第4层:从头节点搜索一次,找到55,46比55小,故从头节点的位置往下层搜索;
- 第3层:从头节点搜搜一次,找到21,46比21大,继续往后搜索找到55,46比55小,故从21的位置往下层搜索;
- 第2层:从21节点搜索一次,找到37,46比37大,继续往后搜索找到55,46比55小,故从37的位置往下层搜索;
- 第1层:从37节点搜索一次,找到46,恰为要找的节点,且已经到最底层,搜索结束。
可以发现,搜索的平均时间复杂度为O(log n),这是由于每在上层搜索一次就平均缩小了一半的搜索范围。
(3) 跳表的插入
在插入元素时,先找到要插入元素的位置,然后进行插入。但是如果采用前面说的从第 i i i 层每隔1个元素取一个元素形成第 i + 1 i+1 i+1 层的有序链表的方式的话,就需要插入后进行调整,这样比较麻烦。所以在实际实现时,采用了一种随机确定要插入元素的高度的方法,即第1层一定会插入,所以节点高度最小值为1,节点高度为2的概率为0.5,高度为3的概率为0.25……这样就保证了第 i + 1 i+1 i+1 层链表节点个数约为第 i i i 层的一半。高度随机算法的代码如下:
int random_level()
{
level = 1;
# 随机生成0或1,若为1则level++,反之结束循环
while(random(0,1))
{
level++;
}
return level;
}
更具体地,类似于查询的过程,从最高层到最底层依次查询到新增节点要插入的位置,如果当前层的高度小于等于新增节点高度,则进行插入。整个插入的平均时间复杂度为O(log n)。
(4) 跳表的删除
与插入操作类似,不再赘述
2. 与红黑树的对比
相比于红黑树,跳表的优点有:
- 查询复杂度两者相同,都为O(log n)
- 插入和删除的时间复杂度两者相同,都为O(log n),但红黑树插入、删除后需要进行调整,操作较为复杂,而跳表只需要插入节点的相邻节点
- 跳表更适合进行范围查询,只要找到范围的最小值,然后在第一层遍历即可
- 跳表的整体实现要比红黑树简单
边栏推荐
- In the first week of June, risk control of e-shield business paid attention to 15 institutions such as New Oriental XRS, which were fined
- Common shell commands (1) -- variable case conversion
- Count the six weapons of the domestic interface cooperation platform!
- Understand JVM language
- 知物由学 | APP大瘦身,新一代AAB框架下的安全加固之道
- 卷积神经网络——SSD论文翻译
- 微信小程序 实现拨打电话
- [introduction to database system (Wang Shan)] Chapter 11 concurrency control
- WebDriverException( selenium.common.exceptions.WebDriverException: Message: ‘chromedriver‘ executabl
- Bubble sorting in JS
猜你喜欢

快速获取网站媒体资源方法

登录页面tableLayout(表格布局)

7月第4周易盾业务风控关注 | 最高法对APP强索个人信息进行规制
How to improve the security of Android applications?

The latest advanced interview questions for big factories are necessary

How difficult the interview is! I was forced to survive the six rounds of interview of ant financial! Almost out (interview resumption)

Machine learning: IOU of concept understanding

微信小程序 云函数批量删除多条数据 Error: errCode: -502005 database collection not exists
知物由学 | SO加固如何提升Android应用的安全性?

The global cloud market is growing rapidly, and data security has entered a strong regulatory era of rule of law
随机推荐
Fast analysis combined with Haidian medicine
面试常见问题一二
WebDriverException( selenium.common.exceptions.WebDriverException: Message: ‘chromedriver‘ executabl
MySQL adds users and grants query only permission
登录页面tableLayout(表格布局)
vim的配置及基础使用
jpa连接数据库password字段BLOB
golang chan实现互斥锁
XStream reports an error abstractreflectionconverter$unknownfield exception when parsing XML
CPU introduction
[introduction to database system (Wang Shan)] Chapter 5 - database integrity
微信小程序 实现拨打电话
js实现右键菜单栏功能
机器学习之评价指标(一)——回归评价指标
年终总结模板
Personal understanding of convolution calculation process of convolution neural network
Six relationships of classes -- the difference between dependency and Association
Fast parsing combined with Huatu document encryption software
How can we carry out NLP cross language knowledge transfer?
hutool- 数组工具