哈夫曼樹
哈夫曼樹是一種最優二叉樹,其定義是:給定n個權值做爲n個葉子節點,構造一棵二叉樹,若樹的帶權路徑長度達到最小,這樣的樹就達到最優二叉樹,也就是哈夫曼樹,示例圖以下:
web
基本概念
深刻學習哈夫曼樹前,先了解一下基本概念,並以上面的哈夫曼樹圖爲例svg
- 路徑:樹中一個結點到另外一個結點之間的分支序列構成兩個結點間的路徑。
- 路徑長度:路徑中分支的數目,從根結點到第L層結點的路徑長度爲L-1。例如100和80的路徑長度爲1,50和30的路徑長度爲2。
- 結點的權:樹中結點的數值,例如100,50那些。
- 結點帶權路徑長度:根結點到該結點之間的路徑長度與該結點的權的乘積。 如結點20的路徑長度爲3,該結點的帶權路徑長度爲:3*20 = 60。
- 樹的帶權路徑長度:全部葉子結點的帶權路徑長度之和,記爲WPL。例如上圖樹的WPL = 1*100 + 2*80 +3*20 +3*10 = 350。
帶權路徑長度比較
前面說到,哈夫曼樹是最優二叉樹,由於符合哈夫曼樹特色的樹的帶權路徑長度必定是最小的,咱們將哈夫曼樹和普通的二叉樹作個比較,仍以上圖爲例,上圖的哈夫曼樹是結點10,20,50,100組成的二叉樹,WPL是350,用這四個結點組成普通的二叉樹,結果以下:
不難計算,該二叉樹的WPL = 2*10 + 2*20 + 2*50 + 2*100 = 360,明顯比哈夫曼樹大,固然二叉樹的組成結果不惟一,但WPL必定比哈夫曼樹大。因此說哈夫曼樹是最優二叉樹。學習
哈夫曼樹的構造
如今假定有n個權值,設爲w一、w二、…、wn,將這n個權值當作是有n棵樹的森林,根據最小帶權路徑長度的原則,咱們能夠按照下面步驟來將森林構形成哈夫曼樹:編碼
- 在森林中選出根結點的權值最小的兩棵樹進行合併,做爲一棵新樹的左、右子樹,且新樹的根結點權值爲其左、右子樹根結點權值之和;
- 從森林中刪除選取的兩棵樹,並將新樹加入森林;
- 重複一、2步,直到森林中只剩一棵樹爲止,該樹即爲所求得的哈夫曼樹。
以森林 (16,20,23,24,50) 爲例,其構造步驟以下:加密
① 合併權值爲16和20的樹,構成權值爲36的新樹,森林變爲(36,23,24,50);spa
② 合併最小的兩棵樹23和24,組成新的樹47,這時森林變爲(36,47,50);.net
③ 合併36和47的樹做爲權值83的新樹,並和50結合組成根節點權值爲133的哈夫曼樹。xml
最終結果圖以下:
blog
哈夫曼編碼
哈夫曼是一種無前綴編碼,使用一種特別的方法爲信號源中的每一個符號設定二進制碼,解碼時不會混淆。其主要應用在數據壓縮,加密解密等場合。能夠與哈夫曼樹進行結合生成。遞歸
給哈夫曼樹的根節點分配比特0,左子樹分配0,右字數分配1,一直遞歸下去,而後就能夠獲得符號的碼值了。假設我有A,B,C,D,E五個字符,出現的頻率(即權值)分別爲5,4,3,2,1。
這樣結點對應的編碼爲:16 - > 100,20 - > 101,23 - > 110,24 - > 111,50 - > 0
本文分享 CSDN - 鄙人薛某。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。