B B+運用在file system database這類持續存儲結構,一樣能保持lon(n)的插入與查詢,也須要額外的平衡調節。像mysql的數據庫定義是能夠指定B+ 索引仍是hash索引。mysql
C++ STL中的map就是用紅黑樹實現的。AVL樹和紅黑樹都是二叉搜索樹的變體,他們都是用於搜索。由於在這些書上搜索的時間複雜度都是O(h),h爲樹高,而理想情況是h爲n。因此構造的辦法就是把二叉搜索樹改形成AVL樹或者紅黑樹,AVL樹是嚴格維持平衡的,紅黑樹是黑平衡的。可是維持平衡又須要額外的操做,這也加大了數據結構的時間複雜度,因此紅黑樹能夠看作是二叉搜索樹和AVL樹的一個折中,能夠儘可能維持樹的平衡,又不用話過多的時間來維持數據結構的性質。linux
AVL樹:平衡二叉樹,通常是用平衡因子差值決定並經過旋轉來實現,左右子樹樹高差不超過1,那麼和紅黑樹比較它是嚴格的平衡二叉樹,平衡條件很是嚴格(樹高差只有1),只要插入或刪除不知足上面的條件就要經過旋轉來保持平衡。因爲旋轉是很是耗費時間的。咱們能夠推出AVL樹適合用於插入刪除次數比較少,但查找多的狀況。nginx
應用相對其餘數據結構比較少。windows對進程地址空間的管理用到了AVL樹。sql
紅黑樹:平衡二叉樹,經過對任何一條從根到葉子的簡單路徑上各個節點的顏色進行約束,確保沒有一條路徑會比其餘路徑長2倍,於是是近似平衡的。因此相對於嚴格要求平衡的AVL樹來講,它的旋轉保持平衡次數較少。用於搜索時,插入刪除次數多的狀況下咱們就用紅黑樹來取代AVL。數據庫
紅黑樹應用比較普遍:windows
· 普遍用在C++的STL中。map和set都是用紅黑樹實現的。數據結構
· 著名的linux進程調度Completely Fair Scheduler,用紅黑樹管理進程控制塊。搜索引擎
· epoll在內核中的實現,用紅黑樹管理事件塊排序
· nginx中,用紅黑樹管理timer等索引
· Java的TreeMap實現
B樹,B+樹:它們特色是同樣的,是多路查找樹,通常用於數據庫中作索引,由於它們分支多層數少,由於磁盤IO是很是耗時的,而像大量數據存儲在磁盤中因此咱們要有效的減小磁盤IO次數避免磁盤頻繁的查找。
B+樹是B樹的變種樹,有n棵子樹的節點中含有n個關鍵字,每一個關鍵字不保存數據,只用來索引,數據都保存在葉子節點。是爲文件系統而生的。
B+樹相對B樹磁盤讀寫代價更低:由於B+樹非葉子結點只存儲鍵值,單個節點佔空間小,索引塊可以存儲更多的節點,從磁盤讀索引時所需的索引塊更少,因此索引查找時I/O次數較B-Tree索引少,效率更高。並且B+Tree在葉子節點存放的記錄以鏈表的形式連接,範圍查找或遍歷效率更高。Mysql InnoDB用的就是B+Tree索引。
Trie樹:
又名單詞查找樹,一種樹形結構,經常使用來操做字符串。它是不一樣字符串的相同前綴只保存一份。
相對直接保存字符串確定是節省空間的,可是它保存大量字符串時會很耗費內存(是內存)。
相似的有:前綴樹(prefix tree),後綴樹(suffix tree),radix tree(patricia tree, compactprefix tree),crit-bit tree(解決耗費內存問題),以及前面說的double array trie。
前綴樹:字符串快速檢索,字符串排序,最長公共前綴,自動匹配前綴顯示後綴。
後綴樹:查找字符串s1在s2中,字符串s1在s2中出現的次數,字符串s1,s2最長公共部分,最長迴文串。
trie 樹的一個典型應用是前綴匹配,好比下面這個很常見的場景,在咱們輸入時,搜索引擎會給予提示。
在大型文件系統中,採用索引能夠有效的提升查找的效率,創建文件時,在輸入數據記錄的同時,創建一張索引表,每一個索引表項記錄相應數據塊的地址。檢索文件記錄時,先將外存上的索引表讀入內存,從索引表中查到數據記錄的地址後,再將相應的記錄讀入內存。若是文件中的數據在使用過程當中記錄變化較多,則要頻繁地對索引表進行插入和刪除操做,這時對索引表採用樹型結構較好。可是若是文件系統很大,則索引表也每每很大,需分塊讀入內存,若採用二叉查找樹的結構,仍需屢次訪問外存,而訪問外存的代價很大,爲了減小訪問外存的次數,就應儘可能減小索引表的深度。簡要介紹一下普遍應用於大型文件系統中的B-樹。