文件储存树的理解(ISAM 和 B+Tree)
兩種文件儲存樹的理解(ISAM 和 B+Tree)
1. 文件簡要概括
如何儲存文件?如何快速的查找到所需文件?我們需要引入索引(index)這個概念。想象在圖書館中的分類,每一本書都有一個所屬區域、類別、獨一無二的id。根據這些索引信息,我們就能在書海中快速查找到特定的書籍。那對計算機文件而言,我們需要有索引文件(index file)、儲存的信息(record)。
1.1 Index file是什么
Index file用來儲存多個index entries。
Index entries, 需要儲存兩個信息:查找鍵(search key)、指針(pointer)。
查找鍵是由一個或多個屬性組成,用于對數據進行查找的索引。例如:學生的id、用戶年齡等等。
指針存放的是對應index entries或者record的地址。
2. Indexed Sequential Access Method(ISAM)
2.1 ISAM的結構
要想結構化儲存大量文件,我們需要Index file 和 Data File。為每一個record分配一個Index Entry,并對search key(K0, K1, K2等)進行排序,這樣我們也可以對Index File進行二分查找(Binary Search)。
具體結構圖如下:
2.2 ISAM的樹狀結構
但是上述儲存結構還是不夠高效, 因為Index File依舊可能會很大。所以我們引入樹狀結構。
根據Search Key進行分類。從上至下為根節點、子(樹)節點、葉節點。
結構圖如下:
2.2.1 查找操作
等式查找
舉個栗子,假設我們想在下圖中查找Search Key為27所保存的record, 每一個節點只能保存兩個Search Key。首先我們在根節點(Root)判斷27<40, 故選擇左節點。接著在第二層進行判斷, 22 < 27 < 33,選擇中間節點指向葉節點,在其中查找到27。
具體圖示如下:(每一個框中的數字均為Search Key,*為葉節點)
范圍查找
繼續舉個例子,假設我們要查找40<= x <63,首先,從根節點判斷大于40,選擇右邊節點,繼續判斷40 < 51,選擇51左邊的pointer指向的文件,從對應的葉子節點頁中查找出相應大于40的Search Key(40*)。重復上述操作,直到查找到小于63*的數據。
2.2.2 插入操作
假設每一個Page只能保存兩個Search Key。當Page中沒有空余位置時,ISAM會鏈接一個額外的page來存儲這個search key,即overflow page。如下圖所示,假設插入23*、48*、41*、42*。
假設這棵樹有很多的Overflow Page,這樣會導致產生很長的鏈表,并且存儲的Search Key是隨機的,查找很不方便,效率降低。
2.2.3 刪除操作
ISAM的刪除操作很簡單,只刪除葉節點中的Search Key如果刪除相對應的文件后,此Page中的Search Key為空,則刪除此Page。
例如:刪除上圖中的51*,只會刪除在Primary Leaf Pages中的51*,還會保留Index Page中的51.
3. B+ Tree
2.1 什么是B+ Tree
B+ Tree是一種具有動態深度的樹狀結構。由于前文中,ISAM結構可能會產生大量的Overflow Pages,對文件的查找操作造成極大的影響,并且只能對葉子節點進行修改,所以引入了B+ Tree這一結構來對其進行改進。
一般為了提高搜索效率,樹的高度要盡可能地低,一般為3-4層,而且是高度集成的,即每一個葉子節點中盡可能多的存儲值。此外,在葉結點中,每個page之間互相連接,這樣便于范圍查找。如下圖所示:
另外,需要規定B+ Tree中每一個節點中的最小占有率,此文一律使用最小為50%。即上圖中每個節點儲存數目不允許小于2.
2.2 樹的操作邏輯
2.2.1 查找數據
查找方式同ISAM相同。具體可以查看ISAM的查找數據方式。
2.2.2 插入數據
2.2.2.1 不允許重新分配
在B+ Tree中插入新的數據要滿足一下流程:
如果L中依然有空余位置插入,則將值插入即可。
若無空余位置,則將該葉節點L分裂成為兩個節點新的L和L2,并將L和新數據均勻地分配給兩個新節點,并將其中的中間值復制Copy Up到上一層節點中。再將L和L2鏈接起來。
將樹節點分裂成為兩個新的節點,將數據均勻的分配,并將中間值推到Push Up更上一層的節點。
注意:此處區別Copy Up and Push Up。樹節點分裂后要push,葉子節點分類后用copy。
下圖演示插入8*的過程:
2.2.2.2 允許重新分配
在插入一個數據后,葉節點出現overflow page,此時檢查該葉節點同父節點下的相鄰節點是否存在空余空間,若存在,則將該值插入相鄰兄弟節點,并將上一級樹節點重新分配;反之執行分裂、插入操作。
下圖給出示例:
2.2.3 刪除數據
假設要插入19和20,示例如下:
插入后結果如下:
現在,假設我們接著要繼續刪除24*,由上圖可知,其同父節點下的兄弟節點無法滿足重新分配的條件,所以選擇將兩個葉子節點進行合并,并修改他們的父節點、刪除相應的指針。示例如下:
合并操作后,他們的樹節點出現不滿足50%占比的情況,所以同樣對樹節點和根節點進行同樣的合并操作,得到如下圖所示的結構:
3. 總結
- ISAM:
- 靜態樹
- 存在overflow pages,會降低操作效率
- 只允許修改葉子節點,不允許修改樹節點。
- B+ Tree
- 動態樹,樹的高度降低,集成度高。
- 不存在overflow pages,效率比ISAM高
- 能動態地修改根節點、樹節點、和葉子節點。
總結
以上是生活随笔為你收集整理的文件储存树的理解(ISAM 和 B+Tree)的全部內容,希望文章能夠幫你解決所遇到的問題。