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

Posted 阿玛尼迪迪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析SkipList跳跃表原理及代码实现相关的知识,希望对你有一定的参考价值。

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跳跃表原理及代码实现的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

SkipList (跳跃表)解析及其实现

skiplist 跳跃表

Redis跳跃表原理分析与基本代码实现(java)