什么是跳跃表。跳跃表的原理及其实现。

目录

一.跳跃表的概述

二.跳跃表的定义

三.跳跃表的查找操作

四.跳跃表的插入操作

五.跳跃表的删除操作

六.补充


一.跳跃表的概述

话不多说,增加了向前指针的链表就叫作跳跃表。那么跳跃表和普通的单链表有什么区别呢?

我们知道, 在单链表中查询一个元素的时间复杂度为O(n),即使该单链表是有序的,我们也不能通过2分的方式缩减时间复杂度。 例如,在下图中,我们要寻找值为6的节点,那么我们要经过6次对比。

 而当我们使用跳跃表时,情况就大有不同。例如,在下图所示的跳跃表中,我们寻找值为6的节点,只需要进行4次对比。

从图中可以知道:

  • 跳跃表是由一系列的结点构成,每一个结点都包含关键字域(key)和索引层级数组域(reference level)。
  • 有一个key为负无穷(-inf)的头结点和一个key为正无穷(inf)或null的尾结点,它们的索引层数都相同且具有最大索引层数。
  • 其余的结点为有序的普通数据结点,它们具有的索引层数是随机产生的。最大索引层数不超过头尾结点的最大索引层数,但最少必须拥有一层索引。当所有结点都只具有一层索引的时候,此时跳跃表就退化成了单链表。

这里简单说下这些数据结点的索引层数是如何随机确定的。首先,结点必须最少有一层索引,在此基础上抛掷一枚硬币,若出现正面,结点索引层数加1并继续抛掷,若出现反面,即刻停止,这时的索引层数即为最终的结点索引层数。用一句术语说就是:每一层结点出现在其上层的概率固定为p。而这里我们抛掷硬币只不过将p取值为0.5罢了。实际情况下,P取值0.5、0.25、1/e都可以取得不错的效果。 

(当大量的新节点通过逐层比较,最终插入到原链表之后上层的索引节点会渐渐变得不够用。这时候需要从新节点当中选取一部分提到上一层当做索引。可是究竟应该提拔谁忽略谁呢?关于这一点,跳跃表的设计者采用了种有趣的办法:【抛硬币】也就是随机决定新节点是否提拔,每向上提拔一层的几率是50%。之所以采用这种方法,是因为跳跃表删除和添加的节
点是不可预测的,很难用一种有效的算法来保证跳表的索引分部始终均匀。随机抛硬币的方法虽然不能保证索引绝对均匀分布,却可以让大体趋于均匀。)

二.跳跃表的定义

现在我们知道,跳跃表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳跃表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳跃表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。 

采用这种随机技术,跳跃中的搜索、插入、删除操作的时间均为O(logn),然而,最坏情况下时间复杂性却变成O(n)。相比之下,在一个有序数组或链表中进行插入/删除操作的时间为O(n),最坏情况下为O(n)。

空间复杂度为O(n)。

三.跳跃表的查找操作

 在跳跃表中查找一个元素x,按照如下几个步骤进行:

1. 从最上层的链(Sh)的开头开始

2. 假设当前位置为p,它向右指向的节点为q(p与q不一定相邻),且q的值为y。将y与x作比较

    (1) x=y  输出查询成功及相关信息

    (2) x>y  从p向右移动到q的位置

    (3) x<y  从p向下移动一格

3. 如果当前位置在最底层的链中(S0),且还要往下移动的话,则输出查询失败

一定注意,不是和当前元素比较,是和当前元素的下一元素比较。

四.跳跃表的插入操作

跳跃表的插入操作可以分解为以下三步:

  1. 首先查找到新数据在L1层的插入点。
  2. 使用随机化决策模块来决定新插入数据的索引列的高度x。
  3. 插入高度为x的列,并维护跳跃表的结构。

例如,现在我们要插入节点10

首先我们找到节点10在L1层中的插入位置,如下图所示,我们知道节点10应该插入到节点9后面

接着我们执行了随机化决策模块,得到新插入数据的索引列的高度为5。

最后我们插入高度为5的列,并维护跳跃表的结构。

五.跳跃表的删除操作

删除操作分为以下三个步骤:

  1. 在跳跃表中查找到这个元素的位置,如果未找到,则退出 
  2. 将该元素所在整列从表中删除 
  3. 将多余的“空链”删除 

例如,我们现在要删除元素10,首先找到了这个元素的位置

接着将元素10所在整列从表中删除,并且此时最高层L5变成了空链。

最后,将多余的“空链”删除 

六.补充

上面实现的跳跃表:

  1. 可以插入重复key,并且先插入的key更靠近头结点。
  2. 删除key结点的时候会把具有该key值的所有结点删掉。
  3. 若待查找的key有多个的时候,查找返回的结果是具有最高索引层数的key,若最高索引层数也相同,则返回更靠近头结点的key。

猜你喜欢

转载自blog.csdn.net/ThinPikachu/article/details/113945433
今日推荐