1、什麼是哈夫曼樹
談到哈夫曼樹,需要了解樹的路徑長度、樹的帶權路徑長度和最優二叉樹的概念。
(1)樹的路徑長度
樹的路徑長度是從樹根到樹中每一結點的路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短
(2)樹的帶權路徑長度(weighted path length of tree,簡記為wpl)
結點的權:在一些應用中,賦予樹中結點的乙個有某種意義的實數。
結點的帶權路徑長度:結點到樹根之間的路徑長度與該結點上權的乘積。
樹的帶權路徑長度(weighted path length of tree):定義為樹中所有葉結點的帶權路徑長度之和,通常記為:
其中:
n表示葉子結點的數目
wi和li分別表示葉結點ki的權值和根到結點ki之間的路徑長度。
樹的帶權路徑長度亦稱為樹的代價。
(3)最優二叉樹或哈夫曼樹
在權為w1,w2,…,wn的n個葉子所構成的所有二叉樹中,帶權路徑長度最小(即代價最小)的二叉樹稱為最優二叉樹或哈夫曼樹。
【例】給定4個葉子結點a,b,c和d,分別帶權7,5,2和4。構造如下圖所示的三棵二叉樹(還有許多棵),它們的帶權路徑長度分別為:
(a)wpl=7*2+5*2+2*2+4*2=36
(b)wpl=7*3+5*3+2*1+4*2=46
(c)wpl=7*1+5*2+2*3+4*3=35
其中(c)樹的wpl最小,可以驗證,它就是哈夫曼樹。
注意:
① 葉子上的權值均相同時,完全二叉樹一定是最優二叉樹,否則完全二叉樹不一定是最優二叉樹。
② 最優二叉樹中,權越大的葉子離根越近。
③ 最優二叉樹的形態不唯一,wpl最小
2、構造哈夫曼樹
哈夫曼首先給出了對於給定的葉子數目及其權值構造最優二叉樹的方法,故稱其為哈夫曼演算法。其基本思想是:
(1)根據給定的n個權值wl,w2,…,wn構成n棵二叉樹的森林f=,其中每棵二叉樹ti中都只有乙個權值為wi的根結點,其左右子樹均空。
(2)在森林f中選出兩棵根結點權值最小的樹(當這樣的樹不止兩棵樹時,可以從中任選兩棵),將這兩棵樹合併成一棵新樹,為了保證新樹仍是二叉樹,需要增加乙個新結點作為新樹的根,並將所選的兩棵樹的根分別作為新根的左右孩子(誰左,誰右無關緊要),將這兩個孩子的權值之和作為新樹根的權值。
(3)對新的森林f重複(2),直到森林f中只剩下一棵樹為止。這棵樹便是哈夫曼樹。
注意:
① 初始森林中的n棵二叉樹,每棵樹有乙個孤立的結點,它們既是根,又是葉子
② n個葉子的哈夫曼樹要經過n-1次合併,產生n-1個新結點。最終求得的哈夫曼樹中共有2n-1個結點。
③ 哈夫曼樹是嚴格的二叉樹,沒有度數為1的分支結點。
總結:構造哈夫曼樹的時候,應該注意以下幾點:
(1)帶權的節點都是葉子節點
(2)路徑長度應該是層數減去1
(3)左孩子、右孩子構造父節點的時候,權值遵循一定大小的關係。(若右孩子大於左孩子,那麼接下來的構造都要按這樣的大小構造,這樣對應於右孩子編碼為1,左孩子編碼為0,避免哈夫曼編碼的過程中出現編碼的混亂現象。)
(4)記住,設計電文總長最短的二進位制字首編碼,就是以n個字元出現的頻率作為權構造一棵哈夫曼樹,由哈夫曼樹求得的編碼就是哈夫曼編碼。
3.哈夫曼編碼的實現(相關**直接摘抄網上的資料)
#include
#include
#include
using
namespace
std;
#define n 10 // 帶編碼字元的個數,即樹中葉結點的最大個數
#define m (2*n-1) // 樹中總的結點數目
class htnode;
class htcode;
void init(htcode hc, int *n)//
void select(htnode ht, int k, int *s1, int *s2)
*s1 = i;
for(i=1; i<=k; ++i)
*s2 = i;
for(i=1; i<=k; ++i)
for(i=n+1; i<=m; ++i)
cd[n-1] = '\0';
for(i=1; i<=n; ++i)
strcpy(hc[i].code, &cd[start]);
}}int main()
參考部落格:
1、2、
3、《資料結構c語言版》–嚴蔚敏p157
4、
哈夫曼樹與哈夫曼編碼
在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼 huffman 樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如 jpeg中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的...
哈夫曼樹與哈夫曼編碼
1.哈夫曼 huffman 編碼是哈夫曼樹的乙個應用。2.哈夫曼樹又稱為最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的相對值乘上其到根結點的路徑和權值。3.影象jpg就是利用了哈夫曼編碼。4.哈夫曼樹是最優二叉樹,子樹有左右次序之分。5.哈夫曼樹的形態不是唯...
哈夫曼樹與哈夫曼編碼
哈夫曼樹是一種簡單的樹結構,建樹過程如下 給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的parent節點,再從資料中刪除這兩個數,將兩個數的和加入資料中,直到所有的資料都被加入樹結構,形成一顆樹。這顆樹的所有非葉子節點都有兩個child,兩個child的值的和則是這個節點的值,根節點是...