日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python算法与数据结构-数据结构中常用树的介绍(45)

發布時間:2024/9/20 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python算法与数据结构-数据结构中常用树的介绍(45) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀目錄

  • 一、樹的定義
  • 二、二叉樹介紹
  • 三、完全二叉樹介紹
  • 四、滿二叉樹介紹?
  • 五、平衡二叉樹(AVL樹)介紹
  • 六、紅黑樹介紹
  • 七、霍夫曼樹
  • 八、B樹介紹
  • 九、B+樹介紹
  • 十、B*樹介紹
  • ?十一、Trie樹

一、樹的定義

樹是一種非線性的數據結構,是由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樹中任何節點的兩個子樹的高度最大差別為一,所以它也被稱為平衡二叉樹。?

?

六、紅黑樹介紹

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

  • 每個結點都有顏色(黑或紅);
  • 根結點總是黑色;
  • 不存在兩個相鄰的紅色結點(一個紅色結點不能有紅色的父結點或者紅色子女結點);
  • 從根到空節點的每條路徑都有相同數量的黑色節點。
  • 每個葉結點(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樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用于統計,排序和保存大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統用于文本詞頻統計。它的優點是:利用字符串的公共前綴來減少查詢時間,最大限度地減少無謂的字符串比較,查詢效率比哈希樹高?!?/p>

      Tire樹的三個基本性質:

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

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

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

      Tire樹的應用:

      1)?串的快速檢索

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

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

      2)?“串”排序

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

      3) 最長公共前綴

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

    ?


    侯哥語錄:我曾經是一個職業教育者,現在是一個自由開發者。我希望我的分享可以和更多人一起進步。分享一段我喜歡的話給大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么。當你還沒有能力說不得時候,就努力讓自己變得強大,擁有說不得權利。"

    來源:https://www.cnblogs.com/Se7eN-HOU/p/11132082.html

    總結

    以上是生活随笔為你收集整理的python算法与数据结构-数据结构中常用树的介绍(45)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。