SkipList 原理

SkipList 跳跃表,一种根据 key 高效查找 value 的数据结构,本质是链表。

原生 Java 实现了 ConcurrentSkipListSet 以及 ConcurrentSkipListMap

使用跳跃表的条件:必须包含可以排序的属性,否则没有意义

思路:按照属性大小建立链表,在链表的基础上改造,增加新的引用,分别指向更远处的节点,提高查询效率
跳跃表原理
如上图所示,假设现在需要查询 22 节点:

  • 假设只有一层:依次遍历 head > 3 > 7 > 11 > 19 > 22 ,5次遍历找到
  • 假设只有两层:依次遍历 head > 7 > 19 > 26 (发现大于后跳回,走次级引用) -> 22,4次遍历
  • 假设存在三层:依次遍历 head > 19(发现为空,走次级引用) > 26(发现大于后跳回,走次级引用) -> 22,3次遍历找到

上图就是跳跃表的核心思路,一般情况下层数越高,查询效率越高,总得来说仍是一种空间换时间的策略,因为需要维护更多的引用。

多层链表的特征:

  1. 上层链表节点数比下层链表节点数少,
  2. 第 n 层节点数是底层节点数的的 1 / n
  3. 每次查询从高层开始,依次向下一层递归

跳跃表只继承特征一和三,因为特征二太难维护:每次增、删、改操作后需要进行大量的操作维护链表结构:

  1. 添加、删除节点时,该节点往后所有节点可能都要修改
  2. 修改可以看做删除和添加两个过程,复杂度更高

跳跃表建议每个节点采用随机层数的方式实现,具体过程如下:
跳跃表添加节点
这样每次操作时,只需要处理当前节点层数的引用,大大降低复杂度。

跳跃表优化的本质在于跳过无效的节点,提高查询效率。跳过的越多,查询效率越高,总体来说层数过高或者过低对效率都不好:

  1. 跳跃表层数过高时,占用的内存多,物流损耗严重
  2. 跳跃表层数过低时,跳跃过的节点少,效率不高

此时就需要从空间和时间两个维度一起考虑,其中上层节点数比下层节点数少可以通过概率学维护,一层概率为1,二层概率为 p ,三级概率为二层的基础上继续 p,以此类推。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值