跳跃表

[TOC]

[TOC]

跳跃表

跳跃表是基于多指针有序链表实现的,可以看成多个有序链表。上层结点都有指向下层结点的指针,从上往下每一层链表节点数递减。比如第一层有两个,第二层有四个,以此类推。

跳跃表-三级索引-寻找42

插入

看懂了跳跃表的数据结构,那么就很容易理解节点的插入操作了,基本上两步操作就可以实现:在最底层的数据链表中插入数据,然后调整索引;

其中每一层的索引链表中是否需要增加新增的节点,其实并没有什么标准答案,我们尽量做到索引的平均分布即可,常用的就是【随机判断】决定是否需要新增或调整索引,当有新节点插入的时候,通过概率算法判断这个节点需要插入到几级节点中。

比如:

  • 底层数据链表有 N 个元素,随机选择 N/2 个元素作为 1 级索引,随机选择 N/4 个元素作为 2 级索引…一直到顶层索引;
  • 新插入数据节点,1/2 概率不插入任何一级索引,1/4 概率返回需要插入 1 级索引,1/8 概率返回需要插入到 2 级索引,以此类推;
  • 这里要注意一点,插入 2 级索引的时候,同时也需要插入 1 级索引;也就是插入 n 级索引的时候,同时也要插入 1~( n-1 ) 级索引。

位图

通过一个bit数组来存储特定数据的一种数据结构,每一个bit位都能独立包含信息,bit是数据的最小存储单元,因此能大量节省空间

按下标从数组的高位(左)向低位(右)取值,bit数组起始值全为0,从左到右取下标(下标从0开始),数组的每个元素值就是一个下标值.将元素对应的下标在bit位上的值改为1

举例:数组[2,5,3,8] 起始000000000 元素2对应下标2,
将左到右的下标2的值改为1 –> 001000000————————————————