B 樹、B+ 樹學習之一(MD版,不斷更新中)

前言

這篇帖子原本寫於2015年,寫於廈門,時至今日(2019年11月5日)來看,感覺當時記錄筆記,缺乏一個完整的思路,記錄的不好,不方便以後的閱讀,今天剛好又遇到了B樹的學習,那麼把它修改一下。

其實在11年剛進360的時候,學習 MySQL,那個時候對B樹做過一次很深的研究,自己實踐過一遍 B 樹的數據結構,不過那個時候沒有云筆記,自己也沒有做好筆記管理,現在找不到了,對於這些,用一句香港連續劇裏面的話可以很準確的表達心情,無限唏噓。

原本的帖子不是用 MD 寫的,不利於編輯,只好刪除掉,重新用 MD 格式來編輯。

正文

個人理解,現在,B 樹主要的一個應用是數據庫存儲引擎(InnoDB),用B樹的原因,是爲了更少地訪問磁盤,更快地檢索到數據的位置。(關於這一點,《算法導論》在介紹 B 樹時,也是這樣地描寫的)

所以,這裏要對磁盤的很多概念有所瞭解。

磁盤RPM

磁盤參數 RPM 是Revolutions Per Minute的縮寫

revolution
n. 革命;旋轉;運行;循環
這麼說,旋轉就是革命了。

《算法導論》第三版第279頁:

對存儲在磁盤上的一顆大的B樹,通常看到分支因子在50~2000之間,具體取決於一個關鍵字相對於一頁的大小。一個大的分支因子可以大大地降低樹的高度以及查找任何一個關鍵字所需的磁盤存取次數。

塊的概念

參考:http://oss.org.cn/kernel-book/ch09/9.1.htm,很可惜,這個網站已經不能訪問了,只能參考《深入理解Linux內核》了。

9.1 基本概念
在上一章中,我們把Ext2、Minix、Ext等實際可使用的文件系統稱爲具體文件系統。具體文件系統管理的是一個邏輯空間,這個邏輯空間就象一個大的數組,數組的每個元素就是文件系統操作的基本單位——邏輯塊,邏輯塊是從0開始編號的,而且,邏輯塊是連續的。與邏輯塊相對的是物理塊,物理塊是數據在磁盤上的存取單位,也就是每進行一次I/O操作,最小傳輸的數據大小。我們知道數據是存儲在磁盤的扇區中的,那麼扇區是不是物理塊呢?或者物理塊是多大呢?這涉及到文件系統效率的問題。

參考維基百科

In computing (specifically data transmission and data storage), a block, sometimes called a physical record, is a sequence of bytes or bits, usually containing some whole number of records, having a maximum length, a block size.[1] Data thus structured are said to be blocked. The process of putting data into blocks is called blocking, while deblocking is the process of extracting data from blocks. Blocked data is normally stored in a data buffer and read or written a whole block at a time.

In the 1970s IBM introduced the Direct Access Storage Device (DASD) with fixed-block architecture using sizes of 512, 1024, 2048, or 4096 bytes. Cray Research had an 819 disk controller in 1975 that transferred 512 64-bit words (4096 bytes) per sector. Later,[specify] hard disk drives supporting 1,024-byte sectors began to be integrated into consumer electronics devices such as portable media players and digital video cameras.[citation needed] However, by far the majority of hard drives shipped up to the start of the 2010s still used the traditional 512-byte sector size.

從這裏感覺,sector 和 block 是一個概念。

參考這裏,看到:
​​​​在這裏插入圖片描述
? 樹的階數如何翻譯,應該用 order
https://en.wikipedia.org/wiki/Tree_(data_structure)。

block 的概念

https://en.wikipedia.org/wiki/Block_(data_storage)。

B 樹的定義

維基百科的定義

根據 Knuth 的定義,一個 m 階的B樹是一個有以下屬性的樹:
每一個節點最多有 m 個子節點
每一個非葉子節點(除根節點)最少有 ⌈m/2⌉ 個子節點
如果根節點不是葉子節點,那麼它至少有兩個子節點
有 k 個子節點的非葉子節點擁有 k − 1 個鍵
所有的葉子節點都在同一層

