b樹(b-tree)是為磁碟或者其他直接訪問輔存而設計的一種平衡搜尋樹,b樹類似於紅黑樹,但他在降低i/o運算元方面要更好一些,並且許多資料庫使用b樹或者b樹的變種來儲存資訊,所以我們需要說一下磁碟作為背景
如fig2-20,磁碟是由多個鋁盤疊成,每個磁表面有自己的磁頭和磁碟臂
如fig2-21,乙個碟片有多個磁軌(track,每個圓環),乙個磁軌被分為多個扇區(sector),每個扇區訪問512位元組
的資料區,如fig2-19,資料區前有前導區(preamble)和糾錯碼(ecc),連續兩個扇區之間有隔離帶(intersector gap)
磁碟原理: 磁頭中有正或者負電通過時,就可磁化磁頭正下方的磁碟表面,使磁性顆粒朝左或者朝右偏轉,這就寫入了
磁頭通過磁性區域時,將被感應出正電路或者負電流,這樣就讀出了存在磁碟的資料位
1. 尋道:尋找磁軌,5~10ms(相鄰<1ms)
2. 旋**旋轉磁軌對應扇區至磁頭下,旋轉半圈為3~6ms
3. 讀寫:512位元組扇區約3.5us
花費都在尋道和旋轉上
大規模資料訪問,磁碟維護了檔案的索引目錄,找個檔案的索引就可以找個檔案在磁碟中正真的位置。
但由於磁碟讀取是乙個扇區乙個扇區的讀取,每當讀取乙個扇區後,我們需要將結點資訊讀到記憶體中判斷我們要找的檔案目錄索引是不是在這裡。
所以訪問扇區數對應了我們i/o運算元,由上面我們已經知道了i/o操作花費的時間是大部分的。
於是我們讀取結論:減少訪問扇區數,也就是減少了i/o操作,也就節省了時間,所以選擇乙個合理的資料結構大大幫助我們讀取磁碟,b-tree就來了
b樹(b-tree)是為磁碟或者其他直接訪問輔存而設計的一種平衡搜尋樹,b樹類似於紅黑樹,但他在降低i/o運算元方面要更好一些,並且許多資料庫使用b樹或者b樹的變種來儲存資訊
是一種平衡的多路查詢樹,檔案系統中很有用
m階b-tree中(m叉)
三個約束
1.樹中的每個結點至多有m棵子樹 【插入需要用到這個約束】
2.除根之外的所有非終端結點至少有 ⌈m/2⌉棵子樹 【刪除需要用到這個約束】
3.根節點若不是葉子結點,則至少兩棵子樹 【根的約束】
關鍵字與指標的數量關係是
指標=關鍵字+1,即每個節點關鍵字個數最多為m-1
k i-1
< (a
i-1) < k
i指標(a
i-1)所指的子樹的所有結點所有關鍵字均<
k
i指標(a
i-1)所指的子樹的所有結點所有關鍵字均>
k
i-1
葉子f所有的葉子結點都出現在同一層次,並且不帶資訊(可以看作是外部結點或查詢失敗的結點,實際上這些結點不存在,指向這些結點的指標為空)
假設每個key含有檔案的正真位置,且每個節點代表乙個扇區
b-樹的查詢過程與二叉排序樹查詢類似,一路下去找,上面為演示尋找29,所以我們就找到了29檔案的,詳細寫就是
找到檔案目錄的根扇區,將結點資訊匯入記憶體(29<35 定位左邊子樹指標)(1次i/o操作)
根據左邊子樹指標,我們定位到該扇區,將結點資訊匯入記憶體(29>27 定位右邊子樹指標)(2次i/o操作)
根據左邊子樹指標,我們定位到該扇區,將結點資訊匯入記憶體(29=29 找到檔案正真位置)(3次i/o操作)
進行正真的i/o操作
一棵m階的樹,每次新增乙個關鍵字不是在樹中新增乙個葉子結點,而是首先在最底層的某個非終端結點中新增乙個關鍵字,若該結點關鍵字個數不超過m-1,則插入完成,否則要產生結點「**」
執行流程
尋找到在**插入(定是在最底層的某個非終端結點中),然後按序新增乙個關鍵字
**規則(插入第m個元素時需要**情況)
第⌈m/2⌉
插入到雙親(向上取整,有小數就取1),也就是最中間的是分界點,兩邊各自形成新節點
執行流程
從動畫中可以看出,因為該結點的數量超過2了,需要**,關鍵字37帶著前後兩個指標走了形成新的結點,關鍵字26帶著前後兩個指標走了形成新的結點,剩下的30去插入到雙親結點中,發現該結點沒有超過兩個,成功。
假如超過2個,關鍵字30插入過去的結點需要**,也就是執行上述類似過程,比如在最左邊的葉結點插入10
一棵m階的樹,刪除關鍵字ki
,首先應該找到該關鍵字所在結點
則可以使用指標ai
中所指的最小關鍵字y
代替ki
(ki的前驅或者後繼),然後刪除關鍵字y
,讓b-樹的刪除轉化為最底層的某個非終端結點
操作,如下圖刪除45的情況
是最底層的某個非終端結點中,刪除後,其中的子樹數目不少於⌈m/2⌉
,則刪除完成,
左(右)兄弟可藉:所刪關鍵字結點的子樹數目少於⌈m/2⌉
,而其相鄰的左(或右)兩兄弟的子樹數目⌈m/2⌉
,則需要將其兄弟結點中最小的(或最大)的關鍵字上移到雙親結點中,而將雙親結點中小於(或大於)且緊貼該上移關鍵字的關鍵字下下移至被刪除關鍵字所在結點中。下面是刪除50的動畫演示【開始圖是上乙個刪除45的圖】
左(右)兄弟不可借:所刪關鍵字結點的子樹數目少於⌈m/2⌉
,而其相鄰的左(或右)兩兄弟的子樹數目等於⌈m/2⌉
,假設該結點有右兄弟,且其右兄弟結點位址由雙親結點中的指標ai
,則刪去關鍵字之後,他所在結點剩餘的關鍵字和指標,加上雙親結點的關鍵字ki
一起,合併到ai所指的兄弟結點中(若沒有右兄弟,則合併到左兄弟結點中)。下面是刪除53的動畫演示【開始圖是上乙個刪除50的結果】
Btree 與 Btree 的區別
mysql 的優化,主要就是索引的優化。因而需要對索引的資料結構有乙個了解。最常用的索引就是b tree 索引,而且b tree 是由btree 演變而來。在講解btree 之前,首先說一下系統對磁碟的讀取。計算機系統通過將磁碟的內容讀入記憶體中然後才對資料進行操作。當然不可能將全部磁碟的內容讀入記...
B Tree與B Tree 的區別
1 b 樹的關鍵字和記錄是放在一起的,葉子節點可以看作外部節點,不包含任何資訊 b 樹的非葉子節點中只有關鍵字和指向下乙個節點的索引,記錄只放在葉子節點中。2 在b 樹中,越靠近根節點的記錄查詢時間越快,只要找到關鍵字即可確定記錄的存在 而b 樹中每個記錄的查詢時間基本是一樣的,都需要從根節點走到葉...
flash與動畫 打字動畫
最近看了一篇關於打字的動畫效果。覺得對一些實驗有所幫助,於是快速寫了乙個用於呈現一種打字的效果。這種效果可以用於對話的效果。原理 利用字串的選取讓其產生乙個錯覺效果。字串的操作有substring 和substr 這兩個擷取字串的函式。利用這個就可以對一段文字任意選取。從而產生乙個動畫 效果過程。打...