【動畫版】數據結構-B樹【寧哥算法課堂】

【動畫版】數據結構-B樹【寧哥算法課堂】

 

人物對白:

李寧老師:小麗,很久沒見了,最近在忙什麼?

小麗:最近學院的老師佈置了一個大作業,讓實現一個類似Oracle的關係數據庫原型。

李寧老師:Oracle可很複雜哦!

小麗:當然不需要做整個Oracle數據庫,只是做一個原型,可以對數據增刪改,並且利用SQL查詢出數據。

小麗:關鍵是需要爲字段添加索引。

小麗:我現在正在犯愁,該如何爲索引選擇數據結構呢!

李寧老師:如果只是實現,有很多數據結構都可以實現索引的功能。

小麗:不行,麻省理工的老師要求很嚴,還要考慮性能,所以需要選一個合適的數據結構。

小麗:而且,這是我大一的一次重要考覈,不能搞砸了!

李寧老師:那還是需要認真對待的,你有什麼候選方案嗎?

小麗:我打算選擇二叉搜索樹作爲索引的數據結構,查了很多資料,說是樹的查詢效率非常高!

小麗:李寧老師,您認爲二叉搜索樹是否適合做索引的數據結構呢?

李寧老師:這種數據結構從搜索效率上看,做索引是沒問題的!

李寧老師:但是,如果數據量比較大,可能會有性能上的問題。

小麗:性能,這正是這次作業的考查重點!能告訴我到底是哪裏可能出問題嗎?

李寧老師:既然是作業,就要獨立完成哦,要證明麻省理工的學生是最優秀的!

小麗:李寧老師,幫幫忙!我就差這塊了,其他的都搞定了!

李寧老師:好吧,我就好人做到底,告訴你該如何做。

李寧老師:如果單從算法邏輯上講,二叉搜索樹的查找速度非常快,比較次數也是非常少的。

李寧老師: 但是,這有一個前提,就是所有的數據都必須在內存中查找。

李寧老師:不過我們要面對一個現實問題,那就是磁盤讀寫速度。

小麗:這個和磁盤讀寫速度有什麼關係呢?

李寧老師:數據庫索引是存儲在磁盤上的,如果數據量不大,當然可以全部裝載到內存中。

李寧老師:但如果數據量比較大,是無法將全部的索引數據一次性裝載到內存的。

李寧老師:能做的只是逐一加載每一個磁盤頁,這裏的磁盤頁對應着搜索樹的節點。

這裏要顯示磁盤頁和索引數的動畫

李寧老師:如果我們利用二叉搜索樹作爲索引,情況可能會非常糟糕。

小麗:爲什麼會非常糟糕呢?

李寧老師:我們可以舉個例子,假設有一個高度爲4的二叉搜索樹,要查找值爲8的節點,可以按這樣的流程!

李寧老師:首先,找到值爲9的根節點。

李寧老師:很明顯,8比9小,所以我們要找的節點應該在根節點的左子樹中。

李寧老師:然後,找到值爲5的節點,仍然重複這一過程

李寧老師:找到值爲7的節點

李寧老師:最後,找到了值爲8的節點,任務完成!

李寧老師:看到了吧,在這個例子中,經過了4步才搜索到了8,所以對磁盤讀寫了4次。

小麗:樹的高度是4,磁盤讀寫的次數也是4,也就是說,最壞的情況下,磁盤讀寫次數等於樹的高度,對嗎?

李寧老師:沒錯!

李寧老師:既然如此,爲了減少磁盤讀寫次數,就需要儘可能減小樹的高度。

小麗:那有什麼更好的數據結構呢?

李寧老師:我們可以採用多路平衡樹,其中比較常用的就是B樹。

李寧老師:B樹的特徵是每個節點最多可以包含K個孩子。

李寧老師:K被稱爲B樹的階,K的值取決於磁盤頁的大小。

李寧老師:現在舉一個B樹的例子。先不用管B樹的規則。

李寧老師:這是一棵3階B樹。

小麗:這樹長得很特別,它真的能提高搜索效率嗎?

李寧老師:現在讓我們來演示一下搜索流程,看看是否可以提高搜索效率。

李寧老師:假設現在要搜索3

李寧老師:首先定位9,然後將3和9進行比較。很顯然,3比9小,所以應該在9的左子樹中繼續搜索。

李寧老師:接下來定位到2、6節點,並且在該節點內搜索3,很顯然,沒有找到。

李寧老師:然後用3分別與2、6進行比較,3在2和6之間,所以應該在2、6節點的中間子樹中搜索

李寧老師:定位到了3、5節點,在該節點內部成功搜索到了3,任務完成!

李寧老師:通過整個搜索過程可以看出,B樹中的比較次數不比二叉樹少,不過這些比較操作都是在內存中完成的,效率相當高。

李寧老師:B樹的高度只有3,所以比二叉搜索樹少了一次磁盤讀寫次數。

李寧老師:由於磁盤讀寫非常昂貴,而且在真實的場景下,可能有成千上萬次的磁盤讀寫,所以使用B樹對性能的提升非常明顯。

小麗:原來如此,懂了!

小麗:還有一個問題,就是B樹這麼複雜,建立B樹有什麼規則嗎?

李寧老師:當然有,建立B樹需要遵循這5條規則。

創建B樹的規則:

1.根結點至少有兩個子節點。

2.每個中間節點都包含k-1個元素和k個孩子,其中 m/2 <= k <= m

3.每一個葉子節點都包含k-1個元素,其中 m/2 <= k <= m

4.所有的葉子結點都位於同一層。

5.每個節點中的元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域區間。

李寧老師:現在我們以2,6節點爲例來解釋這些規則,該節點有兩個元素2和6,又有3個孩子,所以,k等於3。

李寧老師:而1小於2,3和5在2和6之間,8大於6,其他規則也同樣符合,所以這就是一顆標準的B 樹。

小麗:終於明白B樹的創建規則了,索引的數據結構就採用B樹了,謝謝李寧老師。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章