python算法與數據結構-數據結構中經常使用樹的介紹(45)

1、樹的定義

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

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

 

2、二叉樹介紹

  二叉樹是每一個節點最多有兩個子樹的樹結構。一般子樹被稱做「左子樹」(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 時爲根,除外)數組

3、徹底二叉樹介紹

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

4、滿二叉樹介紹 

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

 

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

  AVL樹本質上是一顆二叉查找樹,可是它又具備如下特色:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,而且左右兩個子樹都是一棵平衡二叉樹。在AVL樹中任何節點的兩個子樹的高度最大差異爲一,因此它也被稱爲平衡二叉樹。 優化

6、紅黑樹介紹

  紅黑樹是一種平衡二叉樹,在平衡二叉樹的基礎上每一個節點又增長了一個顏色的屬性,節點的顏色只能是紅色或黑色,其每一個結點知足如下條件:搜索引擎

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

 

7、霍夫曼樹

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

7.一、路徑和路徑長度

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

 

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 

8、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樹示例:

9、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.更適合文件索引系統。

10、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+樹要低,空間使用率更高。

 11、Trie樹

  Tire樹稱爲字典樹,又稱單詞查找樹,Trie樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用於統計,排序和保存大量的字符串(但不只限於字符串),因此常常被搜索引擎系統用於文本詞頻統計。它的優勢是:利用字符串的公共前綴來減小查詢時間,最大限度地減小無謂的字符串比較,查詢效率比哈希樹高。 

  Tire樹的三個基本性質:

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

  2) 從根節點到某一節點,路徑上通過的字符鏈接起來,爲該節點對應的字符串;

  3) 每一個節點的全部子節點包含的字符都不相同。

  Tire樹的應用:

  1) 串的快速檢索

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

在這道題中,咱們能夠用數組枚舉,用哈希,用字典樹,先把熟詞建一棵樹,而後讀入文章進行比較,這種方法效率是比較高的。

  2) 「串」排序

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

  3) 最長公共前綴

  對全部串創建字典樹,對於兩個串的最長公共前綴的長度即他們所在的結點的公共祖先個數,因而,問題就轉化爲求公共祖先的問題。

相關文章
相關標籤/搜索