數(shù)據(jù)結(jié)構(gòu)之 2-3 Tree

From cnblogs yangecnu / cnblogs 有心故我在 / wikipedia 2-3 tree


定義

The 2-3 tree is also a search tree like the binary search tree, but this tree tries to solve the problem of the unbalanced tree.
Imagine that you have a binary tree to store your data. The worst possible case for the binary tree is that all of the data is entered in order. Then the tree would look like this:


This tree has basically turned into a linked list. This is definitely a problem, for with a tree unbalanced like this, all of the advantages of the binary search tree disappear: searching the tree is slow and cumbersome, and there is much wasted memory because of the empty left child pointers.

In computer science, a 2–3 tree is a tree data structure, where every node with children internal node has either two children (2-node) and one data element or three children (3-nodes) and two data elements. According to Knuth, "a B-tree of order 3 is a 2-3 tree." Nodes on the outside of the tree leaf nodes have no children and one or two data elements. 2?3 trees were invented by John Hopcroft in 1970.

2 node


3 node

  • The 2-3 tree tries to solve this by using a different structure and slightly different adding and removing procedure to help keep the tree more or less balanced. The biggest drawback with the 2-3 tree is that it requires more storage space than the normal binary search tree.

  • One big difference with the 2-3 tree is that each node can have up to two data fields. You can see the three children extending from between the two data fields.


  • 2–3 trees are balanced, meaning that each right, center, and left subtree contains the same or close to the same amount of data.

<Wikipedia>
We say that an internal node is a 2-node if it has one data element and two children.
We say that an internal node is a 3-node if it has two data elements and three children.
We say that T is a 2–3 tree if and only if one of the following statements hold:

  • T is empty. In other words, T does not have any nodes.
  • T is a 2-node with data element a. If T has left child L and right child R, then
      L and R are non-empty 2–3 trees of the same height;
      a is greater than each element in L; and
      a is less than or equal to each data element in R.
  • T is a 3-node with data elements a and b, where a < b. If T has left child L, middle child M, and right child R, then
      L, M, and R are non-empty 2–3 trees of equal height;
      a is greater than each data element in L and less than or equal to each data element in M; and
      b is greater than each data element in M and less than or equal to each data element in R.

一棵2-3樹具有下例性質(zhì):

  • 一個(gè)節(jié)點(diǎn)包含一個(gè)或者兩個(gè)關(guān)鍵碼;
  • 每個(gè)內(nèi)部節(jié)點(diǎn)有2個(gè)子女(如果它包含一個(gè)關(guān)鍵碼),或者3個(gè)子女(包含2個(gè)關(guān)鍵碼);
  • 所有葉子節(jié)點(diǎn)在樹的同一層,因此樹總是高度平衡的。
  • 2-3樹每一個(gè)節(jié)點(diǎn)的左子樹中所有后繼節(jié)點(diǎn)的值都小于其父節(jié)點(diǎn)第一個(gè)關(guān)鍵碼的值;
  • 而中間子樹所有后繼節(jié)點(diǎn)的值都大于或等于其父節(jié)點(diǎn)第一個(gè)關(guān)鍵碼的值而小于第二個(gè)關(guān)鍵碼的值;
  • 如果有右子樹,則右子樹所有后繼節(jié)點(diǎn)都大于或等于其父節(jié)點(diǎn)第二個(gè)關(guān)鍵碼的值。

另一種解釋:

  1. 對(duì)于2節(jié)點(diǎn),該節(jié)點(diǎn)保存一個(gè)key及對(duì)應(yīng)value,以及兩個(gè)指向左右節(jié)點(diǎn)的節(jié)點(diǎn),左節(jié)點(diǎn)也是一個(gè)2-3節(jié)點(diǎn),所有的值都比key有效,有節(jié)點(diǎn)也是一個(gè)2-3節(jié)點(diǎn),所有的值比key要大。
  2. 對(duì)于3節(jié)點(diǎn),該節(jié)點(diǎn)保存兩個(gè)key及對(duì)應(yīng)value,以及三個(gè)指向左中右的節(jié)點(diǎn)。左節(jié)點(diǎn)也是一個(gè)2-3節(jié)點(diǎn),所有的值均比兩個(gè)key中的最小的key還要小;中間節(jié)點(diǎn)也是一個(gè)2-3節(jié)點(diǎn),中間節(jié)點(diǎn)的key值在兩個(gè)跟節(jié)點(diǎn)key值之間;右節(jié)點(diǎn)也是一個(gè)2-3節(jié)點(diǎn),節(jié)點(diǎn)的所有key值比兩個(gè)key中的最大的key還要大。

