查找算法(5)--Tree table lookup--樹表查找

1.樹表查找

  (1) 最簡單的樹表查找算法——二叉樹查找算法。

[1]基本思想:二叉查找樹是先對待查找的數據進行生成樹,確保樹的左分支的值小於右分支的值,而後在就行和每一個節點的父節點比較大小,查找最適合的範圍。 這個算法的查找效率很高,可是若是使用這種查找方法要首先建立樹。 java

[2]二叉查找樹(BinarySearch Tree,也叫二叉搜索樹,或稱二叉排序樹Binary Sort Tree)或者是一棵空樹,或者是具備下列性質的二叉樹:node

  • 1)若任意節點的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值;
  • 2)若任意節點的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值;
  • 3)任意節點的左、右子樹也分別爲二叉查找樹。

     [3]二叉查找樹性質:對二叉查找樹進行中序遍歷,便可獲得有序的數列。算法

     不一樣形態的二叉查找樹以下圖所示:數據庫

 

[4]複雜度分析:它和二分查找同樣,插入和查找的時間複雜度均爲O(logn),可是在最壞的狀況下仍然會有O(n)的時間複雜度。緣由在於插入和刪除元素的時候,樹沒有保持平衡(好比,咱們查找上圖(b)中的「93」,咱們須要進行n次查找操做)。咱們追求的是在最壞的狀況下仍然有較好的時間複雜度,這就是平衡查找樹設計的初衷。編程

下圖爲二叉樹查找和順序查找以及二分查找性能的對比圖:緩存

 

    基於二叉查找樹進行優化,進而能夠獲得其餘的樹表查找算法,如平衡樹、紅黑樹等高效算法。數據結構

  (2)平衡查找樹之2-3查找樹(2-3 Tree)

[1]2-3查找樹定義:和二叉樹不同,2-3樹運行每一個節點保存1個或者兩個的值。對於普通的2節點(2-node),他保存1個key和左右兩個本身點。對應3節點(3-node),保存兩個Key,2-3查找樹的定義以下:編程語言

    • 1)要麼爲空,要麼:
    • 2)對於2節點,該節點保存一個key及對應value,以及兩個指向左右節點的節點,左節點也是一個2-3節點,全部的值都比key要小,右節點也是一個2-3節點,全部的值比key要大。
    • 3)對於3節點,該節點保存兩個key及對應value,以及三個指向左中右的節點。左節點也是一個2-3節點,全部的值均比兩個key中的最小的key還要小;中間節點也是一個2-3節點,中間節點的key值在兩個跟節點key值之間;右節點也是一個2-3節點,節點的全部key值比兩個key中的最大的key還要大。

    [2]2-3查找樹的性質:

    • 1)若是中序遍歷2-3查找樹,就能夠獲得排好序的序列;
    • 2)在一個徹底平衡的2-3查找樹中,根節點到每個爲空節點的距離都相同。(這也是平衡樹中「平衡」一詞的概念,根節點到葉節點的最長距離對應於查找算法的最壞狀況,而平衡樹中根節點到葉節點的距離都同樣,最壞狀況也具備對數複雜度。)

    性質2)以下圖所示:性能

 

    [3]複雜度分析:優化

      2-3樹的查找效率與樹的高度是息息相關的。

      • 在最壞的狀況下,也就是全部的節點都是2-node節點,查找效率爲lgN
      • 在最好的狀況下,全部的節點都是3-node節點,查找效率爲log3N約等於0.631lgN

      距離來講,對於1百萬個節點的2-3樹,樹的高度爲12-20之間,對於10億個節點的2-3樹,樹的高度爲18-30之間。

         對於插入來講,只須要常數次操做便可完成,由於他只須要修改與該節點關聯的節點便可,不須要檢查其餘節點,因此效率和查找相似。下面是2-3查找樹的效率:

  (3) 平衡查找樹之紅黑樹(Red-Black Tree)

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查找樹的一種實現,它能保證最壞狀況下仍然具備對數的時間複雜度。

    紅黑樹這種數據結構應用十分普遍,在多種編程語言中被用做符號表的實現,如:

  • Java中的java.util.TreeMap,java.util.TreeSet;
  • C++ STL中的:map,multimap,multiset;
  • .NET中的:SortedDictionary,SortedSet 等。

 (4)B樹和B+樹(B Tree/B+ Tree)

     平衡查找樹中的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-1個key,而且以升序排列
  • 位於M-1和M key的子節點的值位於M-1 和M key對應的Value之間
  • 其它節點至少有M/2個子節點

    下圖是一個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樹的差別在於:

    • 有k個子結點的結點必然有k個關鍵碼;
    • 非葉結點僅具備索引做用,跟記錄有關的信息均存放在葉結點中。
    • 樹的全部葉結點構成一個有序鏈表,能夠按照關鍵碼排序的次序遍歷所有記錄。

    以下圖,是一個B+樹:

 

    下圖是B+樹的插入動畫:

 

 

  B和B+樹的區別在於,B+樹的非葉子結點只包含導航信息,不包含實際的值,全部的葉子結點和相連的節點使用鏈表相連,便於區間查找和遍歷。

  B+ 樹的優勢在於:

  • 因爲B+樹在內部節點上很差含數據信息,所以在內存頁中可以存放更多的key。 數據存放的更加緊密,具備更好的空間局部性。所以訪問葉子幾點上關聯的數據也具備更好的緩存命中率。
  • B+樹的葉子結點都是相鏈的,所以對整棵樹的便利只須要一次線性遍歷葉子結點便可。並且因爲數據順序排列而且相連,因此便於區間查找和搜索。而B樹則須要進行每一層的遞歸遍歷。相鄰的元素可能在內存中不相鄰,因此緩存命中性沒有B+樹好。

  可是B樹也有優勢,其優勢在於,因爲B樹的每個節點都包含key和value,所以常常訪問的元素可能離根節點更近,所以訪問也更迅速。

  下面是B 樹和B+樹的區別圖:

B/B+樹經常使用於文件系統和數據庫系統中,它經過對每一個節點存儲個數的擴展,使得對連續的數據可以進行較快的定位和訪問,可以有效減小查找時間,提升存儲的空間局部性從而減小IO操做。它普遍用於文件系統及數據庫中,如:

  • Windows:HPFS文件系統;
  • Mac:HFS,HFS+文件系統;
  • Linux:ResiserFS,XFS,Ext3FS,JFS文件系統;
  • 數據庫:ORACLE,MYSQL,SQLSERVER等中。

  (5)樹表查找總結:

  二叉查找樹平均查找性能不錯,爲O(logn),可是最壞狀況會退化爲O(n)。在二叉查找樹的基礎上進行優化,咱們可使用平衡查找樹。平衡查找樹中的2-3查找樹,這種數據結構在插入以後可以進行自平衡操做,從而保證了樹的高度在必定的範圍內進而可以保證最壞狀況下的時間複雜度。可是2-3查找樹實現起來比較困難,紅黑樹是2-3樹的一種簡單高效的實現,他巧妙地使用顏色標記來替代2-3樹中比較難處理的3-node節點問題。紅黑樹是一種比較高效的平衡查找樹,應用很是普遍,不少編程語言的內部實現都或多或少的採用了紅黑樹。

    除此以外,2-3查找樹的另外一個擴展——B/B+平衡樹,在文件系統和數據庫系統中有着普遍的應用。

相關文章
相關標籤/搜索