linux红黑树节点没有数据,真正理解红黑树,真正的(Linux内核里大量用到的数据 -电脑资料...
作為一種數(shù)據(jù)結(jié)構(gòu),紅黑樹(shù)可謂不算樸素,因?yàn)楦鞣N宣傳讓它過(guò)于神秘,網(wǎng)上搜羅了一大堆的關(guān)于紅黑樹(shù)的文章,不外乎千篇一律,介紹概念,分析性能,貼上代碼,然后給上罪惡的一句話(huà),它最壞情況怎么怎么地...
1.查找-在高度不在寬度對(duì)于查找而言,如果一棵二叉樹(shù)的高度是N,那么最多可以在N步內(nèi)完成查找,這個(gè)不用解釋,解釋這個(gè)有點(diǎn)喧賓奪主了,
2.二叉樹(shù)的不平衡根源一棵樹(shù)在查找看來(lái)變得不平衡是因?yàn)樽訕?shù)的高度相差很大。
3.多叉樹(shù)-寬度換高度在第1節(jié)以及第2節(jié),我們已經(jīng)知道,樹(shù)的寬度越大,高度越小,這樣查詢(xún)起來(lái)越快,Cisco路由器里不是有256叉乃至1024叉樹(shù)嗎?但是這樣真的很好嗎?對(duì)于稀疏節(jié)點(diǎn),這樣會(huì)嚴(yán)重消耗內(nèi)存。
4.權(quán)衡-2,3樹(shù)我們發(fā)現(xiàn),道生一,一生二,二叉樹(shù)是一個(gè)完美的開(kāi)始,但是我們發(fā)現(xiàn)它特別容易傾斜,傾斜的時(shí)候別觸摸。我們也不能一下子就上256叉樹(shù),即使那樣在海量節(jié)點(diǎn)情況下也抗不住,因此這種盲目寬度換高度的方案沒(méi)有可擴(kuò)展性。我們需要找出一種動(dòng)態(tài)的機(jī)制,讓一棵樹(shù)動(dòng)態(tài)調(diào)整保持平衡。
5.2-3樹(shù)的平衡變換如果是二叉樹(shù),那么你插入一個(gè)節(jié)點(diǎn),你只有最多1次機(jī)會(huì)保持子樹(shù)的高度不變,如果是一個(gè)三叉樹(shù),那么就有2次機(jī)會(huì)。現(xiàn)在開(kāi)始,我們?yōu)槎鏄?shù)添了一叉,變成了三叉樹(shù)。
1).插入的新葉子節(jié)點(diǎn)的父節(jié)點(diǎn)是一個(gè)二叉節(jié)點(diǎn)這種情況最簡(jiǎn)單,二叉節(jié)點(diǎn)變?nèi)婀?jié)點(diǎn)即可,如下圖所示:
vc+4tNTToaPK99fcysfSqrOkuN+1xKOssaOz1sa9uuK1xLe9yr2+zcrHzazKsbOkuN+jrLb41eLKx7K7v8nE3LXEo6yy5cjr0ru49r3atePWu8TcyMO4w73atePL+dTatcTX08r3s6S436GjyLu2+KOsyOe5+8TcvavV4rj20MXPosnPyf21vbj5sr+jrNTauPmyv7OkuN+jrL7NyrXP1sHLobDNrMqxs6S436Gxo6E8YnIgLyZndDsgICAgICAgu7nKx9Gt18XJz8PmtcTEx7j2y7zCt6OsztLDx7zM0PjU9rzTyvey5rXEyv3Bv6OsztLDx7DRy/zU9rzTtb00o6HQwr3ateO1xLLlyOvI58/CzbzL+cq+o7o8YnIgLyZndDs8YnIgLyZndDs8aW1nIHNyYz0="https://img-blog.csdn.net/20150627234418953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG9nMjUw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="\" />
很遺憾,沒(méi)有完成任務(wù),但是最終我們提出了兩個(gè)問(wèn)題,只要解決了這兩個(gè)問(wèn)題,所有問(wèn)題就解決了,真正理解紅黑樹(shù),真正的(Linux內(nèi)核里大量用到的數(shù)據(jù)》(https://www.unjs.com)。解決這兩個(gè)問(wèn)題,無(wú)疑都要牽扯到節(jié)點(diǎn)P的父節(jié)點(diǎn)以及再往上的節(jié)點(diǎn),有兩種可能:
可能性1:P的父節(jié)點(diǎn)PP是一個(gè)二叉節(jié)點(diǎn)
問(wèn)題2解決。可能性2:P的父節(jié)點(diǎn)PP是一個(gè)三叉節(jié)點(diǎn)
最后,我們發(fā)現(xiàn),在遞歸的過(guò)程中,要么碰到了P..P是個(gè)二叉節(jié)點(diǎn),此時(shí)按照問(wèn)題2的解決方式將當(dāng)前節(jié)點(diǎn)的值直接提到P...P中,其子樹(shù)降低一個(gè)高度,抵消增加的高度,平衡保持,遞歸結(jié)束,要么遞歸到了根節(jié)點(diǎn),此時(shí)只需要一個(gè)分裂操作即可完美結(jié)束!
6.演進(jìn)到紅黑樹(shù)很顯然,通過(guò)上面的描述,我們似乎找到了一個(gè)使樹(shù)保持平衡的方案,而且是相當(dāng)完美的平衡!核心就是寬度和高度之間的博弈。我們總是可以用一個(gè)寬度抵消一層高度,整個(gè)過(guò)程就是一次或者多次的一加一減,最終的結(jié)果還是0!
看到了吧,紅色節(jié)點(diǎn)就是從2-3樹(shù)中分出來(lái)的,為了維持一棵二叉樹(shù)而不是2-3樹(shù),必須將三叉節(jié)點(diǎn)變成二叉節(jié)點(diǎn),這是一個(gè)寬度換高度得回退,即高度換寬度,當(dāng)然代價(jià)就是不再完美平衡。按照以上的這個(gè)變換,你自己試試看,可以變出兩個(gè)連續(xù)的紅節(jié)點(diǎn)嗎?NO!還在糾結(jié)紅黑樹(shù)的性質(zhì)概念嗎?看了它的演進(jìn),你會(huì)發(fā)現(xiàn),很多紅黑樹(shù)的復(fù)雜概念和讓人沒(méi)有頭緒的性能都是自然而然的。下面我們來(lái)看一下它的最壞情況是什么。
還是以2-3樹(shù)分析,如果在一棵2-3樹(shù)中,最左邊路徑上的節(jié)點(diǎn)全部是三叉節(jié)點(diǎn),而最右邊路徑上的節(jié)點(diǎn)都是二叉節(jié)點(diǎn),那么把它變換成二叉紅黑樹(shù)之后,就會(huì)發(fā)現(xiàn)最左邊的路徑上是紅黑間隔的節(jié)點(diǎn),而最右邊的路徑上全部是黑節(jié)點(diǎn),它們的高度差接近2倍。出現(xiàn)這樣的情況是令人悲哀的,但是也是極低概率的。
紅黑樹(shù)的所有包括旋轉(zhuǎn)等操作,都可以映射到2-3樹(shù)中,而我們對(duì)2-3樹(shù)以及高度和寬度之間的博弈已經(jīng)足夠理解了。請(qǐng)?jiān)俅稳ダ斫饧t黑樹(shù)吧,再看看它的性質(zhì)和概念,together with左旋和右旋,是不是有一種新的體會(huì)呢?
總結(jié)
以上是生活随笔為你收集整理的linux红黑树节点没有数据,真正理解红黑树,真正的(Linux内核里大量用到的数据 -电脑资料...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jsp中导入jsf标签库_初学jsf,自
- 下一篇: linux jlink软件安装,LINU