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