数据结构——跳表

一、什么是跳表

    跳表为一个值有序的链表建立多级索引;比如每2个节点提取一个节点到时上一级,我们把抽出来的那一级叫做索引或索引层。

二、跳表的时间复杂度?

    1、计算跳表的高度

        如果链表有n个节点,每2个节点抽取一个节点作为上一级索引的节点,那第一级的节点个数大约是n/2,第二级索引则是在第一级索引上每2个节点抽取一个节点则它的节点个数大约是n/4,依次类推,第k级索引的节点个数就是n/(2^k)。假设索引有h级别,最高级的索引有2个节点,则有n/(2^h)=2,那么h=log2n-1,包含原始链表这一层,整个跳表的高度就是log2n。

    2、计算跳表的时间复杂度

        假设我们在跳表中查询某个数据的时候,如果每一层都遍历m个节点,那在跳表中查询一个数据的时间复杂度就是O(m*logn)。因为索引与它下面一层索引相差个2元素,包括自己只有3个元素,所以m最大为3。所有复杂度就是O(logn)。

三、跳表的空间复杂度及如何优化?

    1、计算索引的节点总数 

        如果链表有n个节点,每2个节点抽取抽出一个节点作为上一级索引的节点,那每一级索引的节点数分别为:n/2,n/4,n/8,..,8,4,2,等比数列求和等于n-1,所以跳表的空间复杂度为O(n)。

    2、如何优化空间复杂度

        如果链表有n个节点,每3或5个节点抽取抽出一个节点作为上一级索引的节点,那每一级索引的节点数分别为(以3为列):n/3,n/9,n/27...,9,3,1,等比数列求和等于n/2,尽管空间复杂度还是 O(n),但比上面的每两个结点抽一个结点的索引构建方法,要减少了一半的索引结点存储空间。

四、高效的动态插入和删除?

    跳表本质上就是链表,所以公插入和删除操作时间复杂度为O(1),但是在实际情况中,插入或删除某个节点,需要先找到指定位置,而这个 查找操作比较费时,但在跳表中这个 查找操作的时间复杂度是O(logn),所以,跳表的插入和删除操作的时间复杂度也是O(logn)。

五、跳表索引动态更新?

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

六、java实现跳表需注意

    1、每次插入数据的时候随机产生的level:决定了新节点的层数;

    2、数组update的作用:用以存储新节点所有层数上,各自的前一个节点的信息;

    3、节点内的forwards数组:用以存储该节点所有层的下一个节点的信息;

    4、当所有节点的最大层级变量maxlevel=1的时候,跳表退化成一个普通链表

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在redis的zset(有序集合)数据类型中,它有两种实现方式:跳表和压缩列表;这里介绍跳表;(跳表在我的理解就是...
    小名源治阅读 2,166评论 0 1
  • 跳表这种数据结构对你来说,可能会比较陌生,因为一般的数据结构和算法书籍里都不怎么会讲。但是它确实是一种各方面性能都...
    acc8226阅读 4,617评论 0 5
  • 姓名:谭旭东 学号:19011210016 嵌牛导读:经典数据结构——跳表 嵌牛鼻子:Java 嵌牛提问:内存排除...
    _冻茶阅读 8,239评论 0 0
  • 跳表实质是链表,通过维护多个指向其他节点的指针,达到快速访问节点的目的。跳表查找的时间复杂度平均情况下是O(log...
    MontyOak阅读 3,961评论 0 0
  • 更多数据结构内容,请参考:数据结构 - 概要 简介 漫画算法:什么是跳跃表? Redis 为什么用跳表而不用平衡树...
    齐晋阅读 4,842评论 0 1

友情链接更多精彩内容