根据哈夫曼编码的通信系统的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
河北工业大学
《数据结构》课程实验
实验报告
题目:基于哈夫曼编码的通信系统的设计与实现
专业:计算机科学与技术
班级:计1301班
姓名:张路浩刘禄源刘磊波李浩川邹博睿王超完成日期:2015-1-13
一、试验内容
1)初始化处理:建立通信系统
(1)建立有100句中文的信息集合,每个句子称为一条信息。
(2)输入编码参数:
①从终端输入编码字符集大小n,字符编码长度m(设n为4,m为8);
②从终端输入编码字符(设为A,B,C,D);
(3)生成每条信息的字符编码,构造字符编码集合;
(4)计算每个字符在字符编码集合中出现的概率;
(5)根据字符概率构造哈夫曼树,求出每个字符的二进制编码。
2)发送端信息编码
(1)用户从信息集合中选择一条信息,找到该信息对应的字符编码;
(2)根据该信息的字符编码,哈夫曼树求出的每个字符的二进制编码,构造出该信息的二进制编码,记录该二进制编码。(由于是软件模拟,没有发送设备,发送端的编码工作完成)。
3)接受端信息译码
(1)根据得到的信息的二进制编码,利用哈夫曼树求出的每个字符的二进制编码,还原出信息的字符编码;
(2)根据信息的字符编码,找到对应的信息。
5、实现提示
(1)本试验涉及到通讯学科的编码理论和信息学科的数据压缩技术。
(2)根据参数生成的通信系统的所有信息的有效存储问题。
(3)信息字符编码可参考随机数的方式生成,且要求保持唯一性
二、试验目的
(1)掌握二叉树的存储结构及其相关操作。
(2)掌握构造哈夫曼树的基本思想,及其编码/译码过程。
三、流程图
.-
用字符集对信息进行字
符编码void CreatCode(HCodeType& HT,int n)
根据各字符构的频度构
造哈夫曼树
CreatHFMTree(HT,n)
开始
结束
定义字符集大小n
输入n
输入编码长度p
定义汉字信息 string message[10]
四、源程序代码
#include
#include
#include
#include
using namespace std;
const int n=4;//叶子节点个数
const int MAXVALUE = 9999;
int m,p; //编码参数
string l;
int size;
//构造哈夫曼树结点
typedef struct{
int weight;//权值
int parent;//父节点
int lchild;//左子树
int rchild;//右子树
char word;//编码字符
}HNodeType;
//构造哈夫曼编码数组
typedef struct{
HNodeType HFMTree[2*n-1];//结点数
int bit[n];
int start;
}HCodeType;
HCodeType HT;
HCodeType HFMCode[n];
string message[10]={
{"人之初"},{"性本善"},{"性相近"},
{"习相远"},{"苟不教"},{"性乃迁"},{"教之道"},{"贵以专"}, {"昔孟母"},{"择邻处"}};
string psw[10];//存储编码
//对信息进行编码
void CreatCode(HCodeType& HT,int n)
{
int i,j,k;
char ch;//存储编码的字符集
//权重初始化
for(i=0;i<2*n-1;i++){
HT.HFMTree[i].weight=0;
}
cout<<"请输入编码字符集的大小:m = ";
cin>>m;
cout<<"请输入编码长度大小:p = ";
cin>>p;
cout<<"请输入编码字符:"< for(i = 0;i cin>>HT.HFMTree[i].word; } //对汉字信息进行编码 srand(time(NULL)); cout<<"**************************************************************"< cout<<"生成的编码为:"< for(i = 0;i<10;i++){ for(j = 0;j ch = HT.HFMTree[rand()%m].word; psw[i] +=ch; for(k = 0;k if(ch == HT.HFMTree[k].word) HT.HFMTree[k].weight++; } } if(i>0&&psw[i] == psw[i-1]){ i--; } else cout< } cout<<"各字符出现的频度为:"< for(i = 0;i cout< } } //创建哈弗曼树 void CreatHFMTree(HCodeType& HT,int n) { int i,j; int m1,x1,m2,x2; for(i = 0;i<2*n-1;i++){ HT.HFMTree[i].parent = -1; HT.HFMTree[i].rchild = -1;