python演算法與資料結構-資料結構中常用樹的介紹(45)

Se7eN_HOU發表於2019-07-04

一、樹的定義

樹是一種非線性的資料結構,是由n(n >=0)個結點組成的有限集合。
如果n==0,樹為空樹。
如果n>0,
樹有一個特定的結點,根結點
根結點只有直接後繼,沒有直接前驅。
除根結點以外的其他結點劃分為m(m>=0)個互不相交的有限集合,T0,T1,T2,...,Tm-1,每個結合是一棵樹,稱為根結點的子樹。

  • 樹(tree):是以邊(edge)相連的結點(node)的集合,每個結點儲存對應的值(value/data),當存在子結點時與之相連。 
  • 根節點(root):是樹的首個結點,在相連兩結點中更接近根結點的成為父結點(parent node),相應的另一個結點稱為子結點(parent node)。
  • 邊(edge):所有結點都由邊相連,用於標識結點間的關係。邊是樹中很重要的一個概念,因為我們用它來確定節點之間的關係。
  • 葉子節點(Leaves):是樹的末端結點,他們沒有子結點,就像真實的樹那樣 ,由根開始,伸展枝幹,到葉為止。
  • 樹高(height):是由根結點出發,到子結點的最長路徑長度。 
  • 節點深度(depth):是指對應結點到根結點路徑長度。 

 

二、二叉樹介紹

  二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)

二叉樹的性質(特性)

性質1:  在二叉樹的第i層上至多有2^(i-1)個結點(i>0)
性質2: 深度為k的二叉樹至多有2^k - 1個結點(k>0)
性質3: 對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,則N0=N2+1;
性質4: 具有n個結點的完全二叉樹的深度必為 log2(n+1)
性質5:對完全二叉樹,若從上至下、從左至右編號,則編號為i 的結點,其左孩子編號必為2i,其右孩子編號必為2i+1;其雙親的編號必為i/2(i=1 時為根,除外)

三、完全二叉樹介紹

  完全二叉樹——若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,並且葉子結點都是從左到右依次排布,這就是完全二叉樹。

四、滿二叉樹介紹 

   滿二叉樹——除了葉結點外每一個結點都有左右子葉且葉子結點都處在最底層的二叉樹。滿二叉樹:每一層都掛滿了節點

 

五、平衡二叉樹(AVL樹)介紹

  AVL樹本質上是一顆二叉查詢樹,但是它又具有以下特點:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。在AVL樹中任何節點的兩個子樹的高度最大差別為一,所以它也被稱為平衡二叉樹。 

六、紅黑樹介紹

  紅黑樹是一種平衡二叉樹,在平衡二叉樹的基礎上每個節點又增加了一個顏色的屬性,節點的顏色只能是紅色或黑色,其每個結點滿足以下條件:

  1. 每個結點都有顏色(黑或紅);
  2. 根結點總是黑色;
  3. 不存在兩個相鄰的紅色結點(一個紅色結點不能有紅色的父結點或者紅色子女結點);
  4. 從根到空節點的每條路徑都有相同數量的黑色節點。
  5. 每個葉結點(NULL)是黑色的

 

七、霍夫曼樹

  霍夫曼樹是二叉樹的一種特殊形式,又稱為最優二叉樹,其主要作用在於資料壓縮和編碼長度的優化。

7.1、路徑和路徑長度

  在一棵樹中,從一個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第L層結點的路徑長度為L-1。

 

7.2結點的權及帶權路徑長度

  若將樹中結點賦給一個有著某種含義的數值,則這個數值稱為該結點的權。結點的帶權路徑長度為:從根結點到該結點之間的路徑長度與該結點的權的乘積。

 

7.3樹的帶權路徑長度

  所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度。樹的帶權路徑長度記為WPL= (W1*L1+W2*L2+W3*L3+...+Wn*Ln)。上圖中的WPL = 6*2+3*2+8*2 = 34

7.4霍夫曼樹的構造

  給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為霍夫曼樹(Huffman Tree)。例如:給定3課二叉樹,都有4個葉子節點,A,B,C,D,分別帶權7,5,2,4,求他們的帶全路徑長度。

WPL1 = 7*2+5*2+2*2+4*2 = 36

WPL2 = 7*3+5*3+2*1+4*2 = 46

WPL3 = 7*1+5*2+2*3+4*3 = 35 

