1. 是什么
- 跳表=链表+多级索引
- 跳表是可以实现二分查找的有序链表
- skiplist是一种以空间换取时间的结构
- 由于链表,无法进行二分查找,因此借鉴数据库索引的思想,提取出链表中关键节点(索引),先在关键节点上查找,再进入下层链表查找。提取多层关键节点,就形成了跳跃表
2. 说说链表和数组的优缺点?为什么引出跳表
链表遍历的时候,时间复杂度最差会出现O(N),我们优化一下,尝试空间换时间,给链表加个索引,称为“索引升级”,两两取首即可。
3. 跳表的时间复杂度
首先每一级索引我们提升了2倍的跨度,那就是减少了2倍的步数,所以是n/2、nl4、n/8以此类推;第k级索引结点的个数就是n/(2k):
假设索引有h级,最高的索引有2个结点;n(2h)=2,从这个公式我们可以求得h=log2(N)-1;所以最后得出跳表的时间复杂度是O(logN)
4. 跳表的空间复杂度
首先原始链表长度为n
如果索引是每2个结点有一个索引结点,每层索引的结点数:n/2,n4,n/8.…,8,4,2以此类推:
或者所以是每3个结点有一个索引结点,每层索引的结点数:n/3,n/9,n/27…,9,3,1以此类推:
所以空间复杂度是O(n):
5. 优缺点
- 跳表是一个最典型的空间换时间解决方案,而且只有在数据量较大的情况下才能体现出来优势。而且应该是读多写少的情况下才能使用,所以它的适用范围应该还是比较有限的
- 维护成本相对要高·新增或者删除时需要把所有索引都更新一遍;最后在新增和删除的过程中的更新,时间复杂度也是O(og)