1. 程式人生 > >AVL樹,紅黑樹,B-B+樹,Trie樹原理和應用

AVL樹,紅黑樹,B-B+樹,Trie樹原理和應用

前言:本文章來源於我在知乎上回答的一個問題
AVL樹,紅黑樹,B樹,B+樹,Trie樹都分別應用在哪些現實場景中?
看完後您可能會了解到這些資料結構大致的原理及為什麼用在這些場景,文章並不涉及具體操作(如插入刪除等等)

目錄

  • AVL樹
    • AVL樹原理與應用
  • 紅黑樹
    • 紅黑樹原理與應用
  • B/B+樹
    • B/B+樹原理與應用
  • Trie樹
    • Trie樹原理與應用

AVL樹

簡介:
AVL樹是最早的自平衡二叉樹,在早期應用還相對來說比較廣,後期由於旋轉次數過多而被紅黑樹等結構取代(二者都是用來搜尋的),AVL樹內部是有序的。

原理:
平衡二叉樹,一般是用平衡因子差值判斷是否平衡並通過旋轉來實現平衡,左右子樹樹高差不超過1,那麼和紅黑樹比較它是嚴格的平衡二叉樹,平衡條件非常嚴格(樹高差只有1),只要插入或刪除不滿足上面的條件就要通過旋轉來保持平衡。由於旋轉是非常耗費時間的。我們可以推出AVL樹適合用於插入刪除次數比較少,但查詢多的情況,並且保證深度是Olog(n)。

下圖為一棵AVL樹
這裡寫圖片描述

側邊是平衡因子,我們可以看到任意節點的左右子樹的平衡因子差值都不會大於1,所以維持這顆強平衡二叉樹的條件就非常嚴格了。

應用:
Windows核心通過AVL樹來儲存一些離散的地址空間.
原因可能是訪問次數多於插入刪除的次數。AVL樹的高度較低於紅黑樹等

紅黑樹

簡介:
平衡二叉樹,由於旋轉次數較少在插入刪除操作多的情況下效能高於其他平衡二叉樹,所以被廣泛應用。內部是有序的

原理:
平衡二叉樹,通過對任何一條從根到葉子的簡單路徑上各個節點的顏色進行約束(紅和黑),確保沒有一條路徑會比其他路徑長2倍,因而是近似平衡的(一個節點的兩棵子樹高度不會相差二倍),是一棵弱平衡二叉樹。所以相對於嚴格要求平衡的AVL樹來說,它的旋轉保持平衡次數較少。用於搜尋時,插入刪除次數多的情況下我們就用紅黑樹來取代AVL。

一個簡單的紅黑樹
紅黑樹

應用:
1.c++STL 包括set,multiset,map,multimap(侯捷前輩的STL原始碼剖析比較詳細)。c++關聯容器
java容器中的TreeMap

2.IO多路複用的epoll,內部用紅黑樹來維持我們想要監控的socket。以支援快速的插入和刪除

3.nginx中定時器是用紅黑樹來維持的,因為紅黑樹是有序的,每次從紅黑樹內部取出最小的定時器即可。

4.linux核心中用紅黑樹來管理程序的記憶體使用,程序的虛擬地址空間塊都以虛擬地址為key值掛在這棵紅黑樹上。

B/B+樹

簡介:
B/B+樹主要用在資料庫或者大型索引資料中,是一種多路查詢樹。(注意B樹和B-樹是同一個,B-樹不是”B減樹”,”-“僅僅是個符號)

原理:
B樹,B+樹:它們特點是一樣的,是多路查詢樹,一般用於資料庫系統中,為什麼,因為它們分支多層數少唄(一般一個節點有成千上萬個子節點,所以B樹層數是非常少的,節點個數為N個高度為logN,但是這個log的底數不是我們常用的2了,而是一個節點的子節點個個數,底數非常大從而樹高度很低),都知道磁碟IO是非常耗時的(和記憶體訪問速度差千倍),而像大量資料儲存在磁碟中所以我們要有效的減少磁碟IO次數避免磁碟頻繁的查詢。減少磁碟IO就意味著提升效能。

B+樹是B樹的變種樹,有n棵子樹的節點中含有n個關鍵字,每個關鍵字不儲存資料(也就是節點只儲存key),只用來索引,資料都儲存在葉子節點。是為檔案系統而生的。

一棵B樹
這裡寫圖片描述

一棵B+樹
這裡寫圖片描述

應用:
B樹一般用在資料庫等大型索引,主要原因就是層數少,重點—>減少避免磁碟IO
B+樹適應檔案系統,想下檔案系統的樣子,目錄並不儲存檔案只有底層葉子節點儲存資料。

Trie樹

簡介:
又名單詞查詢樹,主要處理字串,字串的相同字首儲存在相同的節點中。它的變種樹非常多。
比如:
字首樹(prefix tree),字尾樹(suffix tree)
詳情見 從字首樹談到字尾樹

radix tree(patricia tree, compact prefix tree, 基數樹)

原理:
它是不同字串的相同字首只儲存一份。
相對直接儲存字串肯定是節省空間的,但是它儲存大量字串時會很耗費記憶體(是記憶體)。

類似下圖
這裡寫圖片描述

應用:
字首樹(prefix tree):
1.字串快速檢索
2.字串排序
3.最長公共字首
4.自動匹配字首顯示字尾。

字尾樹(suffix tree):
1.查詢字串s1在s2中
2.字串s1在s2中出現的次數
3.字串s1,s2最長公共部分
4.最長迴文串
詳情還是見
從字首樹談到字尾樹