樹(4)--赫夫曼樹及其應用
一:基本概念:
1.路徑:由一結點到另一結點間的分支所構成
2.路徑長度:路徑上的分支數(A->E=2)
3.樹的路徑長度:從樹根到每一結點的路徑長度之和=10
4.結點帶權路徑長度:結點到根的路徑長度與結點上權的乘積
F的帶權路徑長度WPL=9*2=18
5.樹的帶權路徑長度:WPL=,Wi表示第i個結點的權值,Li表示結點的路徑長度。
二.赫夫曼樹:
1.概念:使得WPL=最小的那一棵樹就叫做赫夫曼樹.
2.思想:我們可以這樣想,要想使得WPL最小,即權值Wi越大的Li就讓它越小,越小的Wi的Li值就讓它越大。
做法:
(1) 由給定的 n 個權值{w0, w1, w2, …, wn-1},構造具有 n 棵擴充二叉樹的森林F = { T0, T1, T2, …, Tn-1 },其中每一棵擴充二叉樹 Ti 只有一個帶有權值 wi 的根結點, 其左、右子樹均為空。
(2) 重複以下步驟, 直到 F 中僅剩下一棵樹為止:
① 在 F 中選取兩棵根結點的權值最小的擴充二叉樹, 做為左、右子樹構造一棵新的二叉樹。置新的二叉樹的根結點的權值為其左、右子樹上根結點的權值之和。
② 在 F 中刪去這兩棵二叉樹。
③ 把新的二叉樹加入 F。
三.赫夫曼樹的應用:
1.判定樹:
我們想能不能找到一種方式讓它比較的少一點呢?很明顯,我們讓比例大的分數就讓它少比較一點,讓比例小的分數讓它多比較一點,
這樣的話就能達到比較次數少的目的了,,,很顯然我們可以採用赫夫曼樹的思想。。。
再將每一比較框的兩次比較改為一次得到:
2.赫夫曼編碼
1)通訊中,可以採用0、1的不同排列來表示不同的字元,稱為二進位制編碼。傳送端需要將電文中的字元序列轉換成二進位制的0、1序列,即編碼 ;
接受端需要把接受的0、1序列轉換成對應的字元序列,即譯碼。
2)等長編碼:用相等長度的01序列來編碼,如A:01 B:10 C:11等;
不等長編碼:用不同長度的01序列來編碼,如A:001 B:01 C:1等(不等長的目的是讓出現頻率高的字元具有較短的編碼,讓出現頻率低的字元具有較長的編碼,縮短傳送電文的總長度), 採用不等長編碼很明顯不應該存在:字符集中任一字元的編碼都不能是其他字元編碼的字首。符合此要求的編碼叫做字首編碼。
3)利用二叉樹就可以實現這種編碼,讓左分支為0,右分支為1就可以實現字首編碼(可以證明的)
如圖:a:0 b:110 c:10 d:111
4).赫夫曼編碼:
設計電文總長最短的二進位制字首編碼即:以n種字元出現的頻率作權,設計一棵赫夫曼樹的問題,由此得到的二進位制字首編碼稱赫夫曼編碼
例:
可得對應的哈夫曼編碼(並與二進位制編碼比較)為:
相關文章
- 6.6 哈夫曼樹及其應用
- 有趣的赫夫曼樹
- 資料結構與演算法——赫夫曼樹(哈夫曼樹)資料結構演算法
- 哈夫曼樹及其應用(檔案壓縮)
- 哈夫曼樹及其編碼
- C#資料結構-赫夫曼樹C#資料結構
- Java 樹結構實際應用 二(哈夫曼樹和哈夫曼編碼)Java
- 哈夫曼樹
- Task A2 哈夫曼樹的應用
- 高階資料結構---赫(哈)夫曼樹及java程式碼實現資料結構Java
- 哈夫曼樹學習筆記筆記
- 【資料結構】哈夫曼樹的建立與基礎應用資料結構
- 最優二叉樹(哈夫曼樹)Java實現二叉樹Java
- 資料結構-哈夫曼樹(python實現)資料結構Python
- 重學資料結構之哈夫曼樹資料結構
- 線段樹差分及其應用
- 資料結構與演算法:哈夫曼樹資料結構演算法
- 小任的第一篇部落格-哈夫曼樹
- 一本正經的聊資料結構(6):最優二叉樹 —— 哈夫曼樹資料結構二叉樹
- 《資料結構》實驗08--樹及其應用資料結構
- 【資料結構X.11】程式碼實現 哈夫曼樹的建立,建立,構造,實現哈夫曼編碼資料結構
- 樹結構的應用
- 淺談樹形結構的特性和應用(上):多叉樹,紅黑樹,堆,Trie樹,B樹,B+樹...
- 關於資料壓縮、信源編碼、赫夫曼碼的一些研究,以及由此引出對決策樹模型的資訊理論本質的思考模型
- 字首樹及其Java實現Java
- Java 樹結構實際應用 四(平衡二叉樹/AVL樹)Java二叉樹
- 多路查詢樹(2-3 樹、2-3-4 樹、B 樹、B+ 樹)
- 資料結構之哈弗曼樹資料結構
- 哈夫曼編碼
- 字典樹及其C++實現C++
- 2-3-4樹對應紅黑樹的實現,紅黑樹的融會貫通!!!
- 樹4-樹的確定與#號建立
- 4. 決策樹
- zkw 線段樹-原理及其擴充套件套件
- Day4 樹的直徑、重心以及基環樹
- 設計模式學習筆記(十三)組合模式及其在樹形結構中的應用設計模式筆記
- 二叉樹的遍歷及應用二叉樹
- 面向NLP場景應用的智慧輔助建模(三)要素樹和概念樹建模
- 樹莓派 4 來襲!樹莓派