浅析skiplist跳跃表原理及代码实现

阿玛尼迪迪 阿玛尼迪迪     2022-10-02     173

关键词:

SkipList在Leveldb以及lucence中都广为使用,是比较高效的数据结构。由于它的代码以及原理实现的简单性,更为人们所接受。首先看看SkipList的定义,为什么叫跳跃表?


"Skip lists  are data structures  that use probabilistic  balancing rather  than  strictly  enforced balancing. As a result, the algorithms  for insertion  and deletion in skip lists  are much simpler and significantly  faster  than  equivalent  algorithms  for balanced trees."

译文:跳跃表使用概率均衡技术而不是使用强制性均衡,因此,对于插入和删除结点比传统上的平衡树算法更为简洁高效。


我们看一个图就能明白,什么是跳跃表,如图1所示:

如上图所示,是一个简单的跳跃表。传统意义的单链表是一个线性结构,向有序的链表中插入一个结点需要O(n)的时间,查找操作需要O(n)的时间。如果我们使用图1所示的跳跃表,就可以减少查找所需时间为O(n/2),因为我们可以先通过每个结点的最上面的指针进行查找,这样子就能跳过一半的结点。比如我们想查找19,首先和6比较,大于6之后,再和9进行比较,然后再和12进行比较...... 最后比较到21的时候,发现21大于19,说明查找的点在17和21之间,从这个过程中,我们可以看出,查找的时候跳过了3、7、12等点,因此查找的复杂度为O(n/2)。查找的过程如下图2:

 

其实,上面基本上就是跳跃表的思想,每一个结点不单单只包含指向下一个结点的指针,可能包含很多个指向后续结点的指针,这样就可以跳过一些不必要的结点,从而加快查找、删除等操作。对于一个链表内每一个结点包含多少个指向后续元素的指针,这个过程是通过一个随机函数生成器得到,这样子就构成了一个跳跃表。这就是为什么论文"Skip Lists:A Probabilistic Alternative to Balanced Trees"中有“概率”的原因了,就是通过随机生成一个结点中指向后续结点的指针数目。随机生成的跳跃表可能如下图3所示:

 

跳跃表的大体原理,我们就讲述到这里。下面我们将从如下几个方面来探讨跳跃表的操作:

1、重要数据结构定义

2、初始化表

3、查找

4、插入

5、删除

6、随机数生成器

7、shi‘fang‘bi释放表

8、性能比较

 

(一)重要数据结构定义

从图3中,我们可以看出一个跳跃表示由结点组成,结点之间通过指针进行连接。因此我们定义如下数据结构:

跳跃表skiplist数据结构原理及实现

为什么选择跳表目前经常使用的平衡数据结构有:B树,红黑树,AVL树,SplayTree,Treep等。想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗?很难... 查看详情

skiplist(跳表)的原理及java实现

...呢? "Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得 查看详情

跳跃表skiplist数据结构原理及实现

...理相当简单,只要你能熟练操作链表,就能轻松实现一个SkipList。有序表的搜索考虑一个有序表:从该有序表中搜索元素<23,43,59>,需要比较的次数分别为<2,4,6>,总共比较的次数为2+4+6=12次。有没有优化的算法吗?链表是... 查看详情

skiplist(跳跃表)解析及其实现(代码片段)

目录导言查找结点的效率如何提升?什么是跳跃表?跳跃表必须是完美的?预备知识抛硬币实验模拟建表操作解析伪代码代码实现柔性数组跳跃表的创建与销毁跳跃表表头结构体定义跳跃表结点结构体定义建立跳跃表表头操作操... 查看详情

数据结构——跳跃表(代码片段)

跳跃表介绍跳跃表(skiplist)是一种随机化的数据结构,是一种可以与平衡树媲美的层次化链表结构——查找、删除、添加等操作都可以在对数期望时间下完成,以下是一个典型的跳跃表例子:到底有多随机&#x... 查看详情

详解skiplist跳跃链表含代码(代码片段)

