前提
若二叉樹的節點存在權值,則二叉樹的葉子節點的帶權路徑長度為該葉節點的權與路徑長度(根節點到葉子節點)的乘積。
二叉樹所有葉子節點的帶權路徑長度之和稱為WPL。
定義
給定n個權值作為n個葉子節點,構造一個二叉樹,若帶權路徑長度達到最小,則稱為這樣的二叉樹為最優二叉樹,也稱為霍夫曼樹。
霍夫曼樹主要運用在霍夫曼編碼,編碼規則為:左路徑標記為0,右路徑標記為1。
image.png
上面的樹各個節點的編碼結果為
節點 | 編碼 |
---|---|
A | 00 |
B | 01 |
C | 10 |
D | 11 |
目的
為了將一串字符串以最短的二進制編碼存放
構造
1.找出字符串中每個字符的權值或頻率。
2.重復找出未進樹的所有字符中的最小權值的兩個字符,組成左右子節點,并加入此次兩個字符權重和到未進樹集合
例如:
A:60, B:45, C:13 D:69 E:14 F:5 G:3
image.png
A:60, B:45, C:13 D:69 E:14 FG:8
image.png
A:60 B: 45 D: 69 E: 14 FGC: 21
image.png
···
AD:129 FGCEB: 80
image.png
特點
可以看到。權重越高的字符,編碼長度越短
編碼沖突
由于哈夫曼樹種任意一個字符的編碼都落在了葉子節點上,并且從根節點到葉子節點中是不存在其他字符編碼的,所以不存在兩個字符中其中一個字符編碼是另一個字符編碼的子集。
霍夫曼是貪心的