1、跳表
“多层有序链表”
跳表运行规则
使用分层有序链表,比如我们查找值为31的节点时,查找步骤如下:
- 从最高层第2层开始查找,1节点比31值要小,继续向后比较。
- 11节点比31节点要小,继续向后比较,这时会发现第2层11节点的next指针是指向NULL,所以在11节点就开始需要下降一层到第1层并继续向后查找节点进行比较。
- 在下降到第1层中,11节点的值比31要小,继续向后比较,第1层11节点的next指针指向26,26比31要小,继续向后比较,第1层26节点的next指针指向61,61比31要大,需要下降一层继续向后比较。
- 最后下降到了第0层,第0层的26节点的next指针指向31,31为我们要找的节点,节点被找到。
综上所述,通过将有序集合的部分节点分层,从最上层节点依次开始向后查找,如果本层的next节点大于我们要找的值或者next节点指向NULL,则从本节点开始,降低一层继续向后查找,如果找到则返回节点,否则返回NULL。采用该思想原理查找节点,在层数高及节点数量比较多时,可以跳过一些节点,查询效率会大大提升,这就是跳跃表的思想。
跳表性质
- 跳跃表由很多层结构组成,最底层的节点个数为跳跃表的长度(length)。
- 跳跃表有一个头节点(header),头节点中有一个32层的结构,每层的结构包括指向本层下个节点的指针。
- 除头节点外,层数最多的节点的层高为跳跃表的高度(level),头节点初始化为32层,头节点中比跳跃表level层高的结构next指针指向NULL。
- 每层都是一个有序链表,数据score递增
- 除头节点header外,最底层(Level 0)的链表包含所有元素,节点每层的元素值一样,即上层有序链表中出现的元素一定会在下层有序链表中出现。
- 跳跃表拥有一个tail指针,指向跳跃表最后一个节点,且每层最后一个节点都指向NULL,表示本层有序链表的结束。
总体而言,跳跃表最底层Level 0是一个有序链表,链表中每个节点维护了多个指向其他节点的指针。跳跃表进行查找、插入、删除操作时可以跳过一些节点,快速找下操作需要的节点。