跳表(Skiplist)

原创 2016年05月30日 16:18:18

跳表是一种随机化的数据结构,基于并联的链表,它的查找效率可以红黑树相提并论(对于大多数操作需要O(log n)平均时间)。基本上,跳表是对有序的链表增加上附加的前进链接,增加十一随机化的方式进行的,所以在链表中的查找可以快速的跳过一部分链表,因此得名。所有操作都以对数的随机化时间进行。具体见图例

跳表

定义

从上面的图中我们可以看出,跳表主要由以下的几个部分来组成:

  • 表头(head):负责维护跳跃表的节点指针。
  • 跳跃表节点:保存元素值,以及多个层。
  • 层:保存着指向其他元素的指针。高层的指针越过的元素数量大于底层的指针,为了提高查找效率,程序总是从高层开始查找,然后随着元素值范围的缩小,慢慢层次降低。
  • 表尾:全部由NULL组成,表示跳表已经到了末尾。

正是由于跳表这样的定义,它具有下面的几个特征:

  1. 一个跳表应该有几层组成。
  2. 跳表的最底层(也就是第一层)包含所有的元素。
  3. 每一层都是一个有序的链表。
  4. 如果元素x出现在滴i层,则所有比i小的层都包含x

具体的描述

既然已经大致的介绍的跳表是一个什么鬼,那么下一步我们看一看它到底怎么使得查找效率和红黑树一样的。

从上面我们知道跳表是按照层来建造的,底层就是一个普通的有序链表。每个更高层都充当下面链表的『快速跑道』,这里在第i层中元素按照某个固定的概率p(通常为0.5或者0.25)出现在第i+1层中,平均起来,每个元素都在1/(1-p)个链表中出现,而最高层的元素(通常是在跳表前端的一个特殊的头元素)在O(log1/p(n))个链表中出现。

1
1-----4---6
1---3-4---6-----9
1-2-3-4-5-6-7-8-9-10

要查找一个目标元素,起步于头元素和顶层链表,并沿着每个链表搜索,直到到达小于或者等于目标的最后一个元素,如果等于直接返回,如果小于,则跳到这个节点的下一层链表继续查找。

插入和删除的实现基本和相应的链表的操作类似,除了『高层』元素必须咋多个链表中插入和删除之外。

跳表不像某些传统的平衡树数据结构那样提供绝对的最坏情况性能保障,因为用来建造跳表的扔硬币方法总有可能(尽管概率很小)生成一个非常糟糕的不平衡结构。但是在实际中的大部分情况下,它效率不错;最重要的是随机化的平衡方案比在平衡二叉查找树中用的确定性平衡方案更『容易实现』。

实现步骤

  1. 给定一个有序的链表。
  2. 选中链表中最大和最小的元素,然后从其他元素中按照一定概率随机选出一些元素,将这些元素组成有序的链表。这个新的链表称为一层,原链表称为其下一层。
  3. 为刚选出的每个元素添加一个指针域,这个指针指向下一层中值同自己相等的元素。TOP指针指向该层首元素。
  4. 重复2,3步,知道不能选择出做大最小元素以外的元素。

C与C++实现

参考文献

维基百科
Skip List(跳跃表)原理详解与实现
Redis设计与实现–跳表

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

跳表(skiplist)Java实现

skiplist跳表C++实现

SkipList跳表基本原理

(2012-10-17 19:04:14) 转载▼ 标签: 杂谈 分类: 技术荟萃 为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑...

skiplist 跳表C++实现

  • 2012-10-08 14:25
  • 26KB
  • 下载

SkipList跳表

SkipList 跳表 博客分类:  algorithms 为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。...

skiplist 跳表详解及其编程实现

skiplist介绍 跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(logN)。 跳表的具体定义,请参考参考维基百科 点我,中文版。跳...

数据结构 跳表SkipList的原理和代码实现

跳表简介跳表是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。我们知道,普通单链表查询一个元素的时间...

跳表SkipList

1.聊一聊跳表作者的其人其事 2. 言归正传,跳表简介 3. 跳表数据存储模型 4. 跳表的代码实现分析 5. 论文,代码下载及参考资料  . 聊一聊作者的其人其事  跳表是由...

跳表 SkipList(一)基本原理

转载于 http://kenby.iteye.com/blog/1187303 为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。...
  • hunci
  • hunci
  • 2015-12-07 10:29
  • 200

Go语言实现跳表(SkipList)

跳表(skiplist)在redis/levelDB中属于核心数据结构,我简单粗暴的用Golang实现了下。 就我的简单理解来说,就一个普通的链表,在insert时,通过Random_level(),...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)