SKIPLIST

作者: 简书徐小耳 | 来源:发表于2018-12-03 21:18 被阅读4次

skipList是一种有序的数据结构

  • 平均复杂度logN,最坏复杂度N
  • 大部分情况下跳跃表的性能可以和平衡树媲美,并且因为实现简单,所以大部分会选择Skip

适用场景:有序集合中包含的数据量比较多,或者元素的乘以是比较长的字符串时。比如ZSET

redis的实现skiplist需要的2种结构 redis.h文件中哄的zskiplistNode和zskiplist

  • zskiplist包含:header(指向跳跃表的表头节点),tail (指向跳跃表的表尾节点),level(记录目前跳跃表内层数最大的那个节点的层数,表头的节点不包含在内),length(记录跳跃表的长度,也就是目前包含节点的数量,表头节点不计算在内)
  • 我们可以看到 我红色标记的就是一个具体的节点,节点里面就是一个节点包含的属性


    image.png
  • zskiplistNode包含下列元素
  • level:节点用L1之内的字样标记节点的各个层,L1代表第一层,每一层有2个属性,前进指针和跨度。

  • 前进 指针用于访问表尾方向的其他节点,而跨度则记录了前进指针所指向节点和当前节点的距离

  • 后退指针(BW):节点中用BW字样标记的后退指针,它指向当前节点的前一个节点,后退指针用来当程序从尾向头遍历时使用。

  • 分值(SCROE):在跳跃表中,节点按照各自所保存的分值从小到大排列

  • 成员对象 obj,各个节点中的 o1之类保存的成员对象

  • 表头节点也有上述属性

  • obj 是一个指针,它指向一个字符串对象,而字符串对象则保存一个SDS值。


    image.png
  • 整个跳跃表的过程如下:


    image.png
  • 跨度指向Null 则其跨度为0

相关文章

  • LeetCode #1206 Design Skiplist 设

    1206 Design Skiplist 设计跳表 Description:Design a Skiplist w...

  • Redis有序集合

    Redis有序集合的编码可以是 ziplist 或者 skiplist ziplist和skiplist编码选择的...

  • SkipList和java中ConcurrentSkipList

    SkipList和java中ConcurrentSkipListMap的实现 简介 一开始听说SkipList我是...

  • SkipList

    查找复杂度LogN,实现难度小于红黑树或平衡树。应用场景:有序集合中元素较多,有序集合中存储较长字符串。跳跃表的节...

  • skipList

    Skip List--跳表(全网最详细的跳表文章没有之一)https://www.jianshu.com/p/9d...

  • SKIPLIST

    skipList是一种有序的数据结构 平均复杂度logN,最坏复杂度N 大部分情况下跳跃表的性能可以和平衡树媲美,...

  • skiplist

    跳表同时是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样...

  • SkipList

    参考资料 https://kenby.iteye.com/blog/1187303https://time.gee...

  • Redis 源码分析(七) :skiplist

    一、skiplist由来 skiplist本质上也是一种查找结构,用于解决算法中的查找问题(Searching),...

  • 跳表

    参考资料 Redis为什么用跳表而不用平衡树? skiplist与平衡树、哈希表的比较 skiplist和各种平衡...

网友评论

      本文标题:SKIPLIST

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