Redis設計與實現——第一部分 數據結構與對象 第5章 跳躍表

使用場景:1.實現有序集合鍵 2.集羣節點中用作內部數據結構
跳躍表(skiplist)是一種有序數據結構,它通過在每個節點中維持多個指向其他節點的指針,從而達到快速訪問節點的目的。跳躍表支持平均O(logN)、最壞O(N)複雜度的節點查找,還可以通過順序性操作來批量處理節點。

跳躍表結構:
在這裏插入圖片描述

跳躍表節點 redis.h/zskiplistNode
typedef struct zskiplistNode {
//層 level數組可以包含多個元素,每個元素都包含一個指向其他節點的指針,程序可以通過這些曾來加快訪問其他節點的速度,一般來說,層數越多,訪問其他節點速度越快
//每次新建一個跳躍表的時候,程序根據冪次定律(power law,越大的數出現概率越小)隨機生成一個介於1到32之間的值作爲level數組的大小,即層高。
struct zskiplistLevel {
//前進指針 指向表尾方向的前進指針,可以用來遍歷節點
struct zskiplistNode *forward;
//跨度 用於記錄兩個幾點之間的距離,可以用來計算排位rank(查找節點的過程中,將沿途訪問過的所有層的跨度累積起來,得到的結果就是目標節點在跳躍表中的排位)
unsigned int span;
} level [];
//後退指針 用於從表尾向表頭訪問節點,每次只能後退到前一個節點(先通過跳躍表的tail指針訪問表尾節點,然後通過後退指針訪問倒數第二個節點,之後再訪問下一個backward指針,直到null的後退指針,訪問結束)
struct zskiplistNode *backward;
//分值 doulbe類型的浮點數,所有節點都按分值從小到大來排序。
//分值相同的節點按照成員對象在字典序的大小來排序,asc
double score;
//成員對象 指向一個字符串對象,而字符串對象則保存着一個sds值
//在同一跳躍表中,各個節點保存的成員對象必須是唯一的,但多個節點保存的分值卻可以是相同的
robj *obj;
} zskiplistNode;

跳躍表
zskiplist
typedef struct zskiplist {
//表頭節點和表尾節點
structz skiplistNode *header, *tail;
//表中節點的數量
unsigned long length;
//表中層數最大的節點的層數 表頭節點不計算在內
int level;
} zskiplist;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章