0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

跳表是用來(lái)干什么的

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:后端技術(shù)小牛說 ? 作者:后端技術(shù)小牛說 ? 2021-11-21 11:20 ? 次閱讀

跳表這一數(shù)據(jù)結(jié)構(gòu),已經(jīng)成為了Redis面試的高頻考點(diǎn)。前兩年沒這么卷的時(shí)候,可能大家從開始學(xué)習(xí),到拿到大廠offer這一過程,都可能沒聽說過跳表這一數(shù)據(jù)結(jié)構(gòu)。

那什么是跳表呢?它是用來(lái)干啥的?AVL樹紅黑樹知道吧,對(duì),跳表跟他干的事情差不多。我舉個(gè)例子大家就明白了。假設(shè)目前有一個(gè)有序數(shù)列:

[2, 11,22, 33, 44, 52, 63]

我們想基于單鏈表的思想,設(shè)計(jì)一個(gè)數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)查找時(shí)間復(fù)雜度為O(logn)。單鏈表的話,它的結(jié)構(gòu)長(zhǎng)這個(gè)樣子。

當(dāng)然這個(gè)結(jié)構(gòu),查找時(shí)間復(fù)雜度妥妥的O(n),那咋改呢?

那換個(gè)問法:一般做算法題,手撕代碼面試的時(shí)候,當(dāng)咱寫了個(gè)時(shí)間復(fù)雜度為O(n)的解法,面試官搖搖頭,問你有沒有更好的方法,你會(huì)怎么做?

常見復(fù)雜度O(nlogn) O(n) O(logn) O(1),要優(yōu)化,一步步來(lái)的話,只能上O(logn)了,那復(fù)雜度logn最常見的算法是哪個(gè)?當(dāng)然是二分!

思路對(duì)了,那對(duì)著鏈表,咋把二分思想融合進(jìn)去呢?

要不單鏈表指針這邊動(dòng)動(dòng)刀子?讓指針除了指向后面元素,還能越過幾個(gè)節(jié)點(diǎn),指向更后面元素?類似二叉查找樹?先來(lái)看看這個(gè)數(shù)組對(duì)應(yīng)的二叉查找樹長(zhǎng)什么樣。

當(dāng)然,由于我們的結(jié)構(gòu)是單鏈表,所以只能有由小值,指向大值,這個(gè)二叉樹得改改。

好像有點(diǎn)意思在里面了,再把原先單鏈表的性質(zhì)加上。

走線有點(diǎn)凌亂,按單鏈表的布局顯示方式改改:(值得注意的是,我們需要新建一個(gè)數(shù)組項(xiàng),每個(gè)數(shù)組項(xiàng)存儲(chǔ)一個(gè)指針,指向剛剛二叉搜索樹每一層最左側(cè)的節(jié)點(diǎn))

(咋感覺越看越像B+樹了(霧))

來(lái)看個(gè)查找邏輯吧:

當(dāng)查找到的結(jié)點(diǎn)保存的數(shù),比要查找的數(shù)小時(shí),跳表就會(huì)繼續(xù)訪問該層上的下一個(gè)結(jié)點(diǎn)。

當(dāng)不滿足時(shí),跳表就會(huì)用到當(dāng)前查找到的結(jié)點(diǎn)的指針數(shù)組的下一層指針,然后沿著下一層指針繼續(xù)查找。對(duì)于這種數(shù)據(jù)結(jié)構(gòu),我們需要從上往下依次查詢?nèi)齻€(gè)鏈表,比如我們想查大于35的數(shù)字。

首先按左側(cè)數(shù)組第一個(gè)找,發(fā)現(xiàn)中間節(jié)點(diǎn)是33,比較一下比35小。

發(fā)現(xiàn)33比35小,跳下一個(gè)節(jié)點(diǎn)。

發(fā)現(xiàn)該節(jié)點(diǎn)是Null,跳33的下一層節(jié)點(diǎn)。

發(fā)現(xiàn)52比35大,再跳下一層節(jié)點(diǎn)。

發(fā)現(xiàn)44比35大,跳下一層節(jié)點(diǎn),但由于這是最后一層節(jié)點(diǎn),即44是第一個(gè)比33大的數(shù),滿足最終條件,就找到了第一個(gè)比35大的數(shù)字。

