参考
跳跃表
普通的有序链表
- 如下我们有一个有序链表,想要查找数据
7,我们只能顺序查找,那么如何加速呢?
给链表查找加速
- 可以考虑使用空间来换效率,增加一级索引。
- 在原始的链表上,我们加入一级索引
- 第一级索引中的每个元素都有一个
down指针,指向原始链表,同时还有一个next指针,指向原始链表的第n一个元素。 - 如果我们查找
8呢?1->4->7->8,当在第一级索引查找,发现8大于7小于9,那么就顺着7的down指针继续向下找下一层。
- 发现已经加快了查找速度,为了更快,我们可以添加二级索引。
- 此时我们查找
8只需要1->7->8 - 本案例可能看不出来效果,但是当数据量大了以后,加速效果是杠杠的。
- 此时我们查找
- 多级索引。
- 假设有五级索引的这么一个原始链表,那么我们要查一个元素,比如说要查 62 元素或者中间元素,就类似于下图,一级一级一级一级走下来,最后的话就可以查到我们需要的62这个元素。当然的话你最后查到原始链表,你会发现比如说是我们要查63或者61,原始链表里面没有,我们就说元素不存在,在我们这个有序的链表里面,也就是说在跳表里面查不到这么一个元素,最后也可以得出这样的结论。
- 假设有五级索引的这么一个原始链表,那么我们要查一个元素,比如说要查 62 元素或者中间元素,就类似于下图,一级一级一级一级走下来,最后的话就可以查到我们需要的62这个元素。当然的话你最后查到原始链表,你会发现比如说是我们要查63或者61,原始链表里面没有,我们就说元素不存在,在我们这个有序的链表里面,也就是说在跳表里面查不到这么一个元素,最后也可以得出这样的结论。
现实中跳跃表的形态。
从图中可以看到, 跳跃表主要由以下部分构成:
- 表头(head):负责维护跳跃表的节点指针。
- 跳跃表节点:保存着元素值,以及多个层。
- 层:保存着指向其他元素的指针。高层的指针越过的元素数量大于等于低层的指针,为了提高查找的效率,程序总是从高层先开始访问,然后随着元素值范围的缩小,慢慢降低层次。
- 表尾:全部由 NULL 组成,表示跳跃表的末尾。