跳躍表通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。跳躍表支援平均o(logn)、最壞o(n)複雜度的節點查詢。
跳躍表定義在server.**件中,下圖所示為乙個跳躍表的示例:
上圖中最左邊的是zskiplist結構,右邊四個是跳躍表節點(zskiplistnode結構),跳躍表的結構定義如下:
// 跳躍表節點
typedef
struct zskiplistnode level;
} zskiplistnode;
各屬性說明如下:
zskiplist結構的定義如下:
typedef
struct zskiplist zskiplist;
各屬性說明如下:
注:表頭結點和其他節點構造是一樣的,表頭結點也有後退指標、分值和成員物件,不過表頭結點的這些屬性都不會用到跳躍表從表頭節點開始以跨度為1向表尾方向前進即可遍歷整個跳躍表。跨度可以用來計算排位:在查詢某個節點的過程中,將沿途訪問過的所有層的跨度累計起來,得到的結果就是目標節點在跳躍表中的排位。
跳躍表中的所有節點都是按照分值從小到大排序的,同乙個跳躍表中,各個節點儲存的成員物件必須是唯一的,但多個節點儲存的分值卻可以是相同的,分值相同的節點將按照成員物件在字典中的大小來排序,成員物件較小的節點會排在前面(靠近表頭方向),而成員物件較大的節點則會排在後面(靠近表尾方向)。
跳躍遊戲系列
已在 leetcode 上驗證通過。55.跳躍遊戲 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。class solution return true 45.跳躍遊戲 ii 給定乙個非負整數陣列,你最初位於陣列的第...
四 跳躍表(Redis)
跳躍表 skiplist 是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的 指標,從而達到快速訪問節點的目的。redis 的跳躍表由 redis.h zskiplistnode 和 redis.h zskiplist 兩個結構定 義,其中zskiplistnode結構用於表示跳躍表節點,...
Redis學習筆記(四) 跳躍表
跳躍表是一種以o log n 期望時間支援查詢 插入 刪除操作的 有序的資料結構。redis使用跳躍表作為有序集合鍵的底層實現之一。跳表的基本實現原理參考 skip lists a probabilistic alternative to balanced trees redis的跳表由zskipl...