跳表
跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。查找数时间复杂度为O(logN)。平衡二叉搜索树也是可以满足O(logN)的,但是跳表实现原理更简单。像Redis就使用了跳表和实现有序集合。
分析
跳表既然是可以进行二分查找的有序链表,那我们先看看一般的链表结构:
![d81fce32d3d93c0e9626653753e663c3.png](https://i-blog.csdnimg.cn/blog_migrate/0cbb360ad9376ec34ea228c3ee9da744.jpeg)
上图中这样一个链表,我们要查找元素的时间复杂度是多少了O(N),怎么样能达到O(logN)了,我们增加多级索引。
![1700720dbd73daaab374f9bb6e254611.png](https://i-blog.csdnimg.cn/blog_migrate/bcaf1c596384eb4f81a1494d9e1211e4.jpeg)
上图中,我们隔一个节点作为上级索引,是不是和平衡二叉树类似了。
所以说跳表示一个有序链表,并且每个元素可能会存在多层,每层上都是有序的链表。这样我们查找的时候就从最高层开始查找,以上面的例子为例,假如要找9,从3开始找,向右,12大于9,然后3移动到下一层,再向右,6小于9,继续向右,12大于9,移动到6下一层,向右就找到9了。
为什么说跳表是一个随机化的数据结构,因为每个元素的层次不是固定的,而是随机生成的。
实现方式
1、首先创建跳表节点,有两个变量,一个value是该节点的值,一个该节点对应层上下一个节点
![f470f603c188e6ff12b09fc746c1aea2.png](https://i-blog.csdnimg.cn/blog_migrate/2afccc69abcdd1612a2dbcdb45ff7434.jpeg)
![2628ad8a4d50540ea46cfaf1793c3fd9.png](https://i-blog.csdnimg.cn/blog_migrate/807b118c67327f5a8e605f2a7b483021.jpeg)
2、初始化跳表,跳表head节点值都为null,maxLevel记录最大层数
![0e21ea2692d367cdace79fa03cf0472a.png](https://i-blog.csdnimg.cn/blog_migrate/16d3cc20c1c8ec3a8576467be04e747d.jpeg)
![15ed7527fb9b88dc5d02de084ac86c28.png](https://i-blog.csdnimg.cn/blog_migrate/730f4ff5d822dbeee621b9d33f07f3c6.jpeg)
3、跳表中添加元素的方法。
3.1、 生成元素的层数,这里是随机生成的,生成新节点
3.2、如果层数比最大层都要大,则把head节点的层数扩充到最大,因为head节点是包含所有层
3.3、从head节点的最高层开始查找,查找下个节点
3.4、把下个节点作新节点的下个节点,并把当前节点的下个节点设置为新节点
3.5、每次循环完一层就需要向下一层继续循环
![2c4221aaf270b669095bd6bdafacb1cb.png](https://i-blog.csdnimg.cn/blog_migrate/ec9fb0aa91560ec9c0b57139e03e813c.jpeg)
怎么查找下个节点了:
一直向右查找,查找到比新节点值大的节点,或者下个值为null
![ee3fdf48d78424f8a59ce9780a708342.png](https://i-blog.csdnimg.cn/blog_migrate/114d84c326921fe6a6223054b421dfe2.jpeg)
总结
上面就是整个跳表的结构,是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。通过增加多级索引实现查找、插入、删除的平均复杂性均为O(logN)。
希望对大家有所帮助,有帮助记得点赞哦!可以关注下,后面持续分享编程类的文章,谢谢!