b - 数据结构实验之查找二:平衡二叉树_文件系统的灵魂数据结构 B树
其實平衡二叉樹的代碼實現已經挺復雜的了,但是一山更比一山高,B樹算法的原理和代碼實現都比平衡二叉樹要更為復雜。
我沒有讓大家知難而退的意思,面試的時候肯定不會讓你寫B樹這么復雜的算法,大家先聽我講講B樹這種數據結構的思想吧。
一看文章標題就知道B樹與文件系統的實現有很大關系,這個還是挺重要的。代碼實現可能后面我會補上,其實意義也不大,真的
先聲明一點:B-tree樹即B樹。B即Balanced平衡,因為B樹的原英文名稱為B-tree,而國內很多人喜歡把B-tree譯作B-樹,這是個非常不好的直譯,很容易讓人產生誤解,人們可能會以為B-樹和B樹是兩種樹。
B樹產生的背景不管是二叉樹、二叉查找樹還是平衡二叉樹,它們都有諸多限制,比如:每個結點只能存儲一個元素。
結點的度至多為2,即使是平衡二叉樹,在存儲百萬、千萬級別的數據量時,也會導致樹的深度特別大,而深度大就會影響查找效率。
這里提一下平衡二叉樹的缺點:由于平衡二叉樹需要左旋和右旋來調整樹的結構,因此在頻繁插入和刪除的場景下,每插入或刪除一個結點,都極有可能導致樹的不平衡,性能也會大打折扣。紅黑樹(后面會介紹)就是來解決這個問題的。
前面講的幾種數據結構,都是純內存操作,但是當數據量特別大(如數據庫中千萬級別的數據表、磁盤中的上萬個文件等),內存都存不下了怎么辦?在這種情況下,需要用外存(硬盤)來存儲,而對數據的處理則需要不斷地從硬盤調入調出。
此時,時間復雜度的計算就會發生變化,因為還要額外考慮對硬盤的訪問次數和單次訪問時間等。
為了降低對硬盤的訪問次數,需要設計新的數據結構。前面講的幾種樹,結點都只能存一個元素,因此,當元素非常多的時候,要么結點的度非常大,要么樹的深度非常大,這兩種情況都會導致對硬盤的訪問次數偏大。如果每個結點能存多個元素,那么樹的總結點數就會大大減少,對磁盤的訪問次數也會相應的大大減少。
由于有如上限制,為此引入了多路查找樹的概念。
多路查找樹:結點的度可以大于2,并且每一個結點可以存儲多個元素。由于是查找樹,所以結點之間存在某種特定的排序關系。
B樹的基本概念本文要講的主題是B樹,B樹是一種平衡的多路查找樹。其實B樹和多路查找樹是一個意思,網上很多資料也是這樣認為的,但是也可以認為多路查找樹和B樹不是一個意思,因為多路查找樹不一定是平衡的。B樹的階:所有結點中的最大孩子數。其實跟樹的度一個意思。一個m階B樹的屬性:如果根結點不是葉子結點,則其至少有兩顆子樹。
[m/2]<=k<=m,[m/2]為向上取整,比如9階B樹,5<=k<=9。每一個非根分支結點都有k個孩子和k-1個元素;葉子結點有k-1個元素。
所有葉子結點在同一層(平衡)。
所有分支結點有下列信息數據:(n,A0,K1,A1,K2,A2,...,Kn,An),n是結點存儲的元素個數,Ai表示子樹,Ki表示元素,而從A0到An的值是從小到大排序的,這跟二叉查找樹的性質一樣。
如果要查找元素7,首先從硬盤上讀取根節點(第一次讀磁盤)
即讀到了3,5,8三個元素,發現7并不在其中,但由于5<7<8,因此找到了A2,然后根據A2再讀取一次硬盤(第二次讀磁盤)
此時讀到了2,6,7三個元素,找到了元素7
兩次磁盤讀取就查找了我們想要的元素,非常高效,B樹就是這樣一種為內外存數據交互為設計的數據結構。
本文介紹了B樹產生的背景和基本概念,下一篇文章將介紹B樹結點的插入和刪除操作,以及后面將陸續介紹B+樹、紅黑樹等。
總結
以上是生活随笔為你收集整理的b - 数据结构实验之查找二:平衡二叉树_文件系统的灵魂数据结构 B树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IndexNotReadyExcepti
- 下一篇: JAVA入门级教学之(浮点型数据类型)