資料結構學習筆記 B B 樹

2021-08-08 16:26:13 字數 3071 閱讀 2034

b-樹是一種非二叉的查詢樹,即一般化的bst,除了要滿足查詢樹的特性外,還滿足以下特性:

一棵m階的b樹:

所有的葉子節點位於同一層

如,m = 3:

b-樹的搜尋,從根結點開始,對結點內的關鍵字(有序)序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指標為空,或已經是葉子結點。

利用前述的b-樹的查詢演算法找出該關鍵字所在的結點。然後根據 k所在結點是否為葉子結點有不同的處理方法。

因此,把在非葉結點刪除關鍵字k的問題就變成了刪除葉子結點中的關鍵字的問題了。

在b-樹葉結點上刪除乙個關鍵字的方法是:

首先將要刪除的關鍵字 k直接從該葉子結點中刪除。然後根據不同情況分別作相應的處理,共有三種可能情況:

通常用作資料庫索引的實現。

b+樹是b-樹的變體,也是一種多路搜尋樹,其定義基本與b-樹同,除了:

1. 非葉子結點的子樹指標與關鍵字個數相同;

2. 非葉子結點的子樹指標p[i],指向關鍵字值屬於[k[i], k[i+1])的子樹(b-樹是開區間);

3. 為所有葉子結點增加乙個鏈指標;

4. 所有關鍵字都在葉子結點出現;

一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。這樣的話,索引查詢過程中就要產生磁碟i/o消耗,相對於記憶體訪問,i/o訪問的消耗要高幾個數量級。

所以評價乙個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟i/o操作次數的漸進複雜度

換句話說,索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數

下面先介紹記憶體和磁碟訪問原理,然後再結合這些原理分析b-/+tree作為索引的效率。

主存訪問原理

主存的訪問過程如下:

當系統需要讀取主存時,則將位址訊號放到位址匯流排上傳給主存,主存讀到位址訊號後,解析訊號並定位到指定儲存單元,然後將此儲存單元資料放到資料匯流排上,供其它部件讀取。

寫主存的過程類似,系統將要寫入單元位址和資料分別放在位址匯流排和資料匯流排上,主存讀取兩個匯流排的內容,做相應的寫操作。

這裡可以看出,主存訪問的時間僅與訪問次數呈線性關係

磁碟訪問原理

索引一般以檔案形式儲存在磁碟上,索引檢索需要磁碟i/o操作。與主存不同,磁碟i/o存在機械運動耗費,因此磁碟i/o的時間消耗是巨大的。

磁碟預讀

由於磁碟讀取速度較慢,因此為了提高效率要減少磁碟io,為了達到這個目的,磁碟往往不是嚴格按需讀取,而是每次都會預讀,即使只需要乙個位元組,磁碟也會從這個位置開始,順序向後讀取一定長度的資料放入記憶體。這樣做的理論依據是電腦科學中著名的區域性性原理

當乙個資料被用到時,其附近的資料也通常會馬上被使用。

由於磁碟順序讀取的效率很高,因此對於具有區域性性的程式來說,預讀可以提高i/o效率。

預讀的長度一般為頁(page)的整倍數

頁是計算機管理儲存器的邏輯塊,硬體及作業系統往往將主存和磁碟儲存區分割為連續的大小相等的塊,每個儲存塊稱為一頁(在許多作業系統中,頁得大小通常為4k),主存和磁碟以頁為單位交換資料。

當程式要讀取的資料不在主存中時,會觸發乙個缺頁異常,此時系統會向磁碟發出讀盤訊號,磁碟會找到資料的起始位置並向後連續讀取一頁或幾頁載入記憶體中,然後異常返回,程式繼續執行。

b-/+tree索引的效能分析

先從b-tree分析,根據b-tree的定義,可知檢索一次最多需要訪問h個節點。

資料庫系統的設計者巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i/o就可以完全載入。

每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了乙個node只需一次i/o。

b-tree中一次檢索最多需要h-1次i/o(根節點常駐記憶體),漸進複雜度為o(h)=o(logdn)

綜上所述,用b-tree作為索引結構效率是非常高的。

b+tree更適合外存索引,原因和內節點出度d有關。從上面分析可以看到,d越大索引的效能越好,而出度的上限取決於節點內key和data的大小:

由於b+tree內節點去掉了data域,因此可以擁有更大的出度,擁有更好的效能。

mysql索引實現

在mysql中,索引屬於儲存引擎級別的概念,不同儲存引擎對索引的實現方式是不同的。

對於myisam引擎:

myisam引擎使用b+tree作為索引結構,葉節點的data域存放的是資料記錄的位址。下圖是myisam索引的原理圖:

myisam中索引檢索的演算法為首先按照b+tree搜尋演算法搜尋索引,如果指定的key存在,則取出其data域的值,然後以data域的值為位址,讀取相應資料記錄。

資料結構學習 樹

樹結構是二叉樹的擴充套件,二叉樹在乙個節點上只有兩個子節點,而樹結構在乙個節點上不只有兩個,可以有n個,n大於等於0,更具有一般意義。二叉樹的概念同樣適用於樹,如完全數,滿樹等,此外還有 有序樹 結點的各子樹從左到右是有次序的,即若交換各子樹相對位置會構成不同的樹。無序樹 結點的各子樹從左到右是無次...

資料結構學習 樹

樹是n個結點的有限集合。n 0時稱為空樹,在任意一棵非空樹中 1 有且僅有乙個特定的稱為根的結點。2 當n 1時,其餘結點可以分為m個互不相交的有限集合,其中每乙個集合本身又是一棵樹。在此,我們主要來學習二叉樹的應用。結點擁有的子樹數稱為結點的度。度為0的結點稱為葉子結點或者終端結點。度不為0的結點...

資料結構學習筆記

資料結構概述 定義我們如何把現實中大量而複雜的問題以特定的資料型別和特定的儲存結構 儲存到主儲存器 記憶體 中,以及在此基礎上為實現某個功能 比如查詢摸個 元素,刪除某個元素,對所有元素進行排序 而執行的相應操作,這個相應 的操作也叫演算法 資料結構 個體 個體的關係 演算法 對儲存資料的操作 演算...