根据哈夫曼编码的通信系统的设计与实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档