一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
前言
在上一篇文章中我们了解到了跳表的原理,以及理解了跳表是如何实现的。现在我们来分析一下使用跳表会给我们提升多少的查询效率。
跳表的查询效率分析
链表的时间复杂度是O(n),那跳表的时间复杂度是多少呢?我们拿上一篇文章的例子来进行分析,我们有n个结点的原始链表,每隔2个结点抽取一个结点,那么在1级索引层中会有n/2个结点,在二级索引层中会有n/4个结点,在三级索引层中就会有n/8个结点,那么由此可得在k级索引中就会有n/2 ^k个结点了。假如现在我们的索引达到了h级,最高级的索引有2个结点由此套入公式可以得到n/(2^h)=2,转化之后可以得到h=log2n-1。包含原始链表层的话,那么链表的高度就是log2n。在跳表中查询数据的话,每一层都要遍历m个结点,那么在跳表中查询一个元素的时间复杂度就是O(m * log2n)。现在我们就来探究一下m这个值会是多少呢。假设我们需要查找的数据的值为x,那么在k级索引中,遍历到y结点,发现x大于y并且小于后面的z结点,这时候必须通过down指针,从k级索引下调到第k-1级的索引。在k-1级索引中,y和z只有存在3个结点。于是我们在k-1级的索引中最多只需要遍历3次,由k-1级下推至k-2级索引后,在k-2级也只需要3个结点。所以每层的索引只需要遍历3个结点。由此可以得到跳表的时间复杂度就是O(log2n)。
总结
通过跳表的时间复杂度的分析后,应该就明白了为什么查询效率提升如此之多了吧。