哈夫曼樹應用例項——哈夫曼編碼
關鍵:要設計長度不等的編碼,則必須使任一位元組的編碼都不是另一字元的編碼的字首–字首編碼。
解碼過程:
分解接收字串,遇「0」向左,遇「1」向右,一旦達到葉子結點,則譯出乙個字元,反覆由根出發,直到解碼完成。
特點:每一碼都不是另一碼的字首,絕不會譯錯。
哈弗曼樹的構造
哈弗曼樹:帶權路徑長度最小的樹。
:由一結點到另一結點間的分支所構成
路徑長度:路徑上的分支數目
帶權路徑長度:結點到根的路徑長度與結點上權的乘積
樹的帶權路徑長度:樹中所有葉子結點的帶權路徑長度之和
哈弗曼樹的構造過程
基本思想:使權大的結點靠近根。
操作要點:對權值的合併、刪除與替換,總是合併當前值最小的兩個。
哈夫曼編碼的構造
基本思想:概率大的字元用短碼,小的用長碼,構造哈弗曼樹。
構造過程:
①根據給定的n個權值,構造n棵只有根結點的二叉樹。
②在森林中選取兩棵根結點權值最小的樹作左右子樹,構造一棵新的二叉樹,置新二叉樹根結點權值為其左右子樹根結點權值之和。
③在森林中刪除這兩棵樹,同時將新得到的二叉樹加入森林中。
④重複上述兩步,直到只含一棵樹為止,這棵樹即哈弗曼樹。
哈弗曼樹構造演算法的實現
typedef
struct
*huffmantree;
huffman樹的建立//演算法5.8 建立huffman樹
void
createhuffmantree
(huffmantree &ht,
int n)
}
huffman編碼//演算法5.9 構造並輸出huffman編碼
void
createhuffmancode
(huffmantree &ht,huffmancode &hc,
int n)
hc[i]
=new
char
[n-start]
;strcpy
(hc[i]
,&cd[start]);
}for
(int i=
1;i<=n;i++
)}
哈夫曼編碼的幾點結論
● 哈夫曼編碼是不等長編碼。
● 哈夫曼編碼是字首編碼,即任一字元的編碼都不是另一字元編碼的字首。
● 哈夫曼編碼樹中沒有度為1的結點。若葉子結點的個數為n,則哈夫曼編碼樹的結點總數為2n-1。
● 傳送過程:根據由哈夫曼樹得到的編碼表送出字元資料。
● 接收過程:按左0、右1的規定,從根結點走到乙個葉結點,完成乙個字元的解碼。反覆此過程,直到接收資料結束。
應用
● 利用二叉樹求解表示式的值
資料結構 哈弗曼樹
code for fun created by dream whui 2015 2 8 include stdafx.h include using namespace std typedef struct 定義哈弗曼樹的結構 htnode,huffmantree typedef char huff...
資料結構哈弗曼樹
include using namespace std define maxvalue 1000 define n 100 typedef struct hnodetype typedef structhcodetype n為葉子節點的個數 void menu void create haffman...
資料結構之哈弗曼樹與哈弗曼編碼
一.哈弗曼樹和哈弗曼編碼先知 哈弗曼樹是二叉樹中一種特殊的樹,也被稱為最優二叉樹。其通過某種規則 權值 來構造出一哈夫曼二叉樹,在這個二叉樹中,只有葉子節點才是有效的資料節點,其他的非葉子節點是為了構造出哈夫曼而引入的!哈夫曼編碼是通過哈夫曼樹進行的一種編碼,一般情況下,以字元 0 與 1 表示。編...