哈夫曼编译码器实验报告

哈夫曼编译码器实验报告
哈夫曼编译码器实验报告

实验五哈夫曼编/译码器学院: 工学院系: 计算机系专业: 计算机科学与技术年级: 2009

姓名: 学号: 完成实验时间: 2011-5-19

一.需求分析

1.问题描述

用huffman编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。是为着这样的信息收发站写一个huffman编/译码系统。

2.基本要求

该系统应具有以下功能:

(1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存进文件hfmTree中。

(2)E:编码(Encoding)。利用建好的哈夫曼树(如不在内存中,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。(3)D:译码(Decoding)。(利用已经建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。

(4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。

(5)T:印哈夫曼树(Tree printing)。将已在内存中的哈夫曼树以直观的方式(凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrin中。

3.测试数据

(1)利用下面这道题中的数据调试程序。

某系统在通信联络中只可能出现八种字符,其概率分别为0.25,0.29,0.07,0.08,

0.14,0.23,0.03,0.11,试设计哈夫曼编码。

(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROMGRAM IS MY FAVORITE”。

二.概要设计

本程序的数据类型定义为

typedef struct{

unsigned int weight;

unsigned int parent,lchild,rchild;

}HTNode,*HuffmanTree;

typedef char** HuffmanCode;

所实现的功能函数如下

void initHuffmanTree();//选择初始化哈夫曼树的方式

int openfileInit();//通过打开的data.txt文件初始化哈夫曼树该文件是为了测试数据2 包涵26个字符

int inputInit();//通过手动输入字符初始化哈夫曼树

int HuffmanCoding(int *w); //初始化哈夫曼数,按照哈夫曼规则建立二叉树。此函数块调用了Select()函数。

void Select(int j,int &s1,int &s2); //选择parent为0,且weight最小的两个节点序号为s1,s2

void encoding();//选择哈夫曼编码方式

void openfileEnco();//通过打开文件encode.txt的方式进行编码

void inputEnco();//通过手动输入的方式进行编码

void decode();//选择译码方式

void openfileDeco();//通过打开文件CodeFile.txt的方式进行译码

void inputDeco();//通过手动输入的方式进行译码

void dispHT( HuffmanTree nodeRoot, int level ); //以缩进方式输出哈夫曼树直观图主函数

主函数主要设计的是一个分支语句,让用户挑选所实现的功能。

如图所示:

三.详细设计

#include

#include

#include

using namespace std;

ofstream outstuf;

typedef struct{

unsigned int weight;

unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree;

typedef char** HuffmanCode;

HuffmanTree HT=NULL;

int n=0;

HuffmanCode HC=NULL;

char *ch=NULL;

void initHuffmanTree();

int openfileInit();

int inputInit();

int HuffmanCoding(int *w);

void Select(int j,int &s1,int &s2);

void encoding();

void openfileEnco();

void inputEnco();

void decode();

void openfileDeco();

void inputDeco();

void dispHT( HuffmanTree nodeRoot, int level );

void initHuffmanTree(){ //选择初始化哈夫曼树

int sel=0;

for(;;){

cout<<"\t*********************************************************"<

cout<<"\t* "<<"字符集及权值来源\t\t\t\t\t*"<

cout<<"\t*\t"<<"1.使用权值文件data.txt进行编码\t\t\t*"<

cout<<"\t*\t"<<"2.自行输入字符集及权值\t\t\t\t*"<

cout<<"\t*\t"<<"3.返回上层\t\t\t\t\t*"<

cout<<"\t*********************************************************"<

cout<<"请输入您的选择"<

cin>>sel;

if(sel==3) break;

switch(sel)

{case 1:openfileInit();break;

case 2:inputInit();break;

default:cout<<"对不起,您输入的数据有误!请重新输入。"<

}

};

}

int openfileInit(){ //通过打开的data.txt文件初始化哈夫曼树该文件是为了测试数据2 包涵26个字符

int *w=(int*)malloc(28*sizeof(int));

ch=(char*)malloc(28*sizeof(char));

n=27;

ifstream infile("data.txt",ios::in);

if(!infile){

cerr<<"open error!"<

exit(1);

}

cout<<" 权值文件中的信息(#代表空格)"<

for(int i=1;infile.eof()==0;i++){

infile>>ch[i];

infile>>w[i];

}

cout<

infile.close();

cout<<" 字符:";

for(i=1;i<10;i++) cout<

cout<<" 权值:";

for(i=1;i<10;i++) cout<

cout<<" 字符:";

for(i=10;i<19;i++) cout<

cout<<" 权值:";

for(i=10;i<19;i++) cout<

cout<<" 字符:";

for(i=19;i<28;i++) cout<

cout<<" 权值:";

for(i=19;i<28;i++) cout<

cout<

n=27;

HuffmanCoding(w);

cout<<" 各字符编码如下:"<

for(i=1;i<=27;i++) {

cout<<" "<

cout<

};

outstuf.open("code.txt",ios::out);

for(i=1;i<=27;i++) {outstuf<

return 0;

}

int inputInit(){ //通过手动输入字符初始化哈夫曼树

cout<<" 请输入字符集n\t";

cin>>n;

int *w=(int *)malloc((n+1)*sizeof(int));

if(!w) {cout<<"ERROR";return 0;}

ch=(char *)malloc((n+1)*sizeof(char));

if(!ch) {cout<<"ERROR";return 0;}

cout<<" 请输入各字符\t";

for(int i=1;i<=n;i++) cin>>ch[i];

cout<<" 请输入各权值\t";

for(i=1;i<=n;i++) cin>>w[i];

//outstuf.close();

outstuf.open("hfmTree.txt",ios::out);

for(i=1;i<=n;i++){outstuf<

cout<

HuffmanCoding(w);

cout<<" 各字符编码如下:";

for(i=1;i<=n;i++) {

cout<<" "<

cout<

} ;

outstuf.close();

outstuf.open("code.txt",ios::out);

for(i=1;i<=n;i++){outstuf<

cout<

outstuf.close();

return 0;

}

int HuffmanCoding(int *w){ //哈夫曼编码

if(n<=1) return 1;

int m=2*n-1;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

if(!HT) {cout<<"ERROR";return 0;}

for(int i=1; i<=n; ++i)

{

HT[i].weight=w[i];

HT[i].parent=HT[i].lchild=HT[i].rchild=0;

}

for(;i<=m; ++i) HT[i].weight=HT[i].parent=HT[i].lchild=HT[i].rchild=0;

int s1=0;

int s2=0;

for(i=n+1;i<=m; ++i){

Select(i-1, s1, s2);

HT[s1].parent=i; HT[s2].parent=i;

HT[i].lchild=s1; HT[i].rchild=s2;

HT[i].weight=HT[s1].weight+ HT[s2].weight;

}

HC=(HuffmanCode)malloc((n+1)*sizeof(char*));

char *cd=(char*) malloc(n*sizeof(char));

if(!cd) {cout<<"ERROR";return 0;}

cd[n-1]='\0';

int start;

for(i=1;i<=n;++i){

start=n-1;

for(int c=i,unsigned int f=HT[i].parent;f!=0;c=f,f=HT[f].parent)

{if(HT[f].lchild==c) cd[--start]='0';

else cd[--start]='1';

}

HC[i]=(char*)malloc((n-start)*sizeof(char));

strcpy(HC[i],&cd[start]);

}

free(cd);

return 0;

}

void Select(int j,int &s1,int &s2){ //选择parent为0,且weight最小的两个节点序号为s1,s2

for(int h=1;h<=j;h++)

if(HT[h].parent==0) {s1=h;break;}

h++;

for(;h<=j;h++)

if(HT[h].parent==0) {s2=h;break;}

int m;

if(HT[s1].weight>HT[s2].weight) {m=s1;s1=s2;s2=m;}

h++;

for(;h<=j;h++)

if(HT[s1].weight>HT[h].weight&&HT[h].parent==0) s1=h;

for(m=1;m<=j;m++)

if(HT[s2].weight>HT[m].weight&&m!=s1&&HT[m].parent==0) s2=m;

}

void encoding(){ //选择哈夫曼编码方式

int sel=0;

for(;;){

if(!HT) {cout<<"对不起,哈夫曼树不存在!请先建立哈夫曼树。"<

cout<<"\t*********************************************************"<

cout<<"\t*\t"<<"1.使用已有文件encode.txt进行编码\t\t*"<

cout<<"\t*\t"<<"2.自行输入文件进行编码\t\t\t\t*"<

cout<<"\t*\t"<<"3.返回上层\t\t\t\t\t*"<

cout<<"\t*********************************************************"<

cin>>sel;

if(sel==3) break;

switch(sel)

{case 1:openfileEnco();break;

case 2:inputEnco();break;

default:cout<<"对不起,您输入的数据有误!请重新输入。"<

}

}

void openfileEnco(){ //通过打开文件encode.txt的方式进行编码

cout<<" encode.txt文件内容如下(#代表空格):"<

ifstream infile("encode.txt",ios::in);

if(!infile){

cerr<<"open error!"<

exit(1);

}

char *file=(char *)malloc(200*sizeof(char));

for(int i=1;infile.eof()==0&&i!=200;i++){

infile>>file[i];

cout<

if(i==200) {

file=(char *)realloc(file,(200+80)*sizeof(char));

for(;infile.eof()==0&&i!=280;i++){

infile>>file[i];

cout<

}

}

infile.close();

cout<

int m=i;

cout<<" 编码结果是:"<

//outstuf.close();

outstuf.open("CodeFile.txt",ios::out);

for(i=1;i

for(int j=1;j<=n;j++)if(file[i]==ch[j]) {cout<

if(j==(n+1)) {cout<

}

cout<

outstuf.close();

}

void inputEnco(){ //通过手动输入的方式进行编码

cout<<" 请输入您要编码的文章(以$作为文章结尾)"<

char *file=(char *)malloc(200*sizeof(char));

for(int i=1;i<200;i++){

cin>>file[i];

if(file[i]=='$') break;

}

if(i==200) {

file=(char *)realloc(file,(200+80)*sizeof(char));

for(;i<280;i++){

cin>>file[i];

if(file[i]=='$') break;

}

}

cout<<" 编码结果是:"<

//outstuf.close();

outstuf.open("CodeFile.txt",ios::out);

for(i=1;i

for(int j=1;j<=n;j++)if(file[i]==ch[j]) {

cout<

outstuf<

}//将编码结果写入 CodeFile.txt

if(j==(n+1)) {cout<

}

cout<

outstuf.close();

}

void decode(){ //选择译码方式

int sel=0;

for(;;){

if(!HT) {cout<<"对不起,哈夫曼树不存在!请先建立哈夫曼树。"<

cout<<"\t*********************************************************"<

cout<<"\t* "<<"要译码的文件来源\t\t\t\t\t*"<

cout<<"\t*\t"<<"1.使用已有文件CodeFile.txt进行译码\t\t*"<

cout<<"\t*\t"<<"2.自行输入文件进行译码\t\t\t\t*"<

cout<<"\t*\t"<<"3.返回上层\t\t\t\t\t*"<

cout<<"\t*********************************************************"<

cout<<"请输入您的选择"<

cin>>sel;

if(sel==3) break;

switch(sel)

{case 1:openfileDeco();break;

case 2:inputDeco();break;

default:cout<<"对不起,您输入的数据有误!请重新输入。"<

}

}

void inputDeco(){ //通过手动输入的方式进行译码

int m=2*n-1;

char *password=(char *)malloc(200*sizeof(char));

cout<<" 请输入要译码的文件(以$结束)"<

for(int i=1;i<200&&password[i-1]!='$';i++) cin>>password[i];

if(i==200) {

password=(char *)realloc(password,(200+80)*sizeof(char));

for(;i<280&&password[i]!='$';i++) cin>>password[i];

}

cout<<"译码结果为(#代表空格)"<

//outstuf.close();

outstuf.open("TextFile.txt",ios::out);

for(i=1;password[i]!='$';){

char record[20];

for(int j=0,q=i;password[q]!='$';j++,q++){

if(password[q]=='0') {record[j]='0';m=HT[m].lchild;}

else {record[j]='1';m=HT[m].rchild;}

if(HT[m].rchild==0) {record[j+1]='\0';break;}

}

if(HT[m].rchild!=0) {cout<

for(int p=1;p<=n;p++){

if(!strcmp(record,HC[p])) {outstuf<

}

i=i+strlen(record);

m=2*n-1;

}

cout<

outstuf.close();

}

void openfileDeco(){ //通过打开文件CodeFile.txt的方式进行译码

int m=2*n-1;

cout<<" CodeFile.txt文件内容如下:"<

ifstream infile("CodeFile.txt",ios::in);

if(!infile){

cerr<<"open error!"<

exit(1);

}

char *password=(char *)malloc(200*sizeof(char));

for(int i=1;infile.eof()==0&&i!=200;i++){

infile>>password[i];

cout<

}

if(i==200) {

password=(char *)realloc(password,(200+80)*sizeof(char));

for(;infile.eof()==0&&i!=280;i++){

infile>>password[i];

cout<

}

}

infile.close();

password[++i]='$';

cout<

cout<<"译码结果为(#代表空格)"<

//outstuf.close();

outstuf.open("TextFile.txt",ios::out);

for(i=1;password[i]!='$';){

char record[20];

for(int j=0,q=i;password[q]!='$';j++,q++){

if(password[q]=='0') {record[j]='0';m=HT[m].lchild;}

else {record[j]='1';m=HT[m].rchild;}

if(HT[m].rchild==0) {record[j+1]='\0';break;}

}

if(HT[m].rchild!=0) {cout<

for(int p=1;p<=n;p++){

if(!strcmp(record,HC[p])) { outstuf<

}

i=i+strlen(record);

m=2*n-1;

}

cout<

outstuf.close();

}

void dispHT( HuffmanTree nodeRoot, int level ) {//以缩进方式输出哈夫曼树

if(HT==NULL) return;

if(nodeRoot->rchild) {

dispHT(HT+nodeRoot->rchild,level+1);

}

for(int i=0;i

{cout<<"

";outstuf<<" ";}

else {cout<<"-------";outstuf<<"-------";} }

cout<weight<weight<

if(nodeRoot->lchild!=0 ) {

dispHT(HT+nodeRoot->lchild,level+1);

}

}

int main(){

int sel=0;

cout<<"\t\t\t->欢迎使用哈夫曼编码/译码器<-"<

for(;;){

cout<<"\t*********************************************************"<

cout<<"\t*\t"<<"2.输出哈夫曼树\t\t\t\t\t*"<

cout<<"\t*\t"<<"3.编码\t\t\t\t\t\t*"<

cout<<"\t*\t"<<"4.译码\t\t\t\t\t\t*"<

cout<<"\t*\t"<<"5.退出\t\t\t\t\t\t*"<

cout<<"\t*********************************************************"<

cin>>sel;

if(sel==5) break;

switch(sel)

{case 1:initHuffmanTree();break;

case 3:encoding();break;

case 2:{if(HC==NULL) cout<<"对不起,哈夫曼树不存在!请先建立哈夫曼树。

"<

else {outstuf.open("TreePrint.txt",ios::out); dispHT(HT+2*n-1,1);outstuf.close();}break;}

case 4:decode();break;

default:cout<<"对不起,您输入的数据有误!请重新输入。"<

}

}

outstuf.close();

cout<<"-------------------------------感谢使用本系统!--------------------------------"<

return 0;

}

四、调试分析:

在写程序与调试的过程中,发现自己对于函数的调用与参数的传递的方面还是存在很多问题,从参数的类型等等方面都出现了很多问题。

关于这个程序的要求比较复杂,刚开始做的时候没有任何思路,最后分模块一点一点的进行。在输出树的直观图的问题上一开始困扰了我很久,后来想到用一个level记录层数,以缩进的方式分层显示,解决了这个问题。

在调试过程中,出现了很多次明明建立了文件却发现未存入数据的情况,为此我多次进行调试,发现是打开文件的操作放在了循环体内部导致数据无法写入。

整体而言,整个程序主要使用了HuffmanCoding()的方式进行哈夫曼编码,在encoding()里面用了字符串的匹配进行译码,在decode()里进行了重新遍历树的过程,在算法的效率以及如何更为节省空间的存储数据上都要进一步改进。

五.测试

欢迎界面

构建哈夫曼树

使用权值文件构建

各字符编码显示

自行输入建树

输入的字符与权值被保存在hfmTree.txt里面

使用data.txt建立的哈夫曼树输出直观图

(不全)

同时存入了文件

自行输入文件进行编码

编码结果被存储在CodeFile.txt文件里

通过打开文件进行译码

译码结果被存储

通过打开encode.txt文件进行编码

编码结果同时被存储通过自行输入文件进行译码

译码同时被存储

退出

六.附录

Hfm.cpp

Hfm.exe

data.txt

哈夫曼编码译码器

哈夫曼编码译码器

哈夫曼编码译码器 学院班级: 信息工程学院软件1501 指导教师: 朱俊武 小组成员: 刘洋蒋佳烨冀若含 本人学号: 151303107 报告书写: 冀若含 学生成绩:

目录 一、总体介绍·····························03-04 二、详细设计·····························04-11 三、运行测试·····························11-12 四、课设总结·····························13-13 五、附录代码·····························13-19

一、总体介绍 1.1任务概述 我们小组做了两个版本,其中一个为文件操作版,另一个为键盘操作版。两个版本都实现了哈夫曼编码/译码操做。我主要负责的是构造哈夫曼树,给出各个字符的哈夫曼编码,加密操做,整个键盘操作版系统的代码重组、编辑。开发的过程中使用了Codelite、Dev、Vc等软件。参考书籍为《数据结构》(c语言版)。 其中文件操作版的具体实现为: ○1能够实现对26个小写字母外加空格进行哈夫曼编码,并能够对一整篇文章(有小写字母和空格组成)进行加密,生成密码文件。最后根据生成的密码翻译出原文并存档。 ○2在使用程序时,使用者只需要对ToBetran文件进行原文的输入(使用小写字母或空格),加密和解密功能由程序自主来完成。 ○3程序运行的过程中会输出进行编码的26个小写字母和空格(字符型),并输出其对应的权值(整型)。还输出字符的编码及生成的密文。最后输出解密后的原文。 键盘操作版为: ○1要求从键盘输入字符集和字符的权值,大部分字符均可输入,需要各个字符的权值不能相同。 ○2利用输入的权值建立哈夫曼树,得到每个字符的前缀编码。 ○3输入字符串,程序对其进行加密。 ○4输入密文(1010101……………..)对密文进行解密。

哈夫曼编码实验报告

中南大学数据结构课程 姓名:刘阳 班级:信息0703 学号:0903070312 实验时间: 08.11.14 指导老师:赵颖

一、实验内容 根据输入的n 个带权结点,构造出哈夫曼树,并且把构造结果输出到屏幕。 二、实验说明 哈夫曼数,也称最优二叉树,是指对于一组带有确定权值的叶结点,构造的具有最小带权路径长度的二叉树。 设二叉树具有n 个带权值的叶结点,那么从根结点到各个叶结点的路径长度与相应结点权值的乘积之和叫做二叉树的带权路径长度WPL ,记作: WPL=k n k k L W *∑=1。在给定一组具有确定权值的叶结点,可以构造出不同的带权二 叉树。根据哈夫曼树的定义,一棵二叉树要使其WPL 值最小,必须使权值越大的叶结点越靠近根结点,而权值越小的叶结点越远离根结点。 在数据通讯中,经常需要将传送的文字转换成由二进制字符0,1组成的二进制串,我们称之为编码。例如,假设要传送的电文为ABACCDA ,电文中只含有A ,B ,C ,D 四种字符,若这四种字符采用下表所示的编码,则电文的代码为000010000100100111 000,长度为21。 在传送电文时,我们总是希望传送时间尽可能短,这就要求电文代码尽可能短。如果在编码时考虑字符出现的频率,让出现频率高的字符采用尽可能短的编码,出现频率低的字符采用稍长的编码,构造一种不等长编码,则电文的代码就可能更短。并且在建立不等长编码时,必须使任何一个字符的编码都不是另一个字符编码的前缀,以避免反译成原文时,编码出现多义性。 在哈夫曼编码树中,树的带权路径长度的含义是各个字符的码长与其出现次数的乘积之和,也就是电文的代码总长,所以采用哈夫曼树构造的编码是一种能使电文代码总长最短的不等长编码。 采用哈夫曼树进行编码,也不会产生上述二义性问题。因为,在哈夫曼树中,每个字符结点都是叶结点,它们不可能在根结点到其它字符结点的路径上,所以一个字符的哈夫曼编码不可能是另一个字符的哈夫曼编码的前缀,从而保证了译码的非二义性。

数据结构课程设计模——哈夫曼编码译码器

《数据结构》课程设计报告 设计题目 专业 班级 姓名 学号 完成日期

目录 1. 问题描述……………………………………………第 2页 2. 系统设计……………………………………………第 2页 3. 数据结构与算法描述………………………………第 5页 4. 测试结果与分析……………………………………第 6页 5. 总结 (10) 6. 参考文献 (10) 附录程序源代码 (11)

课程设计题目 1. 问题描述 利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。试为这样的信息传输写一个哈夫曼编/译码系统。 2. 系统设计 2.1 设计目标 一个完整的系统应具有以下功能: 1)I:初始化(Initialization)。从终端读入字符集大小n,以及n 个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。输出哈夫曼树,及各字符对应的编码。 2)W:输入(Input)。从终端读入需要编码的字符串s,将字符串s 存入文件Tobetran.txt中。 3)E:编码(Encoding)与译码(Decoding)。 编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。 4)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

哈夫曼编码译码器---课程设计报告

目录 目录 (2) 1课程设计的目的和意义 (3) 2需求分析 (4) 3概要设计 (4) 4详细设计 (8) ¥ 5调试分析和测试结果 (11) 6总结 (12) 7致谢 (13) 8附录 (13) 参考文献 (20) .

| ; 1 课程设计目的与意义 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。 哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。 通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。 作为计算机专业的学生,我们应该很好的掌握这门技术。在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。 ( 在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们

可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。 在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见。同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。 数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。课程设计是一个重要的教学环节。我们在一般情况下都能够重视实验环节,但是容易忽略实验的总结,忽略实验报告的撰写。通过这次实验让我们明白:作为一名大学生必须严格训练分析总结能力、书面表达能力。需要逐步培养书写科学实验报告以及科技论文的能力。只有这样,我们的综合素质才会有好的提高。 2 需求分析 课题:哈夫曼编码译码器 ) 问题描述:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。问题补充:1. 从硬盘的一个文件里读出一段英语文章; 2. 统计这篇文章中的每个字符出现的次数; 3. 以字符出现字数作为权值,构建哈夫曼树,并将哈夫曼树的存储 结构的初态和终态进行输出; 4. 对每个字符进行编码并将所编码写入文件然后对所编码进行破 译。 具体介绍:在本课题中,我们在硬盘中预先建立一个文档,在里面编辑一篇文章。然后运行程序,调用函数读出该文章,显示在界面;再调用函数对该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显示;然后以每个字符出现次数作为权值,调用函数构建哈夫曼树;并调用函数将哈夫曼的存储结构的初态和终态进行输出。然后调用函数对哈夫曼树进行编码,调用函数将编码写入文件;再调用对编码进行译码,再输出至界面。至此,整个工作就完成了 3 概要设计。

霍夫曼树实验报告

实验二二叉树的遍历及霍夫曼编码 班级:计科1101班 学号:0909101605 姓名:杜茂鹏 2013年5月22日

一、实验目的 掌握二叉树的建立及遍历操作,霍夫曼编码基本操作及存储结构表示 二、实验内容 1. 系统要求包含以下功能 1)初始化:从终端读入字符集大小n,以及n个字符和n个权值(或者读入字符集和频度数据文件),建立哈夫曼树,并将哈夫曼树存入到文件HfmTree 中。 2)编码:利用已建好的哈夫曼树(如果不在内存中,则从文件中读入),从文件ToBeTran中读入原文,对原文进行编码,将编码后的结果存入文件CodeFile 中。 3)译码:利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 4)打印:打印输出哈夫曼树,显示ToBeTran, TextFile和CodeFile文件的内容。 三、实验要求 1.在上机前写出全部源程序; 2.能在机器上正确运行程序; 3.用户界面友好。 四、概要设计 1)首先动态分配数组存储霍夫曼树及存储霍夫曼编码表,然后从终端或文件读入霍夫曼树的字符变量及其频度,初始化建立霍夫曼树并将其写入文件HfmTree.txt中。 2)从指定的文件succe.txt中读入原文,利用已经编好的霍夫曼树对其编码,将编码结果写入文件Coding.txt保存。 3)利用已建好的哈夫曼树将文件Coding.txt中的代码进行译码,结果存入文件decoding.txt中。

五、测试数据: 2.原文内容“THIS IS MY PROGRAM” 六、详细设计 实验内容(原理、操作步骤、程序代码) //建立霍夫曼树,对原文进行编码、译码 #include #include #include #include typedef struct tree { char ch; int weight;//权值 int parent,lchild,rchild; }HTNode,*HuffmanTree;//动态分配数组存储霍夫曼树typedef char **HuffmanCode;//动态分配数组存储霍夫曼编码表void Select(HuffmanTree &HT,int* s1,int* s2,int n) { int j; int min1=10000; for(j=1;j<=n;j++) { if(HT[j].parent==0&&min1>HT[j].weight)

哈夫曼树实验报告

哈夫曼树实验报告 Company number:【0089WT-8898YT-W8CCB-BUUT-202108】

计算机科学与技术学院数据结构实验报告 班级 2014级计算机1班学号姓名张建华成绩 实验项目简单哈夫曼编/译码的设计与实现实验日期一、实验目的 本实验的目的是进一步理解哈夫曼树的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。 二、实验问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码,此实验即设计这样的一个简单编/码系统。系统应该具有如下的几个功能: 1、接收原始数据。 从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件中。 2、编码。 利用已建好的哈夫曼树(如不在内存,则从文件中读入),对文件中的正文进行编码,然后将结果存入文件中。 3、译码。 利用已建好的哈夫曼树将文件中的代码进行译码,结果存入文件中。 4、打印编码规则。 即字符与编码的一一对应关系。 5、打印哈夫曼树, 将已在内存中的哈夫曼树以直观的方式显示在终端上。 三、实验步骤 1、实验问题分析 1、构造哈夫曼树时使用静态链表作为哈夫曼树的存储。 在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1,描述结点的数据类型为: Typedef strcut { Int weight;/*结点权值*/ Int parent; Int lchild; Int rchild; }HNodeType; 2、求哈夫曼编码时使用一维结构数组HuffCode作为哈夫曼编码信息的存储。 求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,没回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路

哈夫曼编码译码器实验报告免费

哈夫曼编码译码器实验报告(免费)

————————————————————————————————作者:————————————————————————————————日期:

问题解析与解题方法 问题分析: 设计一个哈夫曼编码、译码系统。对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件;反过来,可将编码文件译码还原为一个文本文件。 (1)从文件中读入任意一篇英文短文(文件为ASCII编码,扩展名为txt); (2)统计并输出不同字符在文章中出现的频率(空格、换行、标点等也按字符处理);(3)根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码; (4)将文本文件利用哈夫曼树进行编码,存储成压缩文件(编码文件后缀名.huf)(5)用哈夫曼编码来存储文件,并和输入文本文件大小进行比较,计算文件压缩率;(6)进行译码,将huf文件译码为ASCII编码的txt文件,与原txt文件进行比较。 根据上述过程可以知道该编码译码器的关键在于字符统计和哈夫曼树的创建以及解码。 哈夫曼树的理论创建过程如下: 一、构成初始集合 对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合 F={T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结 点,它的左右子树均为空。 二、选取左右子树 在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二 叉树的根结点的权值为其左右子树的根结点的权值之和。 三、删除左右子树 从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。 四、重复二和三两步, 重复二和三两步,直到集合F中只有一棵二叉树为止。 因此,有如下分析: 1.我们需要一个功能函数对ASCII码的初始化并需要一个数组来保存它们; 2.定义代表森林的数组,在创建哈夫曼树的过程当中保存被选中的字符,即给定报文 中出现的字符,模拟哈夫曼树选取和删除左右子树的过程; 3.自底而上地创建哈夫曼树,保存根的地址和每个叶节点的地址,即字符的地址,然 后自底而上检索,首尾对换调整为哈夫曼树实现哈弗曼编码; 4.从哈弗曼编码文件当中读入字符,根据当前字符为0或者1的状况访问左子树或者 右孩子,实现解码; 5.使用文件读写操作哈夫曼编码和解码结果的写入; 解题方法: 结构体、数组、类的定义: 1.定义结构体类型的signode 作为哈夫曼树的节点,定义结构体类型的hufnode 作为

哈夫曼树的实验报告1

一、需求分析 1、本演示程序实现Haffman编/译码器的作用,目的是为信息收发站提供一个编/译系统, 从而使信息收发站利用Haffman编码进行通讯,力求达到提高信道利用率,缩短时间,降低成本等目标。系统要实现的两个基本功能就是:①对需要传送的数据预先编码; ②对从接收端接收的数据进行译码; 2、本演示程序需要在终端上读入n个字符(字符型)及其权值(整形),用于建立Huffman 树,存储在文件hfmanTree.txt中;如果用户觉得不够清晰还可以打印以凹入表形式显示的Huffman树; 3、本演示程序根据建好的Huffman树,对文件的文本进行编码,结果存入文件CodeFile 中;然后利用建好的Huffman树将文件CodeFile中的代码进行译码,结果存入文件TextFile中;最后在屏幕上显示代码(每行50个),同时显示对CodeFile中代码翻译后的结果; 4、本演示程序将综合使用C++和C语言; 5、测试数据: (1)教材例6-2中数据:8个字符,概率分别是0.05,0.29,0.07,0.08,0.14,0.23,0.03, 0.11,可将其的权值看为5,29,7,8,14,23,3,11 (2)用下表给出的字符集和频度的实际统计数据建立Haffman树,并实现以下报文的编码和 一、概要设计 1、设定哈夫曼树的抽象数据类型定义 ADT Huffmantree{ 数据对象:D={a i| a i∈Charset,i=1,2,3,……n,n≥0} 数据关系:R1={< a i-1, a i >| a i-1, a i∈D, i=2,3,……n} 基本操作: Initialization(&HT,&HC,w,n,ch) 操作结果:根据n个字符及其它们的权值w[i],建立Huffman树HT,用字符数组ch[i]作为中间存储变量,最后字符编码存到HC中; Encodeing(n) 操作结果:根据建好的Huffman树,对文件进行编码,编码结果存入到文件CodeFile 中 Decodeing(HT,n) 操作结果:根据已经编译好的包含n个字符的Huffman树HT,将文件的代码进行翻译,结果存入文件TextFile中 } ADT Huffmantree

哈夫曼树 实验报告

计算机科学与技术学院数据结构实验报告 班级 2014级计算机1班学号姓名张建华成绩 实验项目简单哈夫曼编/译码的设计与实现实验日期一、实验目的本实验的目的是进一步理解哈夫曼树的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。 二、实验问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码,此实验即设计这样的一个简单编/码系统。系统应该具有如下的几个功能: 1、接收原始数据。 从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件中。 2、编码。 利用已建好的哈夫曼树(如不在内存,则从文件中读入),对文件中的正文进行编码,然后将结果存入文件中。 3、译码。 利用已建好的哈夫曼树将文件中的代码进行译码,结果存入文件中。 4、打印编码规则。 即字符与编码的一一对应关系。 5、打印哈夫曼树,

将已在内存中的哈夫曼树以直观的方式显示在终端上。 三、实验步骤 1、实验问题分析 1、构造哈夫曼树时使用静态链表作为哈夫曼树的存储。 在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1,描述结点的数据类型为:Typedef strcut { Int weight;/*结点权值*/ Int parent; Int lchild; Int rchild; }HNodeType; 2、求哈夫曼编码时使用一维结构数组HuffCode作为哈夫曼编码信息的存储。 求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,没回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码的低位码,后得到的分支代码位所求编码的高位码,所以设计如下数据类型: #define MAXBIT 10

数据结构课程设计哈夫曼编译码器

《数据结构》课程设计 设计题目:哈弗曼编/译码器 专业:网络工程 班级:24070901 学号:2407090133 姓名:王璇

目录 1. 问题描述……………………………………………第 2页 2. 系统设计……………………………………………第 2页 3. 数据结构与算法描述………………………………第 5页 4. 测试结果与分析……………………………………第 6页 5. 总结 (10) 6. 参考文献 (10) 附录程序源代码 (11)

课程设计题目 1. 问题描述 利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。试为这样的信息传输写一个哈夫曼编/译码系统。 2. 系统设计 2.1 设计目标 一个完整的系统应具有以下功能: 1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。输出哈夫曼树,及各字符对应的编码。 2)W:输入(Input)。从终端读入需要编码的字符串s,将字符串s存入文件Tobetran.txt中。 3)E:编码(Encoding)与译码(Decoding)。 编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。 4)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。 5)Q:退出程序。返回WINDOWS界面。 2.2 设计思想 哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树─即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这种方法是由David.A.Huffman发展起来的。例如,在英文中,e 的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z 则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅

数据结构课程设计哈夫曼编码译码器.doc

题目一:哈夫曼编码与译码 一、任务 设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。 要求: 1) 将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中) ; 2) 初始化:键盘输入字符集统计字符权值、自定义26个字符和26个权值、统计文件中一篇英文文章中26个字母,建立哈夫曼树; 3) 编码:利用建好的哈夫曼树生成哈夫曼编码; 4) 输出编码(首先实现屏幕输出,然后实现文件输出); 5)译码(键盘接收编码进行译码、文件读入编码进行译码); 6) 界面优化设计。 二、流程图 主菜单 1.建立字符权值 2.建立并输出 哈夫曼树 3.建立并查看 哈弗曼编码 4.编码与译码0.退出系统 1.从键盘输入字符集统计 2.从文件读入字 符集统计权值 3.自定义字符及 权值 0.返回上级菜单输出哈夫曼树并保存 至文件“哈夫曼树。t xt” 输出哈夫曼编码并保存至文 件“哈夫曼编码。txt 1.编码 2.译码0.返回上级 菜单 1.从键盘输入字 符集进行编码 2.从文件读入字 符集进行编码 1.从键盘输入编 码进行译码 2.从文件读入编 码进行译码 0.返回上级菜单0.返回上级菜单

三、代码分解 //头文件 #include #include #include #include #define N 1000 #define M 2*N-1 #define MAXcode 6000 //函数声明 void count(CHar &ch,HTNode ht[]); void editHCode(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]); //编码函数 void printyima(HTNode ht[],HCode hcd[],int n,char bianma[]); //译码函数void creatHT(HTNode ht[],int n); void CreateHCode (HTNode ht[],HCode hcd[],int n); void DispHCode(HTNode ht[],HCode hcd[],int n); void input_key(CHar &ch); void input_file(CHar &ch); void input_cw(HTNode ht[]); void bianma1(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]); void bianma2(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]); void yima1(HTNode ht[],HCode hcd[],int n,char bianma[]); void yima2(HTNode ht[],HCode hcd[],int n,char bianma[]); void creat_cw(); void bianmacaidan(); void yimacaidan(); void bianmayima(); int caidan(); //结构体 typedef struct {

哈夫曼树实验报告

数据结构实验报告 实验名称:实验三哈夫曼树 学生姓名: 班级: 班内序号: 学号: 日期: 程序分析: 存储结构:二叉树 程序流程: template class BiTree { public: ) 1.初始化链表的头结点

2.获得输入字符串的第一个字符,并将其插入到链表尾部,n=1(n记录的是链 表中字符的个数) 3.从字符串第2个字符开始,逐个取出字符串中的字符 将当前取出的字符与链表中已经存在的字符逐个比较,如果当前取出的 字符与链表中已经存在的某个字符相同,则链表中该字符的权值加1。 如果当前取出的字符与链表中已经存在的字符都不相同,则将其加入到 链表尾部,同时n++ =n(tSize记录链表中字符总数,即哈夫曼树中叶子节点总数) 5.创建哈夫曼树 6.销毁链表 源代码: void HuffmanTree::Init(string Input) { Node *front=new Node; 建哈夫曼树(void HuffmanTree::CreateCodeTable(Node *p)) 算法伪代码: 1.创建一个长度为2*tSize-1的三叉链表 2.将存储字符及其权值的链表中的字符逐个写入三叉链表的前tSize个结点 的data域,并将对应结点的孩子域和双亲域赋为空 3.从三叉链表的第tSize个结点开始,i=tSize 3.1从存储字符及其权值的链表中取出两个权值最小的结点x,y,记录其 下标x,y。 3.2将下标为x和y的哈夫曼树的结点的双亲设置为第i个结点 3.3将下标为x的结点设置为i结点的左孩子,将下标为y的结点设置为 i结点的右孩子,i结点的权值为x结点的权值加上y结点的权值,i 结点的双亲设置为空 4. 根据哈夫曼树创建编码表

哈夫曼编码与译码器_数据结构课程设计报告

沈阳航空航天大学 课程设计报告 课程设计名称:数据结构课程设计 课程设计题目:实现哈夫曼编码和译码器 院(系):计算机学院 专业:计算机科学与技术 班级:24010102 学号:2012040101082 姓名:尹伟和 指导教师:徐蕾

此页为任务书

目录 1.题目分析 (1) 1.1.题目重述 (1) 1.1.1.系统功能需求分析 (1) 2.程序设计 (2) 2.1.系统功能模块说明 (2) 2.1.1.系统功能模块结构 (2) 2.1.2.系统模块功能说明 (3) 2.2.数据结构说明 (3) 2.2.1.结构体定义说明 (3) 2.2.2.哈夫曼树 (4) 2.2.3.字符-哈夫曼编码对照表 (4) 2.3.函数说明 (4) 3.算法描述 (6) 3.1.哈夫曼树的构建 (6) 3.2.字符-哈夫曼编码对照表 (6) 3.3.编码 (6) 3.4.译码 (7) 4.程序测试 (9) 4.1.字符集输入 (9) 4.2.编码测试 (10) 4.3.译码测试 (11) 参考文献 (13) 附录(程序清单) (14)

沈阳航空航天大学课程设计报告 1.题目分析 1.1.题目重述 本次课程设计的目标是实现一个哈夫曼编码和译码器。该哈夫曼编码和译码器需要根据用户输入的字符集及相应字符出现的频率,对字符集所包含的字符进行哈夫曼编码。同时,作为编码器需要其对用户提供的明文字符串进行编码,使明文字符串变为二进制密文;作为译码器需要对用户提供的二进制密文进行译码,使二进制密文变为字符明文。 1.1.1.系统功能需求分析 通过对课程设计的题目分析,可以得出哈夫曼编码和译码器的功能需求,需求如下: 1)读取用户输入的字符集和相应字符出现的频率; 2)根据用户输入构建哈夫曼树; 3)根据哈夫曼树构建字符-哈夫曼编码对照表; 4)根据字符-哈夫曼编码对照表对明文字符串进行编码; 5)根据哈夫曼树对二进制密文进行译码。

