描述
輸入一串字串,根據給定的字串中字元出現的頻率建立相應哈夫曼樹,構造哈夫曼編碼表,在此基礎上可以對待壓縮檔案進行壓縮(即編碼),同時可以對壓縮後的二進位制編碼檔案進行解壓(即解碼)。
輸入多組資料,每組資料一行,為乙個字串(只考慮26個小寫字母即可)。當輸入字串為「0」時,輸入結束。
輸出每組資料輸出2n+3行(n為輸入串中字元類別的個數)。第一行為統計出來的字元出現頻率(只輸出存在的字元,格式為:字元:頻度),每兩組字元之間用乙個空格分隔,字元按照ascii碼從小到大的順序排列。第二行至第2n行為哈夫曼樹的儲存結構的終態(形如教材139頁表5.2(b),一行當中的資料用空格分隔)。第2n+1行為每個字元的哈夫曼編碼(只輸出存在的字元,格式為:字元:編碼),每兩組字元之間用乙個空格分隔,字元按照ascii碼從小到大的順序排列。第2n+2行為編碼後的字串,第2n+3行為解碼後的字串(與輸入的字串相同)。
輸入樣例 1
aaaaaaabbbbbccddddaabccc
0
輸出樣例 1
a:7 b:5 c:2 d:41 7 7 0 0
2 5 6 0 0
3 2 5 0 0
4 4 5 0 0
5 6 6 3 4
6 11 7 2 5
7 18 0 1 6
a:0 b:10 c:110 d:111
00000001010101010110110111111111111
aaaaaaabbbbbccdddd
a:2 b:1 c:3
1 2 4 0 0
2 1 4 0 0
3 3 5 0 0
4 3 5 2 1
5 6 0 3 4
a:11 b:10 c:0
111110000
aabccc
#include #include #include using namespace std;int d;int fre[26];int kn=0;int k=0;char namelist[26];
typedef structhtnode,*huffmantree;
typedef char** huffmancode;
typedef structletter;
void select(huffmantree ht,int len,int &s1,int &s2)
d=i;
// cout<<"一共輸入了"<>s;
if("0"==s) break;
initdata(fre);
frequestats(fre,s);
huffmantree ht;
huffmancode hc;
createhuffmantree(ht,k);
creathuffmancode(ht,hc,k);
show(ht,hc);
tranfer(hc,s);
} return 0;
}
基於哈夫曼樹的資料壓縮演算法優化版
可同時處理多組字串,解決了字串中字母不按照字母表順序出現以及中間出現 缺口 字母的問題。例如原來的哈夫曼無法解決aaaaccccddd這樣的字串 b字母沒有出現 和zzzzyyanhsayyxxcccxx這樣出現順序沒有規律的情況。在輸出最終編碼的時候是引入原始字串逐個用編碼替換的,這樣保證編譯碼對...
資料結構實驗 基於哈夫曼樹的資料壓縮演算法
注 輸入為多行字串,以 0 結尾 例 abc def 0 此程式無法執行由單個字元組成的字串。include include include using namespace std typedef struct htnode,huffmantree typedef char huffmancode ...
哈夫曼壓縮演算法
給你40分鐘的時間,你可以思考十分鐘,然後用三十分鐘的時間來寫 最後浪費在無謂的除錯上 你也可以思考半個小時,徹底弄清問題的本質與程式的脈絡,然後用十分鐘的時間來編寫 體會 如行雲流水而出的感覺。在程式設計過程當中,相信大家都深有體會,在除錯上浪費時間,問題出現在下筆之前沒有乙個系統結構。哈夫曼在通...