跳跃表原理和实现

简介: 跳跃表原理和实现 前提 有时候会被问到链表如果做到二分搜索,可能会有部分的人会去把链表中的值保存到数组来进行二分,但是如果知道跳跃表的话,那么这个数据结构就可以解决这个困惑,它允许快速查询一个有序连续元素的数据链表,它的效率可以做到和二分相同,都是O(logn)的平均时间复杂度,其空间复杂度为O(n)。

跳跃表原理和实现

前提

有时候会被问到链表如果做到二分搜索,可能会有部分的人会去把链表中的值保存到数组来进行二分,但是如果知道跳跃表的话,那么这个数据结构就可以解决这个困惑,它允许快速查询一个有序连续元素的数据链表,它的效率可以做到和二分相同,都是O(logn)的平均时间复杂度,其空间复杂度为O(n)。

跳跃列表是在很多应用中有可能替代平衡树而作为实现方法的一种数据结构。跳跃列表的算法有同平衡树一样的渐进的预期时间边界,并且更简单、更快速和使用更少的空间。----by 发明者像是redis中有序集合就使用到了跳跃表。

原理

性质

首先,应该要了解跳跃表的性质;

  1. 由很多层结构组成;
  2. 每一层都是一个有序的链表,排列顺序为由高层到底层,都至少包含两个链表节点,分别是前面的head节点和后面的nil节点;
  3. 最底层的链表包含了所有的元素;
  4. 如果一个元素出现在某一层的链表中,那么在该层之下的链表也全都会出现(上一层的元素是当前层的元素的子集);
  5. 链表中的每个节点都包含两个指针,一个指向同一层的下一个链表节点,另一个指向下一层的同一个链表节点;

可以看到,这里一共有4层,最上面就是最高层(Level 3),最下面的层就是最底层(Level 0),然后每一列中的链表节点中的值都是相同的,用指针来连接着。跳跃表的层数跟结构中最高节点的高度相同。理想情况下,跳跃表结构中第一层中存在所有的节点,第二层只有一半的节点,而且是均匀间隔,第三层则存在1/4的节点,并且是均匀间隔的,以此类推,这样理想的层数就是logN。

搜索

其基本原理就是从最高层的链表节点开始,如果比当前节点要大和比当前层的下一个节点要小,那么则往下找,也就是和当前层的下一层的节点的下一个节点进行比较,以此类推,一直找到最底层的最后一个节点,如果找到则返回,反之则返回空。

代码实现大致为:

find(x)   
{  
    p = top; while (1) { while (p->next->key < x) p = p->next; if (p->down == NULL) return p->next; p = p->down; } } 

插入

既然要插入,首先需要确定插入的层数,这里有不一样的方法。1. 看到一些博客写的是抛硬币,只要是正面就累加,直到遇见反面才停止,最后记录正面的次数并将其作为要添加新元素的层;2. 还有就是一些博客里面写的统计概率,先给定一个概率p,产生一个0到1之间的随机数,如果这个随机数小于p,则将高度加1,直到产生的随机数大于概率p才停止,根据给出的结论,当概率为1/2或者是1/4的时候,整体的性能会比较好(其实当p为1/2的时候,也就是抛硬币的方法)。

当确定好要插入的层数以后,则需要将元素都插入到从最底层到第k层。

删除

在各个层中找到包含指定值的节点,然后将节点从链表中删除即可,如果删除以后只剩下头尾两个节点,则删除这一层。

谋胆并重
目录
相关文章
|
2月前
|
NoSQL 算法 Java
数据结构之跳表理解
数据结构之跳表理解
55 0
|
3月前
|
存储 NoSQL Redis
Redis数据结构之——跳表skiplist
Redis数据结构之——跳表skiplist
|
7月前
|
存储 NoSQL 算法
Redis中ZSet的底层数据结构跳跃表skiplist,你真的了解吗?
Redis中ZSet的底层数据结构跳跃表skiplist,你真的了解吗?
|
9月前
|
存储 机器学习/深度学习 算法
数据结构之数组、链表、跳表——算法与数据结构入门笔记(三)
数据结构之数组、链表、跳表——算法与数据结构入门笔记(三)
|
10月前
|
NoSQL Redis 索引
【数据结构】跳表
【数据结构】跳表
52 0
|
11月前
|
存储
【数据结构】单向链表的原理及实现
【数据结构】单向链表的原理及实现
【数据结构】单向链表的原理及实现
|
11月前
|
数据库 索引
【数据结构】二叉树的原理及实现
【数据结构】二叉树的原理及实现
【数据结构】二叉树的原理及实现
|
存储 算法 NoSQL
常见数据结构-跳表
常见数据结构-跳表
|
算法 Go 数据库
数据结构和算法-单链表的有序插入|学习笔记
快速学习数据结构和算法-单链表的有序插入
122 0
数据结构和算法-单链表的有序插入|学习笔记
|
存储 算法 NoSQL
比红黑树更快的跳表到底是什么数据结构?如何实现?
比红黑树更快的跳表到底是什么数据结构?如何实现?
比红黑树更快的跳表到底是什么数据结构?如何实现?