跳躍表skiplist簡析

2021-06-26 16:23:26 字數 2042 閱讀 9716

1.簡述

跳躍表(skiplist)最初由

william pugh發表在acm通訊上的**《

skip lists: a probabilistic alternative to balanced trees

》中,作者給出的定義是:跳表是在很多應用中有可能替代平衡樹而作為實現方法的一種資料結構。跳躍列表的演算法有同平衡樹一樣的漸進的預期時間邊界,並且更簡單、更快速和使用更少的空間。其實,跳表,顧名思義,跳躍的鍊錶,跳表在鍊錶的基礎上增加了前向指標,對於鍊錶而言,順序查詢的時間複雜度為線性時間,為了提高查詢的效率,在有序鍊錶的節點上增加額外的前向指標,可以通過額外的前向指標跨越鍊錶中的若干個節點,那麼到這裡問題就來了,當然不是挖掘機哪家強啦。如何知道有序鍊錶需要增加額外的前向指標,要增加多少額外的前向指標以及要跨越的節點數,在跳表的實現中,採用了隨機化的技術,使得跳表的查詢,插入,刪除的平均時間複雜度為o(logn)

以下是乙個跳躍表的例圖(來自維基百科):

從圖中可以看出跳躍表主要有以下幾個部分構成:

<1> 表頭head:負責維護跳躍表的節點指標

<2> 節點node:實際儲存元素值,每個節點有一層或多層

<3> 層level:儲存著指向該層下乙個節點的指標

<4> 表尾tail:全部由null組成

跳躍表的遍歷總是從高層開始,然後隨著元素值範圍的縮小,慢慢降低到低層。

2.跳表的基本原理

o(logn) ,

跳表其實採用空間換時間的方法加速查詢插入刪除這些操作,跳表的性質如下

<1> 由很多層布局構成,level是經由過程必然的概率隨機產生的

<2> 每一層都是乙個有序的鍊錶,預設是公升序

<3> 最底層(level 1)的鍊錶包含所有元素。

<4> 若是乙個元素呈如今level i 的鍊錶中,則它在level i 之下的鍊錶也都邑呈現。

<5> 每個節點包含兩個指標,乙個指向同一鍊錶中的下乙個元素,乙個指向下面一層的元素

下圖列出了從有序鍊錶轉化為跳表的過程

3.跳表的實現

跳表作為基礎的資料結構在一些開源的實現中使用非常廣泛,包括leveldb,redis,都使用跳表作為基礎的資料結構。redis中的有序集合就是基於跳表的基礎結構實現的,leveldb中的memtable的實現就是基於跳表實現的

.在效能上,跳表完全可以比擬平衡樹。

二叉樹可以用來表示字典和有序鍊錶等抽象資料結構,當以隨機順序插入元素時,它們表現出非常好,但是連續插入有序元素時,會迅速退化導致非常糟糕的效能。

跳表的表達比樹更加直觀,演算法實現更加簡單,比平衡樹提供了常量因子速度提公升,有效的空間效率,每個節點並不需要儲存平衡或優先順序資訊

跳躍表的查詢,插入和刪除示意圖如下

設定跳表的最大層數,每個節點的層數實現根據隨機化演算法實現,層越高,概率越小

跳表的search實現

跳表的insert實現

跳表的delete實現

參考:redis設計與實現

skip lists: a probabilistic alternative to balanced trees

維基百科-跳躍表

探索Skip List 跳躍表

附william pugh的 skip lists a probabilistic alternative to balanced trees 以下內容針對的是skip list的插入和刪除,建議你先到其他地方大概了解一下skip list長什麼樣子的,然後再過來看看這篇,最好還是看一眼 先,部分挺...

Redis學習 4 跳躍表(skiplist)

跳躍表 skiplist 是一種有序的資料結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。它的效率可以媲美平衡樹,跳躍表的平均複雜度o logn 最壞情況複雜度o n 並且其原理和 都要比平衡樹更加簡單,因此很多地方多用跳躍表代替平衡樹。1,redis使用跳躍表作為有...

Redis資料結構 skiplist(跳躍表)

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