哈夫曼编码译码器数据结构C语言

一、需求分析 目前,进行快速远距离通信的主要手段是电报,即将需传送的文字转化成由二级制的字符组成的字符串。例如,假设需传送的电文为“ABACCDA ”,它只有4种字符,只需两个字符的串,便可以分辨。假设A 、B 、C 、D 、的编码分别为00,01,10和11,则上述7个字符的电文便为“00010010101100”,总长14位,对方接受时,可按二位一分进行译码。 当然,在传送电文时,希望总长尽可能地短。如果对每个字符设计长度不等的编码,且让电文中出现次数较多的字符采用尽可能短的编码,则传送电文的总长便可减少。如果设计A 、B 、C 、D 的编码分别为0,00,1,01,则上述7个字符的电文可转换成总长为9的字符串“000011010”。但是,这样的电文无法翻译,例如传送过去的字符串中前4个字符的字串“0000”就可以有很多种译法,或是“AAAA ”或者“BB ”,或者“ABA ”等。因此,若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称作前缀编码。 然而,如何进行前缀编码就是利用哈夫曼树来做,也就有了现在的哈夫曼编码和译码。 二、概要设计 利用哈夫曼树编/译码 (一)、建立哈夫曼树 (二)、对哈夫曼树进行编码 (三)、输出对应字符的编码 (四)、译码过程 主要代码实现: struct code //结构体的定义 { char a; int w; int parent; int lchild; int rchild; }; void creation(code *p,int n,int m); //建立哈夫曼树 void coding(code *p,int n); //编码 void display(code *p,int n,int m); //输出函数 void translate(char **hc,code *p,int n); //译码 三、 详细设计 (一)、建立哈夫曼树 a b c d 1 2 3 4 5 * * * 6 7 a b * c * a b * c * d * 序号: 字符: 权值: 1 2 3 4 3 6 10 a b * 1 2 1 2 3 3 1 2 3 3 6 4 10 3 6 图3-1 图3-2 图3-3

