当前位置:网站首页>【学习笔记】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),但红黑树插入、删除后需要进行调整,操作较为复杂,而跳表只需要插入节点的相邻节点
- 跳表更适合进行范围查询,只要找到范围的最小值,然后在第一层遍历即可
- 跳表的整体实现要比红黑树简单
边栏推荐
- EF框架简介
- Knowing things by learning | app slimming down, the way of safety reinforcement under the new generation AAB framework
- Dbeaver connection MySQL error: the server time zone value 'Ö Ð¹ ú±ê ×¼ ʱ ¼ ä‘ is unrecognized or represents more than
- SQL Server连接到服务器无效的解决办法
- Configuration and basic use of vim
- Machine learning: IOU of concept understanding
- golang 自定义once,当出现error第二次重新设置
- 卷积神经网络——YOLOV2(YOLO9000)论文翻译
- 知物由学 | 再造巴别塔,我们如何进行NLP跨语言知识迁移?
- Profiles vs Permission Sets
猜你喜欢

卷积神经网络——从R-CNN,Fast R-CNN到Faster R-CNN,Mask R-CNN

最新大厂高级面试题 必备

Convolutional neural network -- Introduction to FPN (feature pyramid networks)

Introduction to ef framework

canvas根据坐标点绘制图形

使用分布式框架WCF出现的BUG记录

The global cloud market is growing rapidly, and data security has entered a strong regulatory era of rule of law

Evaluation index of machine learning (I) -- regression evaluation index

微信小程序 实现位置地图显示,引入map地图,不含导航

2022 safety officer-c certificate special operation certificate examination question bank and answers
随机推荐
面试常见问题一二
vue使用keep-alive实现页面缓存
最新大厂高级面试题 必备
IDEA打包war包与war包位置
Are those who are absent from the written examination shortlisted for the teacher recruitment interview? Henan Xiangfu: the statistics of individual candidates' scores are wrong
机器学习之评价指标(一)——回归评价指标
知物由学 | APP大瘦身,新一代AAB框架下的安全加固之道
多线程实现循环
mysql解决唯一索引重复导致的插入失败问题
【Codeforces】 B. Make it Divisible by 25
Evaluation index of machine learning (I) -- regression evaluation index
JSP custom tag (bottom)
What are the safety risks of small games?
Es query limit 10000 data solutions
Kubernetes 1.24 high availability cluster binary deployment
Interview FAQs 12
[MCU] 2.3 CPU of AT89S52
Yanrong technology was selected as Beijing's "specialized and innovative" in 2022 to lead hybrid cloud file storage
施耐德电气、欧莱雅等企业巨头如何开放式创新?DEMO WORLD世界创新峰会揭秘
Wechat applet realizes location map display and introduces map map without navigation