我們知道,二叉平衡樹,如果設(shè)計(jì)插入操作,會(huì)特別特別麻煩。對(duì)于由二叉平衡樹思想改的跳表也是如此,對(duì)于我們這邊的情況,每增加,或者減少一個(gè)新節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)的高度都需要變化。。那有沒有高人改進(jìn)呢?

既然把二叉平衡樹改成這四不像了,為啥再不改改,能不能讓他不平衡的同時(shí),還能保證查找效率?

說實(shí)話,還真可以,來(lái)看看這種跳表。

雖然這個(gè)跳表跟咱剛剛講的跳表比起來(lái),奇形怪狀的,但按剛剛的查找思路,還是能做比較好的查詢工作的。

而且既然表都長(zhǎng)這么奇形怪狀了,那添加或者刪新元素,其他節(jié)點(diǎn)高度不變問題也不大了。

而且驚人的是,如果我們對(duì)新插入節(jié)點(diǎn)的高度進(jìn)行隨機(jī)產(chǎn)生(每次隨機(jī)大于p,接著往上加高度,小于p停下來(lái)),然后別的節(jié)點(diǎn)高度保持不變,查找效率還是為O(logn),不會(huì)出現(xiàn)像二叉查找樹那種直接退化成O(logn)的情況。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7122

    瀏覽量

    89349
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    377

    瀏覽量

    10905