哈夫曼编译码器课程设计报告完整版

XXX学院本科 数据结构课程设计总结报告 设计题目:实验一、哈夫曼编/译码器 学生姓名:XXX 系别:XXX 专业:XXX 班级:XXX 学号:XXX 指导教师:XXX XXX 2012年6 月21日 xxx学院 课程设计任务书 题目一、赫夫曼编译码器 专业、班级xxx 学号xxx 姓名xxx 主要内容、基本要求、主要参考资料等: 1. 主要内容 利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼的编/译码系统。 2. 基本要求 系统应具有以下功能: (1)C:编码(Coding)。对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中

(2)D:解码(Decoding)。利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。 (3)P:打印代码文件(Print)。将文件codefile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件codeprint中。 (4)T:打印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。 3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编着; 数据结构标准教程胡超、闫宝玉编着 完成期限:2012年6月21 日 指导教师签名: 课程负责人签名: 2012年 6月 21 日 一、设计题目(任选其一) 实验一、哈夫曼编/译码器 二、实验目的 1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力; 2 深化对算法课程中基本概念、理论和方法的理解; 3 巩固构造赫夫曼树的算法; 4 设计试验用程序实验赫夫曼树的构造。 三、运行环境(软、硬件环境) Windows xp sp3,Visual C++ 英文版 四、算法设计的思想 (1)初始化赫夫曼树,输入文件中各字符及其权值,并保存于文件中 (2)编码(Coding)。对文件tobetrans中的正文进行编码,然后将结果存入文件codefile 中 (3)D:解码(Decoding)。利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。 (4)P:打印代码文件(Print)。将文件codefile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件codeprint中。

