平衡二叉排序樹便於動態查詢,因此用平衡二叉排序樹來組織索引表是一種可行的選擇。當用於大型資料庫時,所有資料及索引都儲存在外存,因此,
涉及到內、外存之間頻繁的資料交換
,這種交換速度的快慢成為制約動態查詢的瓶頸。若以二叉樹的結點作為內、外存之間資料交換單位,則查詢給定關鍵字時對磁碟平均進行㏒㏒次訪問是不能容忍的(
樹的深度過大而造成磁碟i/o讀寫過於頻繁,進而導致查詢效率低下)。
磁碟讀取資料是以盤塊(block)為基本單位的。位於同一盤塊中的所有資料都能被一次性全部讀取出來。而磁碟io代價主要花費在查詢時間ts上。因此我們應該盡量將相關資訊存放在同一盤塊,同一磁軌中。或者至少放在同一柱面或相鄰柱面上,以求在讀/寫資訊時儘量減少磁頭來回移動的次數,避免過多的查詢時間ts。
所以,在大規模資料儲存方面,大量資料儲存在外存磁碟中,而在外存磁碟中讀取
/寫入塊
(block)
中某資料時,首先需要定位到磁碟中的某塊,如何有效地查詢磁碟中的資料,需要一種合理高效的外存資料結構,就是下面所要重點闡述的
b-treeb+-tree結構和b*-tree結構。
因此,必須選擇一種能盡可能降低磁碟i/oi/o次數的索引組織方式。樹結點的大小盡可能地接近頁的大小。
b樹主要用於檔案系統中,
在b樹中,每個節點的大小為乙個磁碟的頁
,節點中鎖包含的關鍵字及其子節點的數目取決於頁的大小。乙個度為m的b樹,稱為m階b樹,定義如下:
(1)乙個m階b樹,或者是空樹,或者滿足一下性質的m叉樹;
(2)根節點或者是葉子,或者至少有兩顆子樹,至多是m棵子樹;
(3)除根節點外,所有非終端節點至少是「m/2 (向上取整)棵子樹,至多是m棵子樹;
(4)所有葉子節點都在樹的同一層上。
下圖為b樹的乙個例子:
1,b樹的資料結構,根據以上的資訊,定義b樹的資料結構如下:
//節點資料結構的定義
typedef struct btnode
btnode;
2,b樹的查詢
查詢的基本思想是:
(1)從樹的根節點t開始,在節點中利用遍歷或折半查詢給定的值,如果找到,則返回節點指標和在節點中的位置;如果沒有,則到(2)
(2)與節點中的key進行比較,找到給定值左右key中間的指標,去其子樹中查詢
(3)重複執行1,2兩步,直到找到。如果直到葉子節點,仍未找到,則返回0,並返回最後搜尋的葉子節點。(此節點是給定值需要插入的位置)
3,b樹的插入
插入新節點的基本思想如下:
(1)在b樹查詢關鍵字,如果找到,則不插入;否則,執行(2)
(2)將給定值插入到葉子節點中,如果:
a,葉子的節點數
b,葉子的節點數=m-1:插入節點,並將節點**。**的方式是將該節點拆分成兩個節點,然後,將中間節點插入到父節點當中,拆分後的兩個節點,分別作為插入到父節點的中間節點的左右子。如果中間節點插入到父節點後,仍然需要**,則繼續**,直到根節點。如果仍然需要**,則新建乙個根節點,將**後的兩個節點分別作為新根節點的兩個子節點。
例如如下圖:
紅黑樹,B樹,B 樹,B 樹 理解
紅黑樹rbtree 二叉排序樹 map 就是採用紅黑樹儲存的,紅黑樹 rb tree 是平衡二叉樹,其優點就是樹到葉子節點深度一致,查詢的效率也就一樣,為logn.在實行查詢,插入,刪除的效率都一致,而當是全部靜態資料時,沒有太多優勢,可能採用hash表各合適。hash map是乙個hash tab...
b樹和b 樹簡單描述
資料庫的b樹和b 樹,b樹的非葉子節點儲存資料,而乙個葉子節點對應的是檔案系統的乙個資料單元,也是磁碟上的一頁512,當既儲存資料,又儲存索引key值時 乙個節點的大小有限,既有資料又有key值,當樹的深度比較深時,必然會需要多次io才能找到key值 必然導致,查詢底層資料會經歷更多次的io,同時乙...
b樹與b 樹原理解析
b樹 balance tree 和b 樹應用在資料庫索引,可以認為是m叉的多路平衡查詢樹,但是從理論上講,二叉樹查詢速度和比較次數都是最小的,為什麼不用二叉樹呢?因為我們要考慮磁碟io的影響,它相對於記憶體來說是很慢的。資料庫索引是儲存在磁碟上的,當資料量大時,就不能把整個索引全部載入到記憶體了,只...