为什么 Zset 的实现用跳表而不用平衡树(如 AVL树、红黑树等)?

zset的实现原理:
https://marticles.github.io/2019/03/19/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Redis-Zset%E5%8E%9F%E7%90%86/

redis作者给出的三点:
1.从内存占用来说,跳表比平衡树更灵活
平衡树每个节点包含两个指针,分别指向左右节点
跳表每个节点包含的指针数目取决于概率p,是1/(1-p)
redis取的p是1/4,那么平均每个节点包含1.33个指针。
比平衡树更有优势。

2.跳表在范围查找的时候,比平衡树要简单
平衡树上,找到指定范围的最小值之后,还需要中序遍历继续找不超过最大值的节点
而在跳表上进行范围查找,比较简单,只要找到最小值之后,对第一层链表进行若干步的遍历就可以实现

3.算法实现难度上,跳表比平衡树简单
平衡树的插入和删除,可能引发子树的调整,逻辑复杂
跳表的插入和删除,只需要修改相邻节点的指针,简单。

p的解释:
跳表在创建节点时候,会生成范围为[0-1]的一个随机数,如果这个随机数小于 0.25(相当于概率 25%),那么层数就增加 1 层,然后继续生成下一个随机数,再判断是否继续增加层数,当生成的随机数大于或等于0.25时,停止生成新的层数,最终确定该节点的层数。

例子:
假设我们希望生成一个节点的层数,设定阈值为 0.25。

第一次生成的随机数是 0.2,小于 0.25,层数增加 1 层。
第二次生成的随机数是 0.3,大于或等于 0.25,结束。
结果:该节点最终层数为 1。

跳表节点定义:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值