北邮数据结构实验—Huffman编码解码器.docx

北京邮电大学电信工程学院 数据结构 实 验 报 告 实验名称: ____Huffman 编码 /解码器 _____ 学生姓名: __________________ 班级: __________________ 班内序号: __________________ 学号: __________________ 日期: ___________________

- 1.实验要求 利用二叉树结构实现哈夫曼编/ 解码器。 基本要求: 1.初始化 (Init) :能够对输入的任意长度的字符串s 进行统计,统计每个字符的频度,并建 立哈夫曼树 2.建立编码表 (CreateTable):利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。 3.编码 (Encoding) :根据编码表对输入的字符串进行编码,并将编码后的字符串输出。 4.译码 (Decoding) :利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。 5.计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。2. 程序分析 2.1 存储结构 静态三叉链表 Weight Lchild Rchild parent 2.2 程序流程(或程序结构、或类关系图等表明程序构成的内容,一般为流程图等 ) 2.2.1.流程图 开始 输入进行编码的字符串 统计各个字符的频度,并对各叶子节点 的权重赋值 初始化各节点的Lchild , Rchild 和 parent

进行哈弗曼编码 是否最后一个字符 是 输出各字符编码 对字符串进行编码 找到当前字符编码,复制到总编码中是否最后一个字符 是 输出各字符串编码 对哈弗曼码进行译码 输出译码结果是 否 判断 双亲 节点 否 - 该节点是否为根节点 否 若为左孩子若为右孩子 编码前插入0编码前插入1

