zoukankan      html  css  js  c++  java
  • 4、跃进表

    跃进表是一个有序数据结构,它通过在每个节点上维护多个指向其他节点的指针,从而达到快速访问节点的目的;
    跃进表支持平均O(logN)、最坏O(N)复杂度的节点查询,还可以通过顺序性来批量处理节点;
    大多数情况下,跳跃表与平衡树效率差不多,并且因为跳跃表的实现比平衡树要来的更简单,所以可以使用跳跃表来替换平衡树。
    Redis使用跳跃表作为有序集合键的底层实现之一。如果一个有序集合包含的元素数量比较多,或者有序集合中元素的成员是比较长的字符串时,Redis就是使用跳跃表来作为有序集合键的底层实现。
    Redis中只有两个地方可以使用到跳跃表一个是有序集合,另一个是集群节点中用作内部数据结构。
    Redis的跳跃表由redis.h/zskiplistNode和redis.h/zskiplist两个结构定义,其中zskiplistNode结构用于表示跳跃表节点,而zskiplist结构则用于保存跳跃表节点的相关信息,比如节点数量、以及指向表头节点和表尾节点的指针等等。
    上面是zskiplistNode跳跃表节点结构;
    header:指向跳跃表的表头节点;
    tail:指向跳跃表的表尾节点;
    level:记录目前跳跃表内,层次最大的那个节点的层数(表头节点的层数不计算在内);
    length:记录跳跃表的长度,即是跳跃表目前包含节点的数量(表头节点不计算在内);
    层(level):如上图中,L1、L2都是层级。每个层都带有两个属性:前进指针和跨度;
    前进指针用于访问表尾方向的其他节点,
    而跨度则记录了前进指针所指向的节点和当前节点的距离;
    后退(backward):节点中BW代表后退指针,它指向位于当前节点前一个的节点,后退指针在程序从表尾向表头遍历时使用。
    分数:各个节点中所保存的值。在跳跃表中各个节点按照各自所保存的分值从小到大排序;
    成员对象:各个节点中,o1、o2、o3是节点所保存的成员对象。
     
    跳跃表节点的实现由redis.h/zskiplistNode结构定义:
    typedef struct zskiplistNode{
    //后退指针
    struct zskiplistNode *backward;
    //分值
    double score;
    //成员对象
    robj *obj;
    //层
    struct zskiplistNode {
    //前进指针
    struct zskiplistNode *forward;
    //跨度
    unsigned int span;
    } level[];
    }
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    【学习】jquery.placeholder.js让IE浏览器支持html5的placeholder
    【特效】体验很好的导航hover效果移出恢复当前位置
    【学习】滚动延迟加载插件scrollLoading用法
    【转载】jQuery全屏滚动插件fullPage.js
    【原创】自用css reset
    【转载】jQuery手机移动端触屏日历日期选择
    【学习】条码扫描器:QuaggaJS
    【学习】苹果iPhone safari浏览器样式重置修复按钮圆角bug
    将SeqReader打包成可执行的jar包
    Java向上转型和向下转型
  • 原文地址:https://www.cnblogs.com/use-D/p/10680734.html
Copyright © 2011-2022 走看看