原文標(biāo)題:什么?跳表都不知道的你還敢去面BAT!

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TLC555這個(gè)電路的二極管是干什么用的,它是從哪來(lái)的?

    就這個(gè)電路二極管不知道干什么用的,它是從哪來(lái)的? 仿真結(jié)果跟官方的不一樣
    發(fā)表于 11-08 15:37

    電視上的usb是用來(lái)干什么的

    電視上的USB接口是一個(gè)非常實(shí)用的功能,它允許用戶通過USB設(shè)備(如U盤、移動(dòng)硬盤等)直接播放存儲(chǔ)在這些設(shè)備上的多媒體文件,如視頻、音頻、圖片等。此外,USB接口還可以用來(lái)為電視提供額外的功能,比如
    的頭像 發(fā)表于 10-12 10:06 ?3336次閱讀

    LM318 COMP管腳是什么引腳,干什么用的?

    LM318 COMP 管腳是什么引腳,干什么用的,PSPICEFORTI 里面沒有318的COMP管腳在怎么應(yīng)用
    發(fā)表于 07-31 07:45

    音圈電機(jī)是用來(lái)干什么的

    音圈電機(jī)(Voice Coil Motor,簡(jiǎn)稱VCM)是一種利用電磁原理將電能轉(zhuǎn)換為直線運(yùn)動(dòng)的電機(jī)。它廣泛應(yīng)用于各種精密定位系統(tǒng)和驅(qū)動(dòng)設(shè)備中,如硬盤驅(qū)動(dòng)器、光盤驅(qū)動(dòng)器、光學(xué)掃描儀、精密定位臺(tái)等。本文將詳細(xì)介紹音圈電機(jī)的工作原理、結(jié)構(gòu)特點(diǎn)、應(yīng)用領(lǐng)域以及發(fā)展趨勢(shì)。 一、音圈電機(jī)的工作原理 音圈電機(jī)的工作原理基于法拉第電磁感應(yīng)定律和洛倫茲力定律。當(dāng)電流通過線圈時(shí),線圈周圍產(chǎn)生磁場(chǎng)。這個(gè)磁場(chǎng)與永磁體產(chǎn)生的磁場(chǎng)相互作用,產(chǎn)生一個(gè)力,使
    的頭像 發(fā)表于 06-13 11:03 ?762次閱讀

    串口的空閑字符是用來(lái)激活空閑中斷的嗎?

    發(fā)送空閑幀。 \" [size=13.3333px]請(qǐng)問一般這個(gè)東西是怎么用的? [size=13.3333px]用來(lái)干什么的? [size=13.3333px]不知道該怎么激活這個(gè)中斷,有傳統(tǒng)庫(kù)的demo嗎?
    發(fā)表于 05-11 07:28

    請(qǐng)問CUBE中SPI配置的CRC Polynomial多項(xiàng)式是干什么用的?

    初學(xué)STM32,用原子的板子在學(xué),現(xiàn)在學(xué)到SPI,配置的時(shí)候看到這個(gè)東西,請(qǐng)問是干什么用的?和傳統(tǒng)庫(kù)中哪個(gè)匹配的? 而且這個(gè)配置沒有選項(xiàng),貌似全是自己輸入的。
    發(fā)表于 05-07 06:41

    美國(guó)云服務(wù)器是干什么的

    美國(guó)云服務(wù)器主要用于提供計(jì)算資源、托管網(wǎng)站、應(yīng)用程序以及存儲(chǔ)數(shù)據(jù)等。很多用戶想要了解美國(guó)云服務(wù)器具體是干什么的,rak部落小編為您整理發(fā)布美國(guó)云服務(wù)器是干什么的。 美國(guó)云服務(wù)器是一種**基于云
    的頭像 發(fā)表于 04-10 10:16 ?462次閱讀

    合宙功耗分析儀Air9000是用來(lái)干什么的?

    合宙功耗分析儀Air9000,字如其名,就是用來(lái)測(cè)試電子產(chǎn)品的功耗的。
    的頭像 發(fā)表于 03-28 13:37 ?1138次閱讀
    合宙功耗分析儀Air9000是<b class='flag-5'>用來(lái)</b><b class='flag-5'>干什么的</b>?

    請(qǐng)問CYUSB3014芯片的OTG_ID引腳是干什么用的?

    USB3014芯片的OTG_ID引腳是干什么用的??用電阻下拉接地可以嗎? 電阻的大小有要求嗎?
    發(fā)表于 02-29 08:21

    美國(guó)云服務(wù)器是干什么的

    對(duì)于美國(guó)服務(wù)器是干什么的,相信很多小白用戶不是非常了解,接下來(lái)小編就為您整理發(fā)布美國(guó)云服務(wù)器是干什么的相關(guān)資訊,希望對(duì)您有幫助。
    的頭像 發(fā)表于 02-19 09:53 ?468次閱讀

    云服務(wù)器是干什么的

     云服務(wù)器是干什么的?很多小白用戶會(huì)有疑惑,今天小編為您整理云服務(wù)器是干什么的相關(guān)資料,希望對(duì)您了解云服務(wù)器是干什么的有幫助。
    的頭像 發(fā)表于 02-18 09:58 ?1527次閱讀

    電磁爐工作原理 電磁爐板上有個(gè)可調(diào)電位器的作用是干什么的?

    電磁爐工作原理 電磁爐板上有個(gè)可調(diào)電位器的作用是干什么的? 電磁爐是一種利用電磁感應(yīng)原理來(lái)加熱食物的廚房電器。其工作原理是通過電路中的電感線圈產(chǎn)生高頻交變電磁場(chǎng),使鐵制的鑲嵌在爐板下方的發(fā)熱盤產(chǎn)生
    的頭像 發(fā)表于 02-05 10:29 ?2601次閱讀

    法拉電容是干什么用的?

    法拉電容是干什么用的? 法拉電容是一種用于儲(chǔ)存和釋放電荷的電子元件。它是電容器的一種,與傳統(tǒng)的微型電容器相比,法拉電容能夠儲(chǔ)存更多的電能,并且能夠更快速地釋放電能。它的容量單位是法拉(F)。在本文
    的頭像 發(fā)表于 02-02 10:51 ?3880次閱讀

    gpu服務(wù)器是干什么的 gpu服務(wù)器與cpu服務(wù)器的區(qū)別有哪些

    gpu服務(wù)器是干什么的 gpu服務(wù)器與cpu服務(wù)器的區(qū)別 GPU服務(wù)器是一種專門用于處理圖形運(yùn)算的服務(wù)器,而CPU服務(wù)器則是一種處理通用計(jì)算任務(wù)的服務(wù)器。它們之間的主要區(qū)別在于服務(wù)器所搭載的主要
    的頭像 發(fā)表于 01-30 15:31 ?925次閱讀

    什么是溫補(bǔ)晶振?溫補(bǔ)晶振是干什么的?

    什么是溫補(bǔ)晶振?溫補(bǔ)晶振是干什么的?? 溫補(bǔ)晶振是指對(duì)晶體振蕩器進(jìn)行溫度補(bǔ)償?shù)囊环N技術(shù)。晶體振蕩器是一種電子設(shè)備,通過驅(qū)動(dòng)晶體諧振頻率上的機(jī)械振動(dòng)來(lái)產(chǎn)生穩(wěn)定的電信號(hào)。它在現(xiàn)代電子設(shè)備中廣泛應(yīng)用,如
    的頭像 發(fā)表于 01-23 16:42 ?1204次閱讀