美文网首页
数据结构与算法:跳表

数据结构与算法:跳表

作者: yangfei02821 | 来源:发表于2022-03-27 11:30 被阅读0次
    定义:

    跳表使用空间换时间的设计思路,
    通过为有序链表构建多级索引来提高查询的效率,实现了基于链表的“二分查找”。
    跳表是一种动态数据结构,支持快速地插入、删除、查找操作。
    比如对一个有序的链表,每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。其中索引层节点包含一个down指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引的数据结构就称为跳表。

    时间、空间复杂度

    查询时间复杂度都是 O(logn),
    空间复杂度是O(n)。
    跳表的实现非常灵活,可以通过改变索引构建策略,有效平衡执行效率和内存消耗,在实际的软件开发中,原始链表中存储的有可能是很大的对象,而索引结点只需要存储关键值和几个指针,并不需要存储对象,所以当对象比索引结点大很多时,那索引占用的额外空间就可以忽略了。

    插入和删除

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

    跳表索引动态更新?

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

    为什么Redis一定要用跳表来实现有序集合?

    Redis 中的有序集合支持的核心操作主要有下面这几个:
    插入一个数据;
    删除一个数据;
    查找一个数据;
    按照区间查找数据(比如查找值在[100, 356]之间的数据);
    迭代输出有序序列。

    1、其他都也可以使用红黑树来实现,但是其中按照区间来查找数据这个操作,红黑树的效率没有跳表高。而跳表可以做到 O(logn) 的时间复杂度定位区间的起点,然后在原始链表中顺序往后遍历就可以了。这样做非常高效。
    2、而且跳表更容易代码实现。可读性好,不容易出错,更加灵活,可以通过改变索引构建策略,有效平衡执行效率和内存消耗。

    相关文章

      网友评论

          本文标题:数据结构与算法:跳表

          本文链接:https://www.haomeiwen.com/subject/dwejjrtx.html