码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-11-25 15:25:12      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:比较   随机函数   enforce   ldb   为什么   level   强制   论文   skip list   

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跳跃表原理及代码实现

标签:比较   随机函数   enforce   ldb   为什么   level   强制   论文   skip list   

原文地址:http://www.cnblogs.com/codingmengmeng/p/7890903.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!