...更少,应用更加广泛,比如广泛使用的Redis就有用到它。SkipList简介SkipList是一个实现快速查找、增删数据的数据结构,可以做到(O(logN))复杂度的增删查。从时间复杂度上来看,似乎和平衡树差不多,但是和平衡树比较起来,它的... 查看详情

浅析线性表的原理及简单实现

一、线性表原理:零个或多个同类数据元素的有限序列原理图:特点: 1、有序性2、有限性3、同类型元素4、第一个元素无前驱,最后一个元素无后继,中间的元素有一个前驱并且有一个后继线性表是一种逻辑上的数据结构... 查看详情

skiplist-跳跃表详注,常数小(代码片段)

跳跃表详注具体看注释代码luoguP3369:https://www.luogu.org/recordnew/show/117824191#include<bits/stdc++.h>2#definerepeat(a,b,c,d)for(inta=b;a<=c;a+=d)3usingnamespacestd;4structnode5intnxt,dwn,jmp,val;6a[ 查看详情

跳跃表的原理及实现

1.跳跃表的原理      学过数据结构的都知道,在单链表中查询一个元素的时间复杂度为O(n),即使该单链表是有序的,我们也不能通过2分的方式缩减时间复杂度。      如上图,我们要查询元素为55的结点... 查看详情

数据结构——跳跃表(代码片段)

...找与删除随机化的方法实现代码跳跃表介绍跳跃表(skiplist)是一种随机化的数据结构,是一种可以与平衡树媲美的层次化链表结构——查找、删除、添加等操作都可以在对数期望时间下完成,以下是一个典型的... 查看详情

探索skiplist(跳跃表)

附WilliamPugh的论文《SkipLists:AProbabilisticAlternativetoBalancedTrees》写在前面以下内容针对的是SkipList的插入和删除,建议你先到其他地方大概了解一下SkipList长什么样子的,然后再过来看看这篇,最好还是看一眼论文先,部分挺容易看... 查看详情

跳跃表(skiplist)

参考技术A我们知道二叉搜索算法能够高效的查询数据,但是需要一块连续的内存,而且增删改效率很低。跳表,是基于链表实现的一种类似“二分”的算法。它可以快速的实现增,删,改,查操作。当我们要在该单链表中查找... 查看详情

skiplist跳跃表

 引子考虑一个有序表:14->23->34->43->50->59->66->72从该有序表中搜索元素<23,43,59>,需要比较的次数分别为<2,4,6>,总共比较的次数为2+4+6=12次。有没有优化的算法吗? 链表是有序的,但不能使用二分查... 查看详情

redis底层解析跳跃表(代码片段)

跳跃表1.简介跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数... 查看详情

死磕redis-----redis数据结构:skiplist(代码片段)

原文:https://www.cmsblogs.com/category/1391389927996002304『chenssy』关于跳跃表其实在JUC里面有一个并发容器就是利用跳跃表来实现的:ConcurrentSkipListMap(【死磕Java并发】—–J.U.C之Java并发容器:ConcurrentSkipListMapÿ 查看详情

每日一博-如何理解跳表(skiplist)

文章目录什么是跳跃表SkipList什么是跳跃表SkipList跳跃表(简称跳表)由美国计算机科学家WilliamPugh于1989年发明论文:Skiplists:aprobabilisticalternativetobalancedtrees跳表(SkipList,全称跳跃表)是用于有序元素序列快速搜索查找的一个... 查看详情

浅析springboot自动配置的原理及实现(代码片段)

目录Spring-Boot的自动配置功能是什么?  1.什么是spring-Boot?  2.spring-Boot的自动配置功能Spring-Boot自动配置核心注解  1.@SpringBootApplication 小结:Starter依赖的原理-以Mybits为例 1.spring.factories2.MybatisAutoConfigu 查看详情

redis源码解析之跳跃表

跳跃表(skiplist)有序集合(sortedset)是Redis中较为重要的一种数据结构,从名字上来看,我们可以知道它相比一般的集合多了一个有序。Redis的有序集合会要求我们给定一个分值(score)和元素(element),有序集合将根据我们给... 查看详情