[1]基本思想:二叉查找樹是先對待查找的數據進行生成樹,確保樹的左分支的值小於右分支的值,而後在就行和每一個節點的父節點比較大小,查找最適合的範圍。 這個算法的查找效率很高,可是若是使用這種查找方法要首先建立樹。 java
[2]二叉查找樹(BinarySearch Tree,也叫二叉搜索樹,或稱二叉排序樹Binary Sort Tree)或者是一棵空樹,或者是具備下列性質的二叉樹:node
[3]二叉查找樹性質:對二叉查找樹進行中序遍歷,便可獲得有序的數列。算法
不一樣形態的二叉查找樹以下圖所示:數據庫
[4]複雜度分析:它和二分查找同樣,插入和查找的時間複雜度均爲O(logn),可是在最壞的狀況下仍然會有O(n)的時間複雜度。緣由在於插入和刪除元素的時候,樹沒有保持平衡(好比,咱們查找上圖(b)中的「93」,咱們須要進行n次查找操做)。咱們追求的是在最壞的狀況下仍然有較好的時間複雜度,這就是平衡查找樹設計的初衷。編程
下圖爲二叉樹查找和順序查找以及二分查找性能的對比圖:緩存
基於二叉查找樹進行優化,進而能夠獲得其餘的樹表查找算法,如平衡樹、紅黑樹等高效算法。數據結構
[1]2-3查找樹定義:和二叉樹不同,2-3樹運行每一個節點保存1個或者兩個的值。對於普通的2節點(2-node),他保存1個key和左右兩個本身點。對應3節點(3-node),保存兩個Key,2-3查找樹的定義以下:編程語言
性質2)以下圖所示:性能
[3]複雜度分析:優化
2-3樹的查找效率與樹的高度是息息相關的。
距離來講,對於1百萬個節點的2-3樹,樹的高度爲12-20之間,對於10億個節點的2-3樹,樹的高度爲18-30之間。
對於插入來講,只須要常數次操做便可完成,由於他只須要修改與該節點關聯的節點便可,不須要檢查其餘節點,因此效率和查找相似。下面是2-3查找樹的效率:
2-3查找樹能保證在插入元素以後能保持樹的平衡狀態,最壞狀況下即全部的子節點都是2-node,樹的高度爲lgn,從而保證了最壞狀況下的時間複雜度。可是2-3樹實現起來比較複雜,因而就有了一種簡單實現2-3樹的數據結構,即紅黑樹(Red-Black Tree)。
[1]基本思想:紅黑樹的思想就是對2-3查找樹進行編碼,尤爲是對2-3查找樹中的3-nodes節點添加額外的信息。紅黑樹中將節點之間的連接分爲兩種不一樣類型,紅色連接,他用來連接兩個2-nodes節點來表示一個3-nodes節點。黑色連接用來連接普通的2-3節點。特別的,使用紅色連接的兩個2-nodes來表示一個3-nodes節點,而且向左傾斜,即一個2-node是另外一個2-node的左子節點。這種作法的好處是查找的時候不用作任何修改,和普通的二叉查找樹相同。
[2]紅黑樹的定義:
紅黑樹是一種具備紅色和黑色連接的平衡查找樹,同時知足:
下圖能夠看到紅黑樹實際上是2-3樹的另一種表現形式:若是咱們將紅色的連線水平繪製,那麼他連接的兩個2-node節點就是2-3樹中的一個3-node節點了。
[3]紅黑樹的性質:整個樹徹底黑色平衡,即從根節點到因此葉子結點的路徑上,黑色連接的個數都相同(2-3樹的第2)性質,從根節點到葉子節點的距離都相等)。
[4]複雜度分析:最壞的狀況就是,紅黑樹中除了最左側路徑所有是由3-node節點組成,即紅黑相間的路徑長度是全黑路徑長度的2倍。
下圖是一個典型的紅黑樹,從中能夠看到最長的路徑(紅黑相間的路徑)是最短路徑的2倍:
紅黑樹的平均高度大約爲logn。
下圖是紅黑樹在各類狀況下的時間複雜度,能夠看出紅黑樹是2-3查找樹的一種實現,它能保證最壞狀況下仍然具備對數的時間複雜度。
紅黑樹這種數據結構應用十分普遍,在多種編程語言中被用做符號表的實現,如:
平衡查找樹中的2-3樹以及其實現紅黑樹。2-3樹種,一個節點最多有2個key,而紅黑樹則使用染色的方式來標識這兩個key。
維基百科對B樹的定義爲「在計算機科學中,B樹(B-tree)是一種樹狀數據結構,它可以存儲數據、對其進行排序並容許以O(log n)的時間複雜度運行進行查找、順序讀取、插入和刪除的數據結構。B樹,歸納來講是一個節點能夠擁有多於2個子節點的二叉查找樹。與自平衡二叉查找樹不一樣,B樹爲系統最優化大塊數據的讀和寫操做。B-tree算法減小定位記錄時所經歷的中間過程,從而加快存取速度。廣泛運用在數據庫和文件系統。
[1]B樹定義:
B樹能夠看做是對2-3查找樹的一種擴展,即他容許每一個節點有M-1個子節點。
下圖是一個M=4 階的B樹:
能夠看到B樹是2-3樹的一種擴展,他容許一個節點有多於2個的元素。B樹的插入及平衡化操做和2-3樹很類似,這裏就不介紹了。下面是往B樹中依次插入
6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4
的演示動畫:
[2]B+樹定義:
B+樹是對B樹的一種變形樹,它與B樹的差別在於:
以下圖,是一個B+樹:
下圖是B+樹的插入動畫:
B和B+樹的區別在於,B+樹的非葉子結點只包含導航信息,不包含實際的值,全部的葉子結點和相連的節點使用鏈表相連,便於區間查找和遍歷。
B+ 樹的優勢在於:
可是B樹也有優勢,其優勢在於,因爲B樹的每個節點都包含key和value,所以常常訪問的元素可能離根節點更近,所以訪問也更迅速。
下面是B 樹和B+樹的區別圖:
B/B+樹經常使用於文件系統和數據庫系統中,它經過對每一個節點存儲個數的擴展,使得對連續的數據可以進行較快的定位和訪問,可以有效減小查找時間,提升存儲的空間局部性從而減小IO操做。它普遍用於文件系統及數據庫中,如:
二叉查找樹平均查找性能不錯,爲O(logn),可是最壞狀況會退化爲O(n)。在二叉查找樹的基礎上進行優化,咱們可使用平衡查找樹。平衡查找樹中的2-3查找樹,這種數據結構在插入以後可以進行自平衡操做,從而保證了樹的高度在必定的範圍內進而可以保證最壞狀況下的時間複雜度。可是2-3查找樹實現起來比較困難,紅黑樹是2-3樹的一種簡單高效的實現,他巧妙地使用顏色標記來替代2-3樹中比較難處理的3-node節點問題。紅黑樹是一種比較高效的平衡查找樹,應用很是普遍,不少編程語言的內部實現都或多或少的採用了紅黑樹。
除此以外,2-3查找樹的另外一個擴展——B/B+平衡樹,在文件系統和數據庫系統中有着普遍的應用。