定义
如下图所示,为链表建立多级索引的数据结构就称为跳表。

时间复杂度
假设索引有 h 级,最高级的索引有 2 个结点。通过公式,我们可以得到 n/(2^h)=2,从而求得 h=logn-1。如果包含原始链表这一层,整个跳表的高度就是 logn。我们在跳表中查询某个数据的时候,如果每一层都要遍历 m 个结点,那在跳表中查询一个数据的时间复杂度就是 O(m*logn)。假设我们要查找的数据是 x,在第 k 级索引中,我们遍历到 y 结点之后,发现 x 大于 y,小于后面的结点 z,所以我们通过 y 的 down 指针,从第 k 级索引下降到第 k-1 级索引。在第 k-1 级索引中,y 和 z 之间只有 3 个结点(包含 y 和 z),所以,我们在 K-1 级索引中最多只需要遍历 3 个结点,依次类推,每一级索引都最多只需要遍历 3 个结点。所以,m = 3。

空间复杂度
如果链表有n个节点,每2个节点抽取抽出一个节点作为上一级索引的节点,那每一级索引的节点数分别为:n/2,n/4,n/8,…,8,4,2,等比数列求和n-1,所以跳表的空间复杂度为O(n)。
空间复杂度优化
如果链表有n个节点,每3或5个节点抽取抽出一个节点作为上一级索引的节点,那每一级索引的节点数分别为(以3为例):n/3,n/9,n/27,…,27,9,3,1,等比数列求和n/2,所以跳表的空间复杂度为O(n),和每2个节点抽取一次相比,时间复杂度要低不少呢。
高效的动态插入和删除
在实际情况中,要插入或删除某个节点,需要先查找到指定位置,而这个查找操作比较费时,但在跳表中这个查找操作的时间复杂度是O(logn),所以,跳表的插入和删除操作的是时间复杂度也是O(logn)。

跳表索引动态更新
当往跳表中插入数据的时候,可以选择同时将这个数据插入到部分索引层中,那么如何选择这个索引层呢?可以通过随机函数来决定将这个节点插入到哪几级索引中,比如随机函数生成了值K,那就可以把这个节点添加到第1级到第K级索引中。

《数据结构与算法之美》 -- 王争
本文介绍了跳表的数据结构定义,探讨了其时间复杂度(O(m*logn))与空间复杂度(O(n)),包括索引动态更新和插入删除操作的O(logn)复杂度。重点讲解了空间优化策略和查询过程中的高效搜索技巧。

1018

被折叠的 条评论
为什么被折叠?



