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[];
    }
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    JavaScript操作符instanceof揭秘
    Linux打开txt文件乱码的解决方法
    Working copy locked run svn cleanup not work
    poj 2299 UltraQuickSort 归并排序求解逆序对
    poj 2312 Battle City 优先队列+bfs 或 记忆化广搜
    poj2352 stars 树状数组
    poj 2286 The Rotation Game 迭代加深
    hdu 1800 Flying to the Mars
    poj 3038 Children of the Candy Corn bfs dfs
    hdu 1983 Kaitou Kid The Phantom Thief (2) DFS + BFS
  • 原文地址:https://www.cnblogs.com/use-D/p/10680734.html
Copyright © 2011-2022 走看看