高階資料結構 跳躍表(Skip List)

2021-09-25 22:35:56 字數 880 閱讀 3284

跳表是乙個隨機化的資料結構,實質就是一種可以進行二分查詢的有序鍊錶。

跳表在原有的有序鍊錶上面增加了多級索引,通過索引來實現快速查詢。

跳表不僅能提高搜尋效能,同時也可以提高插入和刪除操作的效能。

如果要查詢17這個元素,我們從二級索引的6開始,發現右邊是15,還是小於7,於是進入一級索引,此時找到17元素。

只需要進行很少的比較就可以找到所需元素。

相當於是乙個空間換時間的演算法。

跳表查詢、插入、刪除的時間複雜度為o(log n)。

首先,我們來分析下redis的有序集合支援的操作:

插入元素

刪除元素

查詢元素

有序輸出所有元素

查詢區間內所有元素

其中,前4項紅黑樹都可以完成,且時間複雜度與跳表一致。

但是,最後一項,紅黑樹的效率就沒有跳表高了。

在跳表中,要查詢區間的元素,我們只要定位到兩個區間端點在最低層級的位置,然後按順序遍歷元素就可以了,非常高效。

而紅黑樹只能定位到端點後,再從首位置開始每次都要查詢後繼節點,相對來說是比較耗時的。

此外,跳表實現起來很容易且易讀,紅黑樹實現起來相對困難,所以redis選擇使用跳表來實現有序集合。

跳表的設計者採用了一種有趣的辦法:拋硬幣。也就是隨機決定新節點是否提拔,每向上提拔一層的機率是50%。因為跳躍表的刪除和新增節點是不可**的,很難用一種有效的演算法來保證跳表的索引分部始終均勻。這種方法雖然不能保證索引絕對均勻分布。但是可以讓大體趨於平均。

跳表的優點是維持結構平衡的成本很低,完全依靠隨機。而二叉查詢樹在多次插入刪除之後,需要rebalance來重建平衡結構。

redis資料結構 跳躍表

跳躍表 skiplist 是一種有序資料鏈表結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。查詢平均效能為o logn 最壞的情況會出現o n 情況,而redis中的zset在資料較多的時候底層就是採用跳躍表去實現的,元素較少的時候會進行小物件壓縮採用壓縮列表實現。小...

Redis資料結構 跳躍表

跳躍表是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。redis使用跳躍表作為有序集合鍵的底層實現之一,如果乙個有序集合包含的元素數量比較多,又或者有序集合中的元素的成員是比較長的字串時,redis就會使用跳躍表作為有序集合鍵的底層實現。redis的跳躍...

Redis資料結構 skiplist(跳躍表)

跳躍表在redis中主要用於有序集合鍵的實現,其他地方沒怎麼用到,但是這種資料結構在面試的時候經常會問到,因為它作為一種查詢時間複雜度為o logn 的特殊的鍊錶,效率堪比紅黑樹或平衡樹,而實現難度卻遠小於它們。下面分3個模組講解redis的跳躍表實現 一 跳躍表的應用場景 在redis中,當有序集...