算法合集之《线段跳表——跳表一个拓展》.pdfVIP

  • 33
  • 0
  • 约1.47万字
  • 约 16页
  • 2017-06-04 发布于湖北
  • 举报

算法合集之《线段跳表——跳表一个拓展》.pdf

线段跳表——跳表的一个拓展 2009 年冬令营论文 李骥扬 线段跳表——跳表的一个拓展1 石家庄二中 李骥扬 摘要 本文主要介绍我对跳表(跳跃表,Skip Lists, SL,1987年由William Pugh 发明)的一个拓展:线段跳表(Segment Skip Lists,SSL)以及相关的效率证明。 并简要分析跳表及其拓展在信息学竞赛中的优势。 关键词 跳表 平衡树 线段跳表 线段树 引言 在信息学竞赛中,数据结构是重要的一部分。通常考察我们维护、处理数据 的能力。这类题目常常要求我们维护一个线性有序的结构,并对其进行插入查询 等操作,常用的实现方式有平衡树、块状链表、树状数组等。 跳表是一种新型数据结构,支持有序表的插入、删除、查找等字典操作。跳 表基于随机化和概率,插入、删除、查找操作的期望时间复杂度均为O(log N) 。 同时由于其线性表的本质,具有编写简单,易于拓展的性质。它能代替平衡树实 现字典操作。且由于其结构简单,不需要旋转操作,跳表支持将各部分存放在不 同介质上,进行并行操作。2 但是基本的跳表只支持插入、删除、查找的字典操作,并不支持区间操作。 跳表的能力绝不限于此,只要更深入地分析一下跳表的结构,我们就能从跳表中 得到一棵二叉树的结构。进而添加区间信息,得到线段树。本文将通过对插入、 删除操作的升级,使得这些操作能够维护区间信息。 拓展后的跳表,称为线段跳表,能够完全替代各类平衡树,支持字典操作和 区间操作。同时保持了其原有特点,简单易用,还支持顺序操作等特殊操作。线 段跳表将成为信息学竞赛中的理想数据结构。 1 本文讨论跳表的范围仅限于基于期望的随机跳表(Skip Lists,SL),不涉及确定性跳表(1-2-3 Deterministic Skip List,1-2-3 DSL)的内容。 2 相关内容参见William Pugh 的《CONCURRENT MAINTENANCE OF SKIP LISTS》 - 1 - 线段跳表——跳表的一个拓展 2009 年冬令营论文 李骥扬 第一部分 跳表简介 � � �� 从链表到跳表 链表作为一种常用而灵活的数据结构,常常用于维护线性数据。链表可以方 便的执行插入删除操作,但是从链表中查找一个数的代价可能很大(时间复杂度 O(N) )。相反,维护一个有序数组可以使用二分方便地在O(log N) 的时间内进行 查找,但若要维护数组的有序性,插入和删除的复杂度又会很大(时间复杂度 O(N) )。如果能维护一个有序链表且支持二分,我们就可以在O(log N) 的时间内 完成一组规模为n的数据的插入、查找、删除操作(字典操作)。 让我们首先考虑一个静态链表的查询。 一个简单的想法就是在链表中给一些节点增加一个指针(加速指针),使得 我们能够在适当的时候跳过一些结点,从而达到加速查找的目的。(如下图) [figure 1.1] 带加速指针的链表 然而如果我们限制对于一个结点只连出一个加速指针,使用类似块状链表的 结构,我们能达到的最优的复杂度为O( n ) 。能不能得到更好的结果呢?我们放 宽每个节点有一个加速指针的限制,基于与静态数组的二分搜索的类比,我们能 够得到如下结构: [figure 1.2]空想跳表 - 2 - 线段跳表——跳表的一个拓展 2009 年冬令营论文 李骥扬 每个节点连出的加速指针指向该节点在二分过程中可能作为左端点的区间 中点。这一结构可以在O(log N) 的时间内实现对数据的搜索,搜索过程即二分, 每次通过加速指针找到当前区间的中间节点,比较后确定更精确的区间继续二 分。 但是当我们面对

文档评论(0)

1亿VIP精品文档

相关文档