八、B樹介紹

  B樹也是一種用於查詢的平衡樹,但是它不是二叉樹。

  B樹的定義:B樹(B-tree)是一種樹狀資料結構,能夠用來儲存排序後的資料。這種資料結構能夠讓查詢資料、循序存取、插入資料及刪除的動作,都在對數時間內完成。B樹,概括來說是一個一般化的二叉查詢樹,可以擁有多於2個子節點。與自平衡二叉查詢樹不同,B-樹為系統最優化大塊資料的讀和寫操作。B-tree演算法減少定位記錄時所經歷的中間過程,從而加快存取速度。這種資料結構常被應用在資料庫和檔案系統的實作上。

  在B樹中查詢給定關鍵字的方法是,首先把根結點取來,在根結點所包含的關鍵字K1,…,Kn查詢給定的關鍵字(可用順序查詢或二分查詢法),若找到等於給定值的關鍵字,則查詢成功;否則,一定可以確定要查詢的關鍵字在Ki與Ki+1之間,Pi為指向子樹根節點的指標,此時取指標Pi所指的結點繼續查詢,直至找到,或指標Pi為空時查詢失敗。

    B樹作為一種多路搜尋樹(並不是二叉的):

  1) 定義任意非葉子結點最多隻有M個兒子;且M>2;

  2) 根結點的兒子數為[2, M];

  3) 除根結點以外的非葉子結點的兒子數為[M/2, M];

  4) 每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)

  5) 非葉子結點的關鍵字個數=指向兒子的指標個數-1;

  6) 非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

  7) 非葉子結點的指標:P[1], P[2], …, P[M];其中P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹;

  8) 所有葉子結點位於同一層;

       如下圖為一個M=3的B樹示例:

 B樹也是一種用於查詢的平衡樹,但是它不是二叉樹。

  B樹的定義:B樹(B-tree)是一種樹狀資料結構,能夠用來儲存排序後的資料。這種資料結構能夠讓查詢資料、循序存取、插入資料及刪除的動作,都在對數時間內完成。B樹,概括來說是一個一般化的二叉查詢樹,可以擁有多於2個子節點。與自平衡二叉查詢樹不同,B-樹為系統最優化大塊資料的讀和寫操作。B-tree演算法減少定位記錄時所經歷的中間過程,從而加快存取速度。這種資料結構常被應用在資料庫和檔案系統的實作上。

  在B樹中查詢給定關鍵字的方法是,首先把根結點取來,在根結點所包含的關鍵字K1,…,Kn查詢給定的關鍵字(可用順序查詢或二分查詢法),若找到等於給定值的關鍵字,則查詢成功;否則,一定可以確定要查詢的關鍵字在Ki與Ki+1之間,Pi為指向子樹根節點的指標,此時取指標Pi所指的結點繼續查詢,直至找到,或指標Pi為空時查詢失敗。

  B樹作為一種多路搜尋樹(並不是二叉的):

  1) 定義任意非葉子結點最多隻有M個兒子;且M>2;

  2) 根結點的兒子數為[2, M];

  3) 除根結點以外的非葉子結點的兒子數為[M/2, M];

  4) 每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)

  5) 非葉子結點的關鍵字個數=指向兒子的指標個數-1;

  6) 非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];

  7) 非葉子結點的指標:P[1], P[2], …, P[M];其中P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹;

  8) 所有葉子結點位於同一層;

       如下圖為一個M=3的B樹示例:

九、B+樹介紹

  B+樹是B樹的變體,也是一種多路搜尋樹:

  1) 其定義基本與B-樹相同,除了:

  2) 非葉子結點的子樹指標與關鍵字個數相同;

  3) 非葉子結點的子樹指標P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間);

  4) 為所有葉子結點增加一個鏈指標;

  5) 所有關鍵字都在葉子結點出現;

  下圖為M=3的B+樹的示意圖:

 

  B+樹的搜尋與B樹也基本相同,區別是B+樹只有達到葉子結點才命中(B樹可以在非葉子結點命中),其效能也等價於在關鍵字全集做一次二分查詢;

  B+的性質:

  1.所有關鍵字都出現在葉子結點的連結串列中(稠密索引),且連結串列中的關鍵字恰好是有序的;

  2.不可能在非葉子結點命中;

  3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層;

  4.更適合檔案索引系統。

十、B*樹介紹

  B*樹是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指標,將結點的最低利用率從1/2提高到2/3。

  B*樹如下圖所示: 

 

  B*樹定義了非葉子結點關鍵字個數至少為(2/3)*M,即塊的最低使用率為2/3(代替B+樹的1/2);

  B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的資料複製到新結點,最後在父結點中增加新結點的指標;B+樹的分裂隻影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指標;

  B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那麼將一部分資料移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字範圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,並各複製1/3的資料到新結點,最後在父結點增加新結點的指標;

  所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高。

 十一、Trie樹

  Tire樹稱為字典樹,又稱單詞查詢樹,Trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。 

  Tire樹的三個基本性質:

  1) 根節點不包含字元,除根節點外每一個節點都只包含一個字元;

  2) 從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串;

  3) 每個節點的所有子節點包含的字元都不相同。

  Tire樹的應用:

  1) 串的快速檢索

  給出N個單片語成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最早出現的順序寫出所有不在熟詞表中的生詞。

在這道題中,我們可以用陣列列舉,用雜湊,用字典樹,先把熟詞建一棵樹,然後讀入文章進行比較,這種方法效率是比較高的。

  2) “串”排序

  給定N個互不相同的僅由一個單詞構成的英文名,讓你將他們按字典序從小到大輸出。用字典樹進行排序,採用陣列的方式建立字典樹,這棵樹的每個結點的所有兒子很顯然地按照其字母大小排序。對這棵樹進行先序遍歷即可。

  3) 最長公共字首

  對所有串建立字典樹,對於兩個串的最長公共字首的長度即他們所在的結點的公共祖先個數,於是,問題就轉化為求公共祖先的問題。

 

相關文章