利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道) ,每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。
一个完整的系统应具有以下功能;
(1) I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
(2) E:编码(Encoding).利用以建好的哈夫曼树(如不在内存,则从文件hfm'Tree中读入) ,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
(4) P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上.每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。
(5) T:印哈夫曼树(Tree printing) 。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
(1)利用教科书例6-2的数据测试程序:
(2)用下表给出的字符集和权重建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。
字符 |
空格 |
A |
B |
C |
D |
E |
F |
G |
H |
频度 |
186 |
64 |
13 |
22 |
32 |
103 |
21 |
15 |
47 |
字符 |
I |
J |
K |
L |
M |
N |
O |
P |
Q |
频度 |
57 |
1 |
5 |
32 |
20 |
57 |
63 |
15 |
1 |
字符 |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
频度 |
48 |
51 |
80 |
23 |
8 |
18 |
1 |
16 |
1 |
利用数组开到2*n-1的内存来存储哈夫曼树,然后利用文件流的操作读取、保存文件来实现各个功能。
输入I、E、D、P、T、Q进行不同的操作。
①对测试数据(1)的测试结果:
1.当输入I时会初始化输入字符集和频率并建立哈夫曼树,同时将哈夫曼树的数据保存进hfmTree.txt文件中。(代码会自动将频度换成权重)
2.输入E时,会创建二进制哈夫曼编码,并且从ToBetran文件中读取的正文进行编码,然后将编码存放于CodeFile文件。(测试的ToBetran文件为:“ABBCAAEFGH”)。结果完全正确!
3.当输入D时,会对CodeFile文件中的二进制编码进行译码,译码后,将结果存进TextFile文件中。如图,译码的结果和我们文件中的样例完全一致,说明结果正确!
4.当输入P时,进行打印编码操作,将CodeFile文件中的数据以50一行在终端进行显示,然后存储进CodePrin文件,结果以50一行输出在终端,并且已经存进了CodeFile文件中,结果正确!
5.当输入T时,系统会打印哈夫曼树:这里以‘o’作为结点,更加的美观,便于观看,同时输出它的前序遍历结果。如图:结果正确。
6.当输入Q时,直接退出:
②对测试数据(2)的测试结果:
1.当输入I时会初始化并建立哈夫曼树,同时将哈夫曼树的数据保存进hfmTree.txt文件中。
2.输入E时,会创建二进制哈夫曼编码,并且从ToBetran文件中读取的正文进行编码,然后将编码存放于CodeFile文件。(测试样例提供的ToBetran文件为:“THIS PROGRAM IS MY FAVORITE”)。结果完全正确!
3.当输入D时,会对CodeFile文件中的二进制编码进行译码,译码后,将结果存进TextFile文件中。如图,译码的结果和我们文件中的样例完全一致,说明结果正确。
4.当输入P时,进行打印编码操作,将CodeFile文件中的数据以50一行在终端进行显示,然后存储进CodePrin文件,结果以50一行输出在终端,并且已经存进了CodeFile文件中,结果正确!
5.当输入T时,系统会打印哈夫曼树:这里以‘o’作为结点,更加的美观,便于观看,同时输出它的前序遍历结果。由于数据过多,打印出来在终端自动换行了,所以利用小的数据进行对打印操作的测试,利用(A B C D E)权重为:(3 2 4 5 7);如图:结果正确。
6.当输入Q时,直接退出:
源程序文件名清单:
CodeFile.txt
CodePrin.txt
hfmTree.txt
TextFile.txt
ToBetran.txt
哈夫曼编译码器.cpp
哈夫曼编译码器.exe
//
// Created by stu_kk on 2022/4/16.
//
#include
using namespace std;
int n = 0;
char word[10001];//
int wei[10001];//权重
typedef struct HuffmanTree{
char pi;
int weight;
int parent,lchild,rchild;
}Tree;
string code[10000];
//初始化操作
Tree *hftree;
void crearteTree(int n){
hftree= (Tree*) malloc(sizeof(Tree)*(2*n-1));
for(int i = 0;i>is1;
if(is1 == 1){
cout<<"输入字符集大小:";
cin>>n;
cout<<"输入"<>word[i];
}
cout<<"输入"<>wei[i];
}
}
else{
cout<<"输入字符集大小:";
cin>>n;
cout<<"输入"<>word[i];
}
cout<<"输入"<>as;
wei[i] = as * 100;
}
};
cout<<"输入数据成功,正在创建哈夫曼树......."<>choose;
switch (choose) {
case 'I':
Init();
break;
case 'E'://c创建二进制哈夫曼编码,并且从ToBetran文件中读取的正文进行编码,然后存放于CodeFile文件
E();
break;
case 'D'://对CodeFile文件中的二进制编码进行译码。
D();
break;
case 'P':
P();//将CodeFile文件中的数据以50一行在终端进行显示,然后存储进CodePrin文件
break;
case 'T':
T();//打印哈夫曼树
break;
case 'Q':
exit(0);
default:
break;
}
}
return 0;
}
其中,一些文件为:
ToBetran.txt文本中的数据为:
THIS PROGRAM IS MY FAVORITE
三个月前写的了,如果有问题的话,就直接联系我要一些文件。