科普跳躍表-SkipList

什么是跳表

跳表是一種有序的數(shù)據(jù)結構,它通過在每個節(jié)點中維持多個指向其它節(jié)點的指針辽剧,從而達到快速訪問的目的。

核心思想

image.png

這是一個單向鏈表税产,我們要查詢鏈表中某個元素的話怕轿,需要遍歷整條鏈,所以鏈表查詢的時間復雜度為O(N)辟拷。

O(N)撞羽,這個時間復雜度比較高,查詢效率較低衫冻,于是就有人試圖優(yōu)化诀紊。

其中,William Pugh 受到二分查找的啟發(fā)隅俘,就思考能不能通過二分法來跳過部分節(jié)點邻奠,直接鎖定目標笤喳。于是,他做出了這樣的假設碌宴。

如果是說鏈表是排序的杀狡,并且節(jié)點中還存儲了指向前面第二個節(jié)點的指針的話,那么在查找一個節(jié)點時贰镣,僅僅需要遍歷N/2個節(jié)點即可呜象。


image.png

同理,如果節(jié)點中還存儲指向前面第四個節(jié)點的指針的話碑隆,那么查找下一個節(jié)點時恭陡,僅僅需要遍歷N/4個節(jié)點。


image.png

這就是跳表的核心思想上煤,通過一個“空間來換取時間”的算法休玩,通過在每個節(jié)點中增加了向前的指針,從而提升查找的效率劫狠,顯然哥捕,它的查找時間復雜度為O(logN)。

其實嘉熊,這只是理想狀態(tài)下的跳表。

在這種理想狀態(tài)下扬舒,每次插入或者刪除節(jié)點時阐肤,新節(jié)點前面的所有節(jié)點都要重新關聯(lián),這顯然不是我們想要的結果讲坎。

現(xiàn)實中的跳表是這樣的孕惜。


image.png

跳表的性質

(1) 由很多層結構組成

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

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

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

跳表的結構

跳躍表的節(jié)點有三部分構成:key值衫画,value值,以及指向前向節(jié)點的指針數(shù)組瓮栗,指針數(shù)組的大小由該節(jié)點的層數(shù)決定削罩。


image.png

所以,節(jié)點的數(shù)據(jù)類型可以定義為

typedef struct nodeStructure {
    keyType key; // key值
    valueType value;  // value值
    node forward[1];  // 向前指針數(shù)組费奸,根據(jù)該節(jié)點層數(shù)的不同指向不同大小的數(shù)組
};

定義跳表數(shù)據(jù)類型:

typedef struct listStructure {
   int level; // 跳表的層數(shù)
   struct nodeStructure * header; // 指向header節(jié)點的指針
   } * list; 

跳表的操作

查詢

對于下圖這個鏈表結構弥激,假設我們要查詢值為56的節(jié)點,我們需要比較10次愿阐。


image.png

使用跳表優(yōu)化過的查詢算法微服,我們只需要比較3次。


image.png

插入

同鏈表類似缨历。

刪除

同鏈表類似以蕴。

性能對比

我們對跳躍表糙麦、平衡樹等進行比較,如下圖()所示:


圖片來自網(wǎng)絡丛肮,未找到原出處
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赡磅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腾供,更是在濱河造成了極大的恐慌仆邓,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伴鳖,死亡現(xiàn)場離奇詭異节值,居然都是意外死亡,警方通過查閱死者的電腦和手機榜聂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門搞疗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人须肆,你說我怎么就攤上這事匿乃。” “怎么了豌汇?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵幢炸,是天一觀的道長。 經(jīng)常有香客問我拒贱,道長宛徊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任逻澳,我火速辦了婚禮闸天,結果婚禮上,老公的妹妹穿的比我還像新娘斜做。我一直安慰自己苞氮,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布瓤逼。 她就那樣靜靜地躺著笼吟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抛姑。 梳的紋絲不亂的頭發(fā)上赞厕,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音定硝,去河邊找鬼皿桑。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的诲侮。 我是一名探鬼主播镀虐,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沟绪!你這毒婦竟也來了刮便?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤绽慈,失蹤者是張志新(化名)和其女友劉穎恨旱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坝疼,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡搜贤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钝凶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仪芒。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耕陷,靈堂內(nèi)的尸體忽然破棺而出掂名,到底是詐尸還是另有隱情,我是刑警寧澤哟沫,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布饺蔑,位于F島的核電站,受9級特大地震影響嗜诀,放射性物質發(fā)生泄漏膀钠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一裹虫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧融击,春花似錦筑公、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拇涤,卻和暖如春捣作,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹅士。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工券躁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓也拜,卻偏偏與公主長得像以舒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子慢哈,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容