• 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[];
    }
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    d3js 添加数据
    d3js 画布 概念
    Python中的 socket示例
    swift学习笔记
    加密原理介绍,代码实现DES、AES、RSA、Base64、MD5
    socket编程中客户端常用函数
    WBS 与 甘特图
    C/C++ 数据结构之算法
    Linux集群服务 LVS
    Linux内核架构与底层--读书笔记
  • 原文地址:https://www.cnblogs.com/use-D/p/10680734.html
Copyright © 2020-2023  润新知