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

跳表可以说是我最喜欢的数据结构了,一方面因为其优越的性能,无论是插入、删除操作还是数据查找,他的时间复杂度都是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. 支持范围查询:数组采用二分查找高效地找到起始数据的下标;链表则需要遍历整个链表;

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值