文章目录
基本概念
允许快速查询一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(log n),优于普通队列的O(n)。
动态查找的数据结构
可以作为查找数据结构的包括:
- 线性结构:数组、链表
- 非线性结构:平衡树
数组结构
缺点: 移动和删除时需要整体移动
优点: 内存连续, 查找方便
链表
缺点: 查找比较慢, 需要遍历而中间经过的节点, 就算我知道节点的大概位置, 也只能一步步到终点位置, 所以这是个可以优化的地方
平衡树
缺点: 需要存储的内容很多, 复杂的结构增加了调整平衡树的难度
优点: 处理动态查找问题也是可以的, 并且可以存储父子兄弟节点, 存储的信息很多
跳表的雏形
- 可以看到, 因为数组的内存连续性还有树的平衡树的多节点关系决定了他们不好改造, 而链表最适合被改造
- 链表插入和删除都很简单, 但是搜索时却需要步步遍历, 明明可以一步到位可偏偏得走很多步, 这就是可以优化的地方
- 即给链表加索引, 这就是跳表的由来
跳跃链表的实现原理
简单索引
- 给偶数多添加一个指针, 指向下一个偶数
多级索引
-
基于偶数节点增加索引并且只有两层的情况下,最高层的节点数是
n/2
,整体来看搜索的复杂度降低为O(n/2)
,并不要小看这个1 / 2 的系数,看到这里会想 增加索引层数到 k ,那么复杂度将指数降低为O(n/2^k)
-
索引层数也不能无限增加, 如果索引节点数量等于 2 , 那么再增加也没有意义了(因为两个节点怎么样查找都需要走两步)
索引层数和索引节点密度
当索引节点数量太少时将退化为普通链表, 而当索引节点数量太大时也是