特点
比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作,甚至可以替代红黑树
底层使用变种后链表来实现二分查找算法(因二分查找底层使用数组实现->数据随机访问特性)
跳表 = 链表 + 多级索引结构
时间复杂度
查询时间复杂度为O(logn),同二分查找一样,区别是基于单链表实现了二分查找
假设索引有h级,顶级索引有2个结点,可以得到n/()=2,求得h=
如果包含原始链表这一层,整个跳表的高度就是。
在跳表中查询某个数据,每一层都要遍历m个结点,则时间复杂度为O(m*logn)
按照这种索引结构,我们每一级索引都最多只需要遍历3个结点,也就是说m=3,如下图
所以最终时间复杂度为O(logn)
插入、删除时间复杂度为O(logn),如下图
跳表索引动态更新
不停地往跳表中插入数据,如果不更新索引,会出现2个索引结点之间数据偏多情况
极端情况下,跳表还会退化成单链表
作为一种动态数据结构,需要某种手段来维护索引与原始链表大小之间的平衡
可通过一个随机函数,来决定将这个结点插入到哪几级索引中
空间复杂度为O(n)
链表大小为n,第一级索引大约有n/2个结点,结点总和是n/2+n/4+n/8...+8+4+2=n-2
跳表的实现非常灵活,可以通过改变索引构建策略,有效平衡执行效率和内存消耗
可以结合实际情况进行优化,例如每三个结点抽取一个索引结点等