今天,我们来看一种数据结构,它可以快速地查找、插入、删除。据说可以替代红黑树。据说Redis中的有序集合就是用它来实现的。它就是跳表。初学者学数据结构应该都没有听说过,课本也没有出现过这种数据结构过。下面我们一起来看看吧
一.定义
1.跳表,又叫做跳跃表、跳跃列表,在有序链表的基础上增加了“跳跃”的功能
2.跳表在原来的有序链表上加上了多级索引,通过索引来快速查找;可以支持快速的删除、插入和查找操作。
3.跳表实际上是一种增加了前向指针的链表,是一种随机化的数据结构
4.Redis中 的 SortedSet、LevelDB 中的 MemTable 都用到了跳表
5.对比平衡树, 跳表的实现和维护会更加简单, 跳表的搜索、删除、添加的平均时间复杂度为O(logn)
二.数据结构图型
三.跳表的搜素
跳表查找任意数据的时间复杂度为O(logn)
- 从顶层链表的首元素开始,从左往右搜索,直至找到一个大于或等于目标的元素,或者到达当前层链表的尾部
- 如果该元素等于目标元素,则表明该元素已被找到
- 如果该元素大于目标元素或已到达链表的尾部,则退回到当前层的前一个元素,然后转入下一层进行搜索
四.跳表的插入
五.跳表的删除
跳表的删除操作时间复杂度为:O(logn),支持动态的删除。在跳表中删除某个结点时,如果这个结点在索引中也出现了,我们除了要删除原始链表中的结点,还要删除索引中的。因为单链表中的删除操作需要拿到删除结点的前驱结点,然后再通过指针操作完成删除。所以在查找要删除的结点的时候,一定要获取前驱结点(双向链表除外)。因此跳表的删除操作时间复杂度即为O(logn)。
六.跳表索引动态更新
- 当我们不断地往跳表中插入数据时,我们如果不更新索引,就有可能出现某2个索引节点之间的数据非常多的情况,在极端情况下,跳表还会退化成单链表
跳表是通过随机函数来维护“平衡性”。
- 当我们在跳表中插入数据的时候,我们通过选择同时将这个数据插入到部分索引层中,如何选择索引层,可以通过一个随机函数来决定这个节点插入到哪几级索引中,比如随机生成了k,那么就将这个索引加入到,第一级到第k级索引中。
七.跳表的性质
1.跳表由很多层结构组成,level是通过一定的概率随机产生的;
2.每一层都是一个有序的链表,默认是升序 ;
3.最底层(Level 1)的链表包含所有元素;
4.如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出现;
5.每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。
好啦,关于跳表的内容就分享到这啦
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.