這是維基上 B 樹的定義。(各個地方的定義不盡相同,可能背後的概念是一樣的,我覺得不一致,可能是因爲我理解的還不夠透徹。)

這個地方沒有強調關鍵字是有序的。

數據結構教程

手錄,摘自《數據結構(C語言版) 嚴蔚敏 吳偉民 清華大學出版社》。

B樹的概念:
一顆m階的B-樹,或爲空樹,或爲滿足下列特徵的m叉樹:
1.樹中每個結點至多有m棵子樹。
2.若根結點不是葉子結點,則至少有兩棵子樹。
3.除根之外的所有非終端結點至少有[m/2]棵子樹。
4.所有的非終端結點中包含下列信息數據
(n, A0, K1, A1, K2, A2, …, Kn, An)
其中:Ki(i=1, …, n)爲關鍵字,且Ki < Ki+1(i=1, …, n-1); Ai(i=0, …, n)爲指向子樹根結點的指針,且指針Ai-1所指向子樹中所有結點的關鍵字均小於Ki(i=1, …, n), An所指子樹中所有結點的關鍵字均大於Kn, n([m/2]-1<=n<=m-1)爲關鍵字的個數(或n+1爲子樹個數)。
5.所有的葉子結點都出現在同一層次上,並且不帶信息(可以看作是外部結點或查找失敗的結點,實際上這些結點不存在,指向這些結點的指針爲空)。

(插曲1:《數據結構(C語言版) 嚴蔚敏 吳偉民》這本書,我原本有兩本,畢業之後看了好幾遍,在搬家時終於決定賣掉來減輕負擔,結果最近發現有些內容,原本以爲理解清楚了,實際上還是有更深層次的內容沒有理解,最近又打算買回來,只怪當時無知啊。

插曲2:我一直感覺這本書寫的不太好,寫的中間過程和思路不夠清晰,不如《數據結構與算法分析—C語言描述 (美)Mark Allen Weiss 著 馮舜璽 譯 機械工業出版社 》寫的清晰,這會兒突然想到清華的學習方法,感覺稍稍明白了一些其中的味道,也許這本書不是一本很好的用來自學的書,但是卻是一本很好的教材,這裏面的感想總結在這裏

11年研究B樹,研究了一段時間,還寫了寫算法,這次想撿起來,發現都忘記了,這次又花了一段時間研究,發現所有的根本都要圍繞定義去思考,突然理解了高中數學中的定理和定理的屬性的意思,定理定義是約定、規定一個東西,然後這個東西會表現出一些特有的性質來,這樣你可以根據其他東西是否滿足這個性質來進行一定地判斷。)

這裏面要搞清楚樹的高度、樹的度、樹和子樹的關係,子樹和關鍵字之間的關係,這些關係搞清楚,這個 B 樹就搞明白了。

在這裏插入圖片描述
《高可用 MySQL》這裏所說的 B+ 樹的概念和清華嚴蔚敏說的《數據結構》裏面講的不一樣,《數據結構》說的是 B+ 樹是說數據都只在葉子節點,這裏說的是 B+ 樹是葉子節點指向下一個葉子節點。

總結

今天先整理到這裏,明天繼續完善,今天還沒有涉及到 B 樹的主要概念,只是涉及到了磁盤的一些概念。

參考

http://blog.csdn.net/liuaigui/article/details/6168186。
http://stackoverflow.com/questions/12345804/difference-between-blocks-and-sectors
https://en.wikipedia.org/wiki/Disk_sector
http://baike.baidu.com/view/110462.htm 這裏是我原來所學的
http://oss.org.cn/kernel-book/ch09/9.1.htm 物理塊的概念
https://en.wikipedia.org/wiki/B-tree
http://blog.csdn.net/v_july_v/article/details/6530142 這個帖子介紹的比較詳細

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