哈夫曼編碼(huffman coding),是一種編碼方式。該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼。
本文當中解決的靜態哈夫曼編碼區別於動態哈夫曼編碼,即字元出現的概率是已知的,並且不會有新的字元出現。貪婪法求解該問題的難點在於每次生成新的結點時都要對剩下的結點按照權值進行排序,由於需要控制的變數較多,如何合理地設定變數變化的範圍是需要認真考慮的。
#define maxbit 20 //編碼長度不超過20
#define maxvalue 100
#define maxleaf 10 //最多的結點數
#define maxnode maxleaf*2-1 //二叉樹結點數=葉子結點數*2-1
//宣告新結構體型別名hcodetype
typedef struct
hcodetype;
//宣告新結構體型別名hnodetype
typedef struct
hnodetype;
//構造哈夫曼樹
void huffmantree(hnodetype huffnode[maxnode], int n)
//輸入n個字元的權值
cout<
for(i=0; i>huffnode[i].value;
} cout<
for(i=0; i>huffnode[i].weight;
} //貪婪法迴圈構造哈夫曼樹
hnodetype temp;//用於排序時的臨時變數
int time=1;
for(i=0;i<2*n-2;i+=2)
*///通過哈夫曼樹得到哈夫曼字典
for (i=0; i<2*n-1;i++)
h=cd.start;
c = i;
p = huffnode[c].parent;
while (p!=-1) /* 父結點存在 */
cout<
for(k=0;k
cout<
cout<
} }}
演算法 哈夫曼編碼
計算機中使用二進位制編碼字元 哈夫曼編碼是通過構造哈夫曼樹得到的,哈夫曼樹是通過貪心演算法得到的 貪心演算法構造哈夫曼樹 將字元出現的次數作為哈夫曼樹的權值,按照貪心演算法,選擇權值最小的兩個結點,成為乙個數的左右結點 左右子結點的權值變為子樹根的權值 然後在餘下的結點中遞迴選用最小的兩個結點 根據...
貪婪演算法 哈夫曼樹的構建及編碼
最優二叉樹的特點 演算法描述 1.定義節點型別 節點的結構 typedef struct nodehuffnode 2.定義森林陣列並初始化huffnode f 指向動態陣列的指標 int n 陣列的長度 從鍵盤輸入陣列長度 printf 請輸入陣列長度 scanf d n 定義儲存森林的陣列 f ...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....