如果中序遍歷2-3查找樹,就可以得到排好序的序列。在一個(gè)完全平衡的2-3查找樹中,根節(jié)點(diǎn)到每一個(gè)為空節(jié)點(diǎn)的距離都相同。

查找

在進(jìn)行2-3樹的平衡之前,我們先假設(shè)已經(jīng)處于平衡狀態(tài),我們先看基本的查找操作。
  2-3樹的查找和二叉查找樹類似,要確定一個(gè)樹是否屬于2-3樹,我們首先和其跟節(jié)點(diǎn)進(jìn)行比較,如果相等,則查找成功;否則根據(jù)比較的條件,在其左中右子樹中遞歸查找,如果找到的節(jié)點(diǎn)為空,則未找到,否則返回。查找過程如下圖:


插入

一、往一個(gè)2-node節(jié)點(diǎn)插入

往2-3樹中插入元素和往二叉查找樹中插入元素一樣,首先要進(jìn)行查找,然后將節(jié)點(diǎn)掛到未找到的節(jié)點(diǎn)上。2-3樹之所以能夠保證在最差的情況下的效率的原因在于其插入之后仍然能夠保持平衡狀態(tài)。如果查找后未找到的節(jié)點(diǎn)是一個(gè)2-node節(jié)點(diǎn),那么很容易,我們只需要將新的元素放到這個(gè)2-node節(jié)點(diǎn)里面使其變成一個(gè)3-node節(jié)點(diǎn)即可。但是如果查找的節(jié)點(diǎn)結(jié)束于一個(gè)3-node節(jié)點(diǎn),那么可能有點(diǎn)麻煩。


二、往一個(gè)3-node節(jié)點(diǎn)插入

往一個(gè)3-node節(jié)點(diǎn)插入一個(gè)新的節(jié)點(diǎn)可能會(huì)遇到很多種不同的情況,下面首先從一個(gè)最簡(jiǎn)單的只包含一個(gè)3-node節(jié)點(diǎn)的樹開始討論。

(1)只包含一個(gè)3-node節(jié)點(diǎn)

  如上圖,假設(shè)2-3樹只包含一個(gè)3-node節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)有兩個(gè)key,沒有空間來插入第三個(gè)key了,最自然的方式是我們假設(shè)這個(gè)節(jié)點(diǎn)能存放三個(gè)元素,暫時(shí)使其變成一個(gè)4-node節(jié)點(diǎn),同時(shí)他包含四個(gè)子節(jié)點(diǎn)。然后,我們將這個(gè)4-node節(jié)點(diǎn)的中間元素提升,左邊的節(jié)點(diǎn)作為其左節(jié)點(diǎn),右邊的元素作為其右節(jié)點(diǎn)。插入完成,變?yōu)槠胶?-3查找樹,樹的高度從0變?yōu)?。

(2)節(jié)點(diǎn)是3-node,父節(jié)點(diǎn)是2-node

和第一種情況一樣,我們也可以將新的元素插入到3-node節(jié)點(diǎn)中,使其成為一個(gè)臨時(shí)的4-node節(jié)點(diǎn),然后,將該節(jié)點(diǎn)中的中間元素提升到父節(jié)點(diǎn)即2-node節(jié)點(diǎn)中,使其父節(jié)點(diǎn)成為一個(gè)3-node節(jié)點(diǎn),然后將左右節(jié)點(diǎn)分別掛在這個(gè)3-node節(jié)點(diǎn)的恰當(dāng)位置。操作如下圖:


(3)節(jié)點(diǎn)是3-node,父節(jié)點(diǎn)也是3-node

當(dāng)我們插入的節(jié)點(diǎn)是3-node的時(shí)候,我們將該節(jié)點(diǎn)拆分,中間元素提升至父節(jié)點(diǎn),但是此時(shí)父節(jié)點(diǎn)是一個(gè)3-node節(jié)點(diǎn),插入之后,父節(jié)點(diǎn)變成了4-node節(jié)點(diǎn),然后繼續(xù)將中間元素提升至其父節(jié)點(diǎn),直至遇到一個(gè)父節(jié)點(diǎn)是2-node節(jié)點(diǎn),然后將其變?yōu)?-node,不需要繼續(xù)進(jìn)行拆分。


(4)根節(jié)點(diǎn)分裂

