二叉樹、二叉搜索樹、平衡二叉樹、紅黑樹、B樹、B+樹

原文鏈接:http://www.sohu.com/a/280609547_818692

說呂老師給小史講完人工智能的一些知識後,他們一起回家吃小史姐姐做的飯去了。

【飯後】

呂老師:面試的時候一定是往深了問,不精通的話容易吃虧。不過面試時一般都是根據項目來問,項目中用到的技術,一定要多看看原理,特別是能和數據結構和算法掛鉤的那部分。

小史:樹的話,無非就是前中後序遍歷、二叉樹、二叉搜索樹、平衡二叉樹,更高級一點的有紅黑樹、B樹、B+樹,還有之前你教我的字典樹。

【紅黑樹】

一聽到紅黑樹,小史頭都大了,開始抱怨了起來。

小史:紅黑樹看過很多遍了,但是每次都記不住,它的規則實在是太多了,光定義就有四五條規則,還有插入刪除的時候,需要調整樹,複雜得很。

呂老師:小史,問你紅黑樹,並不是讓你背誦它的定義,或者讓你手寫一個紅黑樹,而是想問問你它爲什麼這樣設計,它的使用場景有哪些。

【B樹】

呂老師:小史,你要知道,文件系統和數據庫的索引都是存在硬盤上的,並且如果數據量大的話,不一定能一次性加載到內存中。

兩個月前,小史面試沒考慮內存情況差點掛了,傳送門

【B+樹】

呂老師:這也是和業務場景相關的,你想想,數據庫中select數據,不一定只選一條,很多時候會選多條,比如按照id排序後選10條。

小史:我明白了,如果是多條的話,B樹需要做局部的中序遍歷,可能要跨層訪問。而B+樹由於所有數據都在葉子結點,不用跨層,同時由於有鏈表結構,只需要找到首尾,通過鏈表就能把所有數據取出來了。

【回到現場】

小史:這和業務場景有關。如果只選一個數據,那確實是hash更快。但是數據庫中經常會選擇多條,這時候由於B+樹索引有序,並且又有鏈表相連,它的查詢效率比hash就快很多了。

小史:而且數據庫中的索引一般是在磁盤上,數據量大的情況可能無法一次裝入內存,B+樹的設計可以允許數據分批加載,同時樹的高度較低,提高查找效率。

HR和小史簡單地聊了聊基本情況,這次面試就結束了。

小史走後,面試官在系統中寫下了面試評語:

幾天後,小史收到了A廠的offer。

親愛的場粉們,面試現場的第一季到這裏就全部結束了

 

總結:

二叉排序樹
左邊比根節點小,右邊比根節點大

二叉排序樹在有序序列時退化成鏈表
所以要用平衡樹
紅黑樹就是平衡樹的一種,複雜的規則是爲了保證樹的平衡性
查找性能取決樹的高度,平衡降低樹的高度
TreeSet,TreeMap
B樹是一種多路搜索樹,他的每個節點可以擁有多於兩個孩子節點。M路的B樹最多能擁有M個孩子節點

數據量大的話,索引一次性無法全部加載到內存中
一棵樹無法一次性加載到內存,B樹的多路存儲,可以每次加載B樹的一個節點然後一步步往下找
在內存中紅黑樹比B樹效率更高,但是涉及磁盤操作,B樹就更優了

 B+樹是在B樹的基礎上進行改造,他的數據都在葉子節點,通是葉子節點之間還加了指針形成鏈表
 B樹需要做局部的中序遍歷,可能要跨層訪問。而B+樹由於所有數據都在葉子結點,不用跨層,同時由於有鏈表結構,只需要找到首尾,通過鏈表就能把所有數據取出來了。
 如果只選一個數據,那確實是hash更快。但是數據庫中經常會選擇多條,這時候由於B+樹索引有序,並且又有鏈表相連,它的查詢效率比hash就快很多了
 數據庫中的索引一般是在磁盤上,數據量大的情況可能無法一次裝入內存,B+樹的設計可以允許數據分批加載,同時樹的高度較低,提高查找效率

紅黑樹除了具有二叉搜索樹的所有性質之外,還具有以下4點性質:
1. 根節點是黑色的。
2. 空節點是黑色的(紅黑樹中,根節點的parent以及所有葉節點lchild、rchild都不指向NULL,而是指向一個定義好的空節點)。
3. 紅色節點的父、左子、右子節點都是黑色。
4. 在任何一棵子樹中,每一條從根節點向下走到空節點的路徑上包含的黑色節點數量都相同。

B樹:二叉樹,每個結點只存儲一個關鍵字,等於則命中,小於走左結點,大於走右結點;
B-樹:多路搜索樹,每個結點存儲M/2到M個關鍵字,非葉子結點存儲指向關鍵字範圍的子結點;
所有關鍵字在整顆樹中出現,且只出現一次,非葉子結點可以命中;
B+樹:在B-樹基礎上,爲葉子結點增加鏈表指針,所有關鍵字都在葉子結點
中出現,非葉子結點作爲葉子結點的索引;B+樹總是到葉子結點才命中;
B*樹:在B+樹基礎上,爲非葉子結點也增加鏈表指針,將結點的最低利用率
從1/2提高到2/3;

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