跳表与Redis

跳表原理

跳表是Redis有序集合ZSet底层的数据结构

首先有一个头结点 这个头结点里面的数据是null 就是他就是这个链表的最小值 就算是Math.Min也比它大

然后我们新建一个节点的时候是怎么操作的呢 先根据参数(假如说是5)创建一个节点 然后把它放在对应位置 就是找到小于他的最大节点 然后把它放在这个小于他的最大节点后面 我们当前只有一个null节点 而且它是最小的 所以直接放在他后面就行了

然后我们开始提高它的"高度" 这个层数最小为1 剩下的我们用抛硬币的方式决定 如果为正面就加一层 如果背面就不加(当然计算机底层肯定不是抛硬币 是随机算法实现的)

假如说我们在决定五的层数的时候 两次判定都是正面 那他的高度就是3

三层就是三条路 这个路是用来连接下一个节点的(就跟链表似的 只不过链表只有一条路)一会你就知道为啥了

然后呢 这个null的高度 永远要和最高的节点的高度是一致的 他刚开始是0 现在要变成3

然后我们还想加一个6节点 找到比它小的最大节点 是5 那就插在5后面

然后我们随机它的高度 假如说高度是1

哎 看懂没 这个6的高度是1 那么5的上面两条路就连不到它了 直接干后面去了

再来一个高度为5的3节点

比三小的最大节点就是null

所以

哎 记得null节点要同步

再插一个7节点

查找节点

假如说查找节点6

先从null的最上层出发 找到3 3<6 还得往右走 再往右走空了

所以3往下走一个 再往右走 走到7 7>6 那还得在3往下走一层

3 走到了 5 5<6 那就停在这一层 5再往右走是7 7>6 不行

5再往下走 不行

5再往下走 找到了6

总结一下 查找一个节点 就是能往右走就往右走 往走走不了就往下走 再往右走

它的时间复杂度为O(logN) 最差复杂度为O(N)

Redis中的跳表

Redis中的跳表相较于经典跳表

1.有重复值

2.最底层有回退指针

3.随机高度+1的概率是百分之25

4.有最大层数限制 Redis 5.0是64层,在Redis 7.0是32层

QS

1.跳表是什么,和普通的链表有什么区别?

跳表算是特殊的链表 他比链表的层数高 可以实现log(N)的查找效率

2.跳表插入数据会影响其它节点层高吗?

就会影响第一个null节点

相关推荐
庸子2 分钟前
MySQL从入门到DBA深度学习指南
数据库·mysql·dba
cookqq7 分钟前
mongodb源码分析session执行handleRequest命令find过程
数据库·sql·mongodb·nosql
Bro_cat9 分钟前
MongoDB 入门指南:安装、配置与 Navicat 连接教程
数据库·mongodb
不太可爱的大白13 分钟前
洞悉 MySQL 查询性能:EXPLAIN 命令 type 字段详解
数据库·mysql
l1t1 小时前
DeepSeek辅助实现的DuckDB copy to自定义函数
数据库·c++·人工智能
懵逼的小黑子1 小时前
mysql修改字段类型
数据库·mysql
Tapdata1 小时前
拒绝停服,随时回退:MS SQL 到 ≈ 的无缝数据库双向迁移方案
数据库
失败又激情的man1 小时前
python爬虫之数据存储
前端·数据库·python
遗忘妳2 小时前
mysql高可用
数据库·mysql
小灰灰搞电子2 小时前
Qt多线程访问同一个数据库源码分享(基于Sqlite实现)
数据库·qt·sqlite