跳表是一种数据结构,用于借助连接到元素子序列的链表层次结构来存储元素的排序列表。跳表允许以有效的方式处理项目查找。跳表是一种概率数据结构,这意味着它跳过整个列表中的几个元素,因此称为跳表。我们可以将跳表作为链表的扩展版本。与链表允许插入、删除和搜索元素的方式类似,跳表也允许搜索元素、从列表中删除元素和插入元素。它将包含一个基本列表,其中包含一组元素,这些元素将维护后续元素的链接层次结构。
语法:
跳表没有特定的语法,但它有一个算法。在研究算法之前,我们需要检查基本跳表操作的类型。
- 插入操作:在跳表中,用于在特定情况下向特定位置添加新节点
- 搜索操作:在跳表中,用于搜索特定节点
- 删除操作:在跳表中,用于删除特定情况下的节点
让我们看看跳表是如何以算法的方式工作的。
插入算法:
步骤1:确定节点级别,因为列表中的每个元素都由节点表示,并且在插入列表时随机选择节点的级别
步骤2:根据以下步骤确定节点的级别
步骤3:找到最大级别是跳表中级别计数的上限,该上限由 L(N)=logp/2N
确定。这确保了随机级别将大于最大级别
步骤4:插入从最高级别开始,并比较当前节点的下一个节点
步骤5:如果“下一个节点关键点”小于“插入的关键点”,则可以使用相同级别继续前进
步骤6:如果next node key大于inserted key,那么我们需要存储一个指向当前节点I的指针,并向下移动一级继续搜索。
搜索算法:
步骤1:因为搜索元素非常类似于搜索一个点以在跳表中插入元素。
步骤2:如果下一个节点键小于搜索键,那么我们可以在同一级别上前进
步骤3:如果next node key大于inserted key,那么我们需要存储一个指向当前节点I的指针,并向下移动一级继续搜索。
步骤4:在最低级别,如果最右侧元素的下一个元素具有与搜索键相等的键,那么我们已经找到了键,否则这是一个失败。
删除算法:
步骤1:要删除任何元素,比如k,首先我们需要使用搜索算法在跳表中定位该元素。
第2步:一旦我们使用搜索算法找到了元素,指针重新排列将从列表中删除该元素,就像我们在单个链接列表中所做的那样。
步骤3:我们需要从跳过列表的最低级别开始,重新排列I not元素k旁边的元素。
步骤4:删除元素后,可能会出现没有元素的级别的情况,因此我们需要通过减少跳表级别来删除这些级别。
示例:Java中的跳表
import java.util.Iterator; import java.util.Random; import java.util.NoSuchElementException; public class SkipListJava<K extends Comparable<K>, V> implements Iterable<K> { private int listsize; private double pb; protected static final Random randomGen = new Random(); prote