普通樹,乙個節點只能儲存乙個元素,在元素非常多的時候,就使得要麼樹的度非常大,要麼樹的高度非常大,甚至兩者都必須足夠大才行。顯然,訪問的時候使得記憶體訪問次數非常多,是時間效率上的瓶頸。
多路查詢樹(multi-way search trees),其每乙個節點的孩子數可以多於兩個,且每乙個節點處可以儲存多個元素。由於它是查詢樹,所有的元素之間存在某種特定的排序關係。
常見的四種特殊形式:2-3樹,2-3-4樹,b樹,b+樹。
2-3樹特點:樹中每乙個節點都具有兩個孩子或三個孩子,不存在其他目的孩子(葉子沒有孩子);所有葉子位於同一層次上。比如:乙個2節點包含乙個元素和兩個孩子,不能只有乙個孩子,可以沒有孩子,其中,左子樹小於該元素,右子樹大於該元素。乙個3節點包含一大一小兩個元素和三個孩子(也可以沒有孩子,但不可以是其他數目的孩子),左子樹小於較小的元素,中子樹介於較小和大元素之間,右子樹大於較大元素。
2-3樹複雜之處在於新節點的插入和已有節點的刪除。因為,要保證操作後還是有效的2-3樹。而每個節點也有可能是2節點也可能是3節點,要保證所有葉子節點都在同一層次上。
例如:一顆2-3樹,插入乙個節點。
對左側2-3樹插入乙個3,首先,根據遍歷,3比8小,比4小,於是只能考慮插入到葉子節點1所在的位置,考慮到所有葉子節點都在同一層,就將1位置變成3節點。
如果向2-3樹中3節點插入元素,則有幾種情況。
一是,向6 7這個三節點插入5,將三節點拆分,讓雙親變成三節點,5成為中孩子,7成為右孩子。
二是,雙親本來是三節點,如:向2-3樹中插入11,只能往雙親的雙親上轉移,將12轉移到8的位置構成三節點,原雙親的左子樹變成新三節點的中子樹(三節點葉子變成左右孩子),原雙親剩下的較大元素構成新三節點的右子樹。
三是,在2-3樹上插入2,但此時1 3節點,4 6節點,8 12節點都已經是三節點了。
這就表示,當前的樹結構不滿足需要,需要增加一層。但所有葉子節點都必須在同一層。所以根節點會有如此變化。將1 3 拆分,4 6 拆分,8 12拆分。
最終如右圖所示。1 3 拆分,2插入為子根節點,3為右孩子;4 6拆分,4為子根節點,2子樹為左孩子,6為右子樹,5為6的左葉子,7為右葉子。8 12 拆分,8為根節點,4為左子樹,12為右子樹,10為12的左子樹,14為12的右子樹。通過拆分操作,整個樹長高一層。
按照有效2-3樹的特徵,刪除節點也可同樣推理。
未完待續……
b-tree
B樹(B tree, 平衡的多路查詢樹)的相關知識
目錄 多路搜尋樹 b樹 b 樹 首先,介紹一下2 3樹,指的是其中每乙個節點2結點 有兩個孩子或者3結點 三個孩子或者沒有孩子,2節點指的是該節點有乙個元素和兩個孩子or沒有孩子,3節點指的是該節點有兩個元素 一大一小 和三個孩子or沒有孩子。特點是所有葉子節點都在同一層,插入和刪除節點都必須保證順...
多路查詢樹
二叉樹的操作效率較高,但是也存在問題,請看下面的二叉樹 二叉樹需要載入到記憶體的,如果二叉樹的節點少,沒有什麼問題,但是如果二叉樹的節點很多 比如1億 就 存在如下問題 問題1 在構建二叉樹時,需要多次進行i o操作 海量資料存在資料庫或檔案中 節點海量,構建二叉樹時,速度有影響 問題2 節點海量,...
多路查詢樹
二叉樹的操作效率較高,但也存在問題 二叉樹需要載入到記憶體,如果二叉樹的節點少,沒有什麼問題,但是如果二叉樹的節點很多 比如1億 就存在如下問題 問題1 在構建二叉樹時,需要多次進行io操作 海量資料存在資料庫或檔案中 節點海量,構建二叉樹時,速度有影響 問題2 節點海量,也會造成二叉樹的高度很大,...