哈夫曼树及其操作-数据结构实验报告(2)

电子科技大学 实验报告 课程名称:数据结构与算法 学生姓名:陈*浩 学号:************* 点名序号: *** 指导教师:钱** 实验地点:基础实验大楼 实验时间: 2014-2015-2学期 信息与软件工程学院

实验报告(二) 学生姓名:陈**浩学号:*************指导教师:钱** 实验地点:科研教学楼A508实验时间:一、实验室名称:软件实验室 二、实验项目名称:数据结构与算法—树 三、实验学时:4 四、实验原理: 霍夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法。1952年,David A. Huffman在麻省理工攻读博士时所发明的。 在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。 例如,在英文中,e的出现机率最高,而z的出现概率则最低。当利用霍夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个比特。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。 霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。 可以证明霍夫曼树的WPL是最小的。

数据结构实验三哈夫曼树实验报告

题目:哈夫曼编/译码器 一、题目要求: 写一个哈夫曼码的编/译码系统,要求能对要传输的报文进行编码和解码。构造哈夫曼树时,权值小的放左子树,权值大的放右子树,编码时右子树编码为1,左子树编码为0. 二、概要设计: 数据结构: typedef struct { int bit[MAXBIT]; int start; } HCodeType; /* 编码结构体 */ typedef struct { int weight; int parent; int lchild; int rchild; char value; } HNode; /* 结点结构体 */ 函数: void DEMONHuffmanTree (HNode HuffNode[MAXNODE], int n) 作用:构造一个哈夫曼树,并循环构建 int main () 作用:运用已经构建好的哈弗曼树,进行节点的处理,达到成功解码编译 三、详细设计: 哈夫曼树的建立: void DEMONHuffmanTree (HNode HuffNode[MAXNODE], int n) { int i = 0, j, m1, m2, x1, x2; char x; /* 初始化存放哈夫曼树数组 HuffNode[] 中的结点 */ while (i

HuffNode[i].rchild =-1; scanf("%c",&x); scanf("%c",&HuffNode[i].value); //实际值,可根据情况替换为字母 i++; } /* 输入 n 个叶子结点的权值 */ scanf("%c",&x); for(i=0;i

相关文档
最新文档