當(dāng)根節(jié)點(diǎn)到字節(jié)點(diǎn)都是3-node節(jié)點(diǎn)的時(shí)候,這是如果我們要在字節(jié)點(diǎn)插入新的元素的時(shí)候,會(huì)一直查分到跟節(jié)點(diǎn),在最后一步的時(shí)候,跟節(jié)點(diǎn)變成了一個(gè)4-node節(jié)點(diǎn),這個(gè)時(shí)候,就需要將跟節(jié)點(diǎn)查分為兩個(gè)2-node節(jié)點(diǎn),樹的高度加1,這個(gè)操作過程如下:


(5)本地轉(zhuǎn)換

將一個(gè)4-node拆分為2-3node涉及到6種可能的操作。這4-node可能在跟節(jié)點(diǎn),也可能是2-node的左子節(jié)點(diǎn)或者右子節(jié)點(diǎn)。或者是一個(gè)3-node的左,中,右子節(jié)點(diǎn)。所有的這些改變都是本地的,不需要檢查或者修改其他部分的節(jié)點(diǎn)。所以只需要常數(shù)次操作即可完成2-3樹的平衡。


(6)性質(zhì)

這些本地操作保持了2-3樹的平衡。對(duì)于4-node節(jié)點(diǎn)變形為2-3節(jié)點(diǎn),變形前后樹的高度沒有發(fā)生變化。只有當(dāng)跟節(jié)點(diǎn)是4-node節(jié)點(diǎn),變形后樹的高度才加一。如下圖所示:


分析

完全平衡的2-3查找樹如下圖,每個(gè)根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的距離是相同的:



2-3樹的查找效率與樹的高度是息息相關(guān)的。

  • 在最壞的情況下,也就是所有的節(jié)點(diǎn)都是2-node節(jié)點(diǎn),查找效率為lgN
  • 在最好的情況下,所有的節(jié)點(diǎn)都是3-node節(jié)點(diǎn),查找效率為log3N約等于0.631lgN
    距離來說,對(duì)于1百萬個(gè)節(jié)點(diǎn)的2-3樹,樹的高度為12-20之間,對(duì)于10億個(gè)節(jié)點(diǎn)的2-3樹,樹的高度為18-30之間。
      對(duì)于插入來說,只需要常數(shù)次操作即可完成,因?yàn)樗恍枰薷呐c該節(jié)點(diǎn)關(guān)聯(lián)的節(jié)點(diǎn)即可,不需要檢查其他節(jié)點(diǎn),所以效率和查找類似。下面是2-3查找樹的效率:


實(shí)現(xiàn)

直接實(shí)現(xiàn)2-3樹比較復(fù)雜,因?yàn)椋?br> 1.需要處理不同的節(jié)點(diǎn)類型,非常繁瑣
2.需要多次比較操作來將節(jié)點(diǎn)下移
3.需要上移來拆分4-node節(jié)點(diǎn)
4.拆分4-node節(jié)點(diǎn)的情況有很多種

2-3查找樹實(shí)現(xiàn)起來比較復(fù)雜,在某些情況插入后的平衡操作可能會(huì)使得效率降低。在2-3查找樹基礎(chǔ)上改進(jìn)的紅黑樹不僅具有較高的效率,并且實(shí)現(xiàn)起來較2-3查找樹簡(jiǎn)單。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,697評(píng)論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,772評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,973評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評(píng)論 1 285
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,644評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,953評(píng)論 2 373

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,762評(píng)論 0 33
  • 一、【時(shí)間】: 兩個(gè)月(20161206~20170206) 二、【目標(biāo)】: 完成本年度的業(yè)績(jī)目標(biāo)(剩最后...
    賴星閱讀 219評(píng)論 0 0
  • 如何做修正精桂子代理違信vca3218給你解析 打破傳統(tǒng)市場(chǎng) 我們公司有六大培訓(xùn)系統(tǒng) 實(shí)戰(zhàn)系統(tǒng) 打造系統(tǒng) 裂變系統(tǒng)...
    修正精桂子閱讀 339評(píng)論 0 0
  • 一 城市空氣不好,我決定下鄉(xiāng)走走。也沒有傳說中的藍(lán)天白云,確是清風(fēng)入耳甚是愜意。黃昏時(shí)去了村頭的一家小店,聽說老板...
    雙耳不聞閱讀 486評(píng)論 0 1
  • 我在佛前跪問 到底還有多少因果 前世的債還沒有還 我的眼淚為何還在流 我的心還是不得安寧 對(duì)待自己的親人如此苛刻 ...
    鞠子_cbf4閱讀 197評(píng)論 0 4