• 「数据结构」跳表原理详解及代码实现


    跳表可以说是我最喜欢的数据结构了,一方面因为其优越的性能,无论是插入、删除操作还是数据查找,他的时间复杂度都是O(logn),要知道最优秀的二分查找算法的时间复杂度也是O(logn),另一方面跳表数据结构实现相对于红黑树来说足够的简单,同时他还支持O(logn)时间复杂度的范围查询,而红黑树的范围查询则没有这么高的效率。

    跳表因为其优秀的综合性能,在以速度著称的Redis中的SortedSet有序集合也是采用了跳表这种数据结构来实现。

     

    如果你还不了解跳表,那么让我们一起来学习这种优秀的数据结构吧!

    跳表数据结构描述

    现在给你一批无序的int类型数据,例如1,3,98,13,6,9,27,45,尝试设计一种高性能的数据结构存储这批数据,使其有序同时能够支持以下操作:

    1. 新增一条数据;
    2. 删除指定的一条数据;
    3. 给定一个数值,查询其是否存在;
    4. 能够支持范围查询,例如查询数值在[10,30]之间的数据;

    首先我们可以考虑用数组或者链表来存储上述数据:

     

     

    针对有序的数组和链表,我们一起来看看数组和链表两种存储方式能否满足上述操作需求:

    1. 新增一条数据:数组采用二分查找算法找到第一个大于该数据的下标,该下标存储新增数据,后面的数据整体向后移动一位;链表则需遍历整个链表找到第一个大于该数据的节点,但是后面的链表无需做移动操作;
    2. 删除指定的一条数据:数组采用二分查找找到该数据的下标,后面的数据整体向前移动一位;链表需要找到当前节点,并把前一个节点的next指向后一个节点;
    3. 给定一个数值,查询其是否存在:数组采用二分查找可以高效地找到;链表则需要遍历整个链表;
    4. 支持范围查询:数组采用二分查找高效地找到起始数据的下标;链表则需要遍历整个链表;

    综上所述,可以很明显地看出来数组的特性就是查找快速,但是插入删除因为需要移动数组,所以性能相对较差,链表则是插入、删除快,但是前提是能找到那个要插入、删除的节点,而查询则需要遍历整个链表。

    那么问题来了,能不能结合数组的

  • 相关阅读:
    【LeetCode刷题笔记】栈和队列
    JavaScript事件处理
    切换npm的版本
    多次声称不造车的华为,如今正在借别人的手造自己的车?
    直方图(Histogram)的统计说明
    Q4已来,DAO发新生|CyberDAO子DAO种子会议
    移远通信EM060K系列LTE-A Cat 6模组完成全球认证覆盖
    千人优学 | GBase 8s数据库2022年6月大学生专场实训圆满结束
    设计模式(十四)----结构型模式之组合模式
    Python-网络编程中数据的打包与字节流的解包
  • 原文地址:https://blog.csdn.net/Cr1556648487/article/details/126763291