基於哈夫曼樹的資料壓縮演算法

2021-10-03 01:55:11 字數 1524 閱讀 1492

描述

輸入一串字串,根據給定的字串中字元出現的頻率建立相應哈夫曼樹,構造哈夫曼編碼表,在此基礎上可以對待壓縮檔案進行壓縮(即編碼),同時可以對壓縮後的二進位制編碼檔案進行解壓(即解碼)。

輸入多組資料,每組資料一行,為乙個字串(只考慮26個小寫字母即可)。當輸入字串為「0」時,輸入結束。

輸出每組資料輸出2n+3行(n為輸入串中字元類別的個數)。第一行為統計出來的字元出現頻率(只輸出存在的字元,格式為:字元:頻度),每兩組字元之間用乙個空格分隔,字元按照ascii碼從小到大的順序排列。第二行至第2n行為哈夫曼樹的儲存結構的終態(形如教材139頁表5.2(b),一行當中的資料用空格分隔)。第2n+1行為每個字元的哈夫曼編碼(只輸出存在的字元,格式為:字元:編碼),每兩組字元之間用乙個空格分隔,字元按照ascii碼從小到大的順序排列。第2n+2行為編碼後的字串,第2n+3行為解碼後的字串(與輸入的字串相同)。

輸入樣例 1 

aaaaaaabbbbbccdddd

aabccc

0

輸出樣例 1

a:7 b:5 c:2 d:4

1 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分鐘的時間,你可以思考十分鐘,然後用三十分鐘的時間來寫 最後浪費在無謂的除錯上 你也可以思考半個小時,徹底弄清問題的本質與程式的脈絡,然後用十分鐘的時間來編寫 體會 如行雲流水而出的感覺。在程式設計過程當中,相信大家都深有體會,在除錯上浪費時間,問題出現在下筆之前沒有乙個系統結構。哈夫曼在通...