C語言跳錶(skiplist)實現

來源:互聯網
上載者:User

標籤:

一、簡介

跳錶(skiplist)是一個非常優秀的資料結構,實現簡單,插入、刪除、尋找的複雜度均為O(logN)。LevelDB的核心資料結構是用跳錶實現的,redis的sorted set資料結構也是有跳錶實現的。代碼在這裡:http://flyingsnail.blog.51cto.com/5341669/1020034

 

二、跳錶圖解

考慮一個有序表:

從該有序表中搜尋元素 < 23, 43, 59 > ,需要比較的次數分別為 < 2, 4, 6 >,總共比較的次數

為 2 + 4 + 6 = 12 次。有沒有最佳化的演算法嗎?  鏈表是有序的,但不能使用二分尋找。類似二叉

搜尋樹,我們把一些節點提取出來,作為索引。得到如下結構:

這裡我們把 < 14, 34, 50, 72 > 提取出來作為一級索引,這樣搜尋的時候就可以減少比較次數了。

我們還可以再從一級索引提取一些元素出來,作為二級索引,變成如下結構:

這裡元素不多,體現不出優勢,如果元素足夠多,這種索引結構就能體現出優勢來了。

這基本上就是跳錶的核心思想,其實也是一種通過“空間來換取時間”的一個演算法,通過在每個節點中增加了向前的指標,從而提升尋找的效率。

跳錶

下面的結構是就是跳錶:

其中 -1 表示 INT_MIN, 鏈表的最小值,1 表示 INT_MAX,鏈表的最大值。

跳錶具有如下性質:

(1) 由很多層結構組成

(2) 每一層都是一個有序的鏈表

(3) 最底層(Level 1)的鏈表包含所有元素

(4) 如果一個元素出現在 Level i 的鏈表中,則它在 Level i 之下的鏈表也都會出現。

(5) 每個節點包含兩個指標,一個指向同一鏈表中的下一個元素,一個指向下面一層的元素。

 

三、源碼實現

https://github.com/begeekmyfriend/skiplist

C語言跳錶(skiplist)實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.