跳跃表

1.简介

一个有序的数组/链表,进行插入和查询操作:

  • 对于有序数组,二分查找时间复杂度为O(logN),但是插入的时候需要移动元素为O(N),总时间复杂度为O(N)
  • 对于有序链表,查找时间复杂度为O(N),插入为O(1),总的为O(N)

综上来看,两种方法都不好,但是我们希望在查找的时候像二分,插入的时候像链表,所以有了跳跃表,像下图这样

  • 主体部分是链表,方便插入和操作
  • 有多层,用于进行类似二分的查询

2.查询操作

步骤: 从上层开始,若查找成功返回;查找到比自身大的节点A,返回节点A的前驱节点B,从B进入下一层,以此循环直到结束
这里以查找29为例:

  • 从3层的head开始,查找到45,比29大,返回3层的head,进入下一层,该过程查询次数为1

  • 从2层的head开始,查找到16,比29小,那么继续走,查找到45,比29大,返回16那个节点,进入下一层,该过程查询次数为2

  • 从1层的16开始,查找到29,查找成功,查询次数为1,总查询次数为4次

3.插入操作

每次插入操作,使用“抛硬币”方法,若为“正”,向上加一层;为“反”,停止加层,插入结束
比如,向下插入66,第一次抛硬币为“正”,那么向上加一层

第二次抛硬币为“反”,那么停止加层,插入操作结束。

posted @ 2021-12-01 21:45  叫我刘大炮  阅读(57)  评论(0)    收藏  举报