面試普通人VS高手系列 b樹和b 樹的理解

2022-10-10 05:42:10 字數 1949 閱讀 9654

資料結構與演算法問題,困擾了無數的小夥伴。

很多小夥伴對資料結構與演算法的認知有乙個誤區,認為工作中沒有用到,為什麼面試要問,問了能解決實際問題?

圖靈獎獲得者: niklaus wirth 說過: 程式=資料結構+演算法, 也就說我們無時無刻都在和資料結構打交道。

只是作為j**a開發,由於技術體系的成熟度較高,使得大部分人認為:程式應該等於 框架 + sql 呀?

今天我們就來分析一道資料結構的題目:」b樹和b+樹「。

關於這個問題,我們來看看普通人和高手的回答!

嗯. 我想想 … 嗯… mysql裡面好像是用了b+樹來做索引的! 然後…

為了更清晰的解答這個問題,我打算從三個方面來回答:

b樹是一種多路平衡查詢樹,為了更形象的理解。

二叉樹,每個節點支援兩個分支的樹結構,相比於單向鍊錶,多了乙個分支。

二叉查詢樹,在二叉樹的基礎上增加了乙個規則,左子樹的所有節點的值都小於它的根節點,右子樹的所有子節點都大於它的根節點。

二叉查詢樹會出現斜樹問題,導致時間複雜度增加,因此又引入了一種平衡二叉樹,它具有二叉查詢樹的所有特點,同時增加了乙個規則:」它的左右兩個子樹的高度差的絕對值不超過1「。平衡二叉樹會採用左旋、右旋的方式來實現平衡。

而b樹是一種多路平衡查詢樹,它滿足平衡二叉樹的規則,但是它可以有多個子樹,子樹的數量取決於關鍵字的數量,比如這個圖中根節點有兩個關鍵字3和5,那麼它能夠擁有的子路數量=關鍵字數+1。

因此從這個特徵來看,在儲存同樣資料量的情況下,平衡二叉樹的高度要大於b樹。

b+樹,其實是在b樹的基礎上做的增強,最大的區別有兩個:

b樹的資料儲存在每個節點上,而b+樹中的資料是儲存在葉子節點,並且通過鍊錶的方式把葉子節點中的資料進行連線。

b+樹的子路數量等於關鍵字數

這個是b樹的儲存結構,從b樹上可以看到每個節點會儲存資料。

這個是b+樹,b+樹的所有資料是儲存在葉子節點,並且葉子節點的資料是用雙向鍊錶關聯的。

2.b樹和b+樹,一般都是應用在檔案系統和資料庫系統中,用來減少磁碟io帶來的效能損耗。

以mysql中的innodb為例,當我們通過select語句去查詢一條資料時,innodb需要從磁碟上去讀取資料,這個過程會涉及到磁碟io以及磁碟的隨機io

我們知道磁碟io的效能是特別低的,特別是隨機磁碟io。

因為,磁碟io的工作原理是,首先系統會把資料邏輯位址傳給磁碟,磁碟控制電路按照定址邏輯把邏輯位址翻譯成實體地址,也就是確定要讀取的資料在哪個磁軌,哪個扇區。

為了讀取這個扇區的資料,需要把磁頭放在這個扇區的上面,為了實現這乙個點,磁碟會不斷旋轉,把目標扇區旋轉到磁頭下面,使得磁頭找到對應的磁軌,這裡涉及到尋道事件以及旋轉時間。

很明顯,磁碟io這個過程的效能開銷是非常大的,特別是查詢的資料量比較多的情況下。

所以在innodb中,乾脆對儲存在磁碟塊上的資料建立乙個索引,然後把索引資料以及索引列對應的磁碟位址,以b+樹的方式來儲存。

如圖所示,當我們需要查詢目標資料的時候,根據索引從b+樹中查詢目標資料即可,由於b+樹分路較多,所以只需要較少次數的磁碟io就能查詢到。

3.為什麼用b樹或者b+樹來做索引結構?原因是**l樹的高度要比b樹的高度要高,而高度就意味著磁碟io的數量。所以為了減少磁碟io的次數,檔案系統或者資料庫才會採用b樹或者b+樹。

以上就是我對b樹和b+樹的理解!

資料結構在實際開發中非常常見,比如陣列、鍊錶、雙向鍊錶、紅黑樹、跳躍表、b樹、b+樹、佇列等。

在我看來,資料結構是程式設計中最重要的基本功之一。

學了順序表和煉表,我們就能知道查詢操作比較多的場景中應該用順序表,修改操作比較多的場景應該使用鍊錶。

學了佇列之後,就知道對於fifo的場景中,應該使用佇列。

學了樹的結構後,會發現原來查詢類的場景,還可以更進一步提公升查詢效能。

基本功決定大家在技術這個崗位上能夠走到的高度。

好的,本期的普通人vs高手面試系列就到這裡結束了,喜歡的朋友記得點讚收藏。

普通人的提公升

內容摘自水木然的 跨界戰爭 即使是具有同樣特點的人,其財富也是有差別的。同樣出賣自己勞動力或者具有同樣資本的人,其付出的腦力 體力不一樣,所獲得的收益也是不同的。就是說,兩個一模一樣的打工仔或者超級富二代,乙個努力思考 肯付出辛苦,另乙個成天打遊戲睡覺,前一類還是要比後一類財富來的多的。但是聰明刻苦...

擁有普通人的快樂

我宣布從惠普 中國 公司總裁任上退休後,接到許多人的祝賀,大部分人都認為我能夠在這樣的年齡,以及這樣的職位上選擇退休,是一種勇氣 也是一種福氣。雖然離開 惠普時間 不長,但感覺 惠普已經離我很遠。這並非是我對惠普沒有任何眷戀,而是想以此驅動自己往前走。我只是普通人。這個世界上,成功 的人總是少數。因...

普通人也能成功

平凡的成功者靠的是腳踏實地 自我磨練 耐心等待 不爭於求成,為今後的發展積累資本。相反,不少聰明人的期望太多太急,當不能立即出成果時,就變得消沉沮喪。一項研究發現,在校的學習成績和日後的工作能力沒有什麼關係。而一些品格,如 穩重和可信 動手能力組織能力比學習成績更重要。用人所長 一家大公司的主管說得...