跳跃表原理与实现!

对于下面这个链表,需要查找元素9。

  • 一共遍历8个节点才能找到元素9。

image-20231011100615897

由于元素是有序的,可以通过增加一些路径来加快查找速度。

  • 通过这种方法,只需要遍历5次就可以找到元素9了(红色线路为查找路径)。

image-20231011100717098

如果再加一层,只需要查找4次就能找到了。

image-20231011100738525

对于具有n个元素的链表,可以采取(logn+1)层指针路径的形式

  • 就可以实现在O(logn)的时间复杂度内,查找到某个目标元素了,这种数据结构,称之为跳跃表

跳跃表有关性质

跳跃表的每一层都是一条有序的链表。

跳跃表的查找次数近似于层数。

  • 时间复杂度为O(logn),插入、删除也为O(logn)

最底层的链表包含所有元素。

跳跃表是一种随机化的数据结构(通过抛硬币来决定层数)。

跳跃表的空间复杂度为O(n)

查找操作

顶层索引节点定位:

  • 从顶层索引节点开始,跳跃表会比较顶层索引节点所指向的节点值与目标值的大小关系。
    • 然后根据比较结果选择继续向右移动还是向下移动。

向下移动:

  • 如果顶层索引节点所指向的节点值小于目标值,则跳跃表将向右移动到下一个节点进行比较。
    • 直到找到大于或等于目标值的节点为止。

回溯与向下查找:

  • 一旦跳跃表在某一层找到了不小于目标值的节点后,就会回溯到下一层该节点所对应的位置。
    • 然后继续向下查找,直到定位到目标节点或者无法向下查找为止。

插入操作

在跳跃表中进行插入操作时,首先需要确定插入节点的层数。

  • 跳跃表通过随机生成节点的层数。

使得每个插入的节点都有一个随机的层数。

  • 这种特性使得跳跃表可以根据数据动态调整索引结构,从而保证插入操作的高效性。