哈夫曼编码与译码附源码.docx

上传人:b****2 文档编号:1911913 上传时间:2022-10-25 格式:DOCX 页数:30 大小:386.92KB
下载 相关 举报
哈夫曼编码与译码附源码.docx_第1页
第1页 / 共30页
哈夫曼编码与译码附源码.docx_第2页
第2页 / 共30页
哈夫曼编码与译码附源码.docx_第3页
第3页 / 共30页
哈夫曼编码与译码附源码.docx_第4页
第4页 / 共30页
哈夫曼编码与译码附源码.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

哈夫曼编码与译码附源码.docx

《哈夫曼编码与译码附源码.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码与译码附源码.docx(30页珍藏版)》请在冰豆网上搜索。

哈夫曼编码与译码附源码.docx

哈夫曼编码与译码附源码

哈夫曼编码与译码(附源码)

建立Huffman树进行编码和译码的设计

郝萌1100300423哈尔滨工业大学计算机科学与技术学院1003104班

摘要:

建立一个简易的系统,对于给定的一篇英文文章,统计字符出

现的概率,并根据概率建立Huffman树,利用Huffman编码

对文章进行编码和译码。

掌握Huffman树的建立与应用,并进

一步熟练掌握程序的设计流程。

关键词:

Huffman树Huffman编码文章译码文件压缩解压缩

1.引言:

给定一篇文章,统计字符出现的概率,根据概率建立哈夫曼树,并进行哈夫曼编码,进而可以利用哈夫曼编码对文章进行编码与译码和文件压缩、解压缩等操作。

2.程序设计流程

(1)文字表述

开始进入功能选择界面,包含五种操作:

1.读取文章并对字符编码,2.哈夫曼编码信息,3.文章编码,4.文章译码,5.文件压缩,6.文件解压缩,7.退出程序。

操作1:

给定一篇文章,统计字符出现的概率,并根据概率建立Huffman树,并利用Huffman树对字符进行Huffman编码。

操作2:

显示Huffman编码信息,包括字符,字符出现的概率,Huffman编码。

操作3:

对文章进行译码,显示译码信息,并保存。

操作4:

对文章进行译码,显示并保存。

操作5:

对文件进行压缩,每7位二进制序列对应一个ASCII码。

操作6:

对文件进行解压缩。

(2)流程图

 

 

2.哈夫曼编码信息

 

3.文件编码

(1)显示文件编码

(2)保存文件编码

4.文件译码

(1)显示文章编码的译码

(2)保存文章编码的译码

5.文件压缩

6.文件解压缩

 

附:

程序源代码

/*

*File:

HUFFMANFUNCTION.h

*Author:

Administrator

*

*Createdon2011年12月19日,下午6:

19

*/

#ifndefHUFFMANFUNCTION_H

#defineHUFFMANFUNCTION_H

#include

#include

#include

#include

#definemax1150

#definemax250

#definemax3256

usingnamespacestd;

classHtnote{

public:

charname;//字符名

doubleweight;//权重

intlchild;//左孩子

intrchild;//右孩子

intparent;//父亲

Htnote(){

weight=0;

lchild=-1;

parent=-1;

rchild=-1;

}

};

className{

public:

intnum;//字符出现的次数

charpname;//字符名

doublelweight;//权值

Name(){

num=0;

lweight=0;

}

};

classGetName{

public:

charnamef[max2];

intn;//字符的种类

intsum;//字符的总数

Nameletter[max1];//存储字符信息的类的数组

GetName(){

sum=0;

n=0;

}

voidGetWeight()//得到字符的权值

{

for(inti=0;i

letter[i].lweight=(double)letter[i].num/sum;//出现的次数除总数得到权值

}

}

intReadLetter(){

ifstreaminput;

cout<<"请输入文件名:

"<

cin>>namef;

input.open(namef);//打开文件

if(input.fail()){

cout<<"该文件不存在!

"<

return0;

}

charch;

ch=input.get();

letter[0].pname=ch;

letter[0].num++;

sum++;

while(!

input.eof()){//读取文件中的所有字符

inttag=0;

ch=input.get();

for(inti=0;i

if(letter[i].pname==ch){

letter[i].num++;

sum++;

tag=1;

}

}

if(tag==0){

n++;

letter[n].pname=ch;

letter[n].num++;

sum++;

}

}

sum--;

input.close();

GetWeight();//得到字符权值

}

};

classCodeNode//编码类

{

public:

charch;//存储字符

charbits[max1];//存储编码

};

classFunction{

public:

GetNameL;

intfn;//定义哈夫曼数组大小

HtnoteHuffmanT[max3];//哈夫曼数组

CodeNodeCode[max1];//字符编码数组

Function(){

fn=0;

}

voidCharHuffmanTCoding()//编码功能实现

{

inti,f,c;

charcd[L.n+1];//暂时存储编码的数组

intstart;//编码读取起始位置

cd[L.n]='\0';

for(i=0;i

Code[i].ch=HuffmanT[i].name;//字符信息

start=L.n;//起始位置

c=i;

while((f=HuffmanT[c].parent)>=0){

if(HuffmanT[f].lchild==c)//如果为左孩子,为‘0’

{

cd[--start]='0';

}else//如果为右孩子,为‘1’

{

cd[--start]='1';

}

c=f;

}

strcpy(Code[i].bits,&cd[start]);//将结果存入对应的编码数组中

}

}

voidOutputHuffmanTCode(){

cout<<"哈夫曼编码:

"<

cout<<"——————————————————————"<

cout<<"字符\t权值\t\t哈夫曼编码"<

for(inti=0;i

{

cout<<"——————————————————————"<

cout<

cout<

cout<

}

cout<<"——————————————————————"<

}

voidInitHT()//哈夫曼初始化

{

L.ReadLetter();

fn=(L.n)*2-1;

for(inti=0;i

if(i

HuffmanT[i].name=L.letter[i].pname;

HuffmanT[i].weight=L.letter[i].lweight;

}

}

}

voidSelectMin(intm,int&p1,int&p2)//选择最小的两个节点

{

inti,j;

doublem1,m2;

m1=m2=1;

p1=p2=-1;

for(i=0;i

if(HuffmanT[i].parent==-1&&HuffmanT[i].weight

{

m2=m1;

p2=p1;

m1=HuffmanT[i].weight;

p1=i;

}elseif(HuffmanT[i].parent==-1&&HuffmanT[i].weight

{

m2=HuffmanT[i].weight;

p2=i;

}

}

}

voidCreatHT()//建立哈夫曼树

{

inti,p1,p2;

InitHT();

for(i=L.n;i

SelectMin(i,p1,p2);

HuffmanT[p1].parent=HuffmanT[p2].parent=i;

HuffmanT[i].lchild=p1;

HuffmanT[i].rchild=p2;

HuffmanT[i].weight=HuffmanT[p1].weight+HuffmanT[p2].weight;

}

}

intOutArticleCode()//显示文章编码

{//文章编码操作

ifstreaminput;

input.open(L.namef);

if(input.fail()){

cout<<"文件不存在!

"<

return0;

}

charch;

cout<<"文章编码如下:

"<

while(!

input.eof()){

ch=input.get();

for(inti=0;i

if(Code[i].ch==ch)

cout<

}

}

cout<

input.close();

}

intSaveArticleCode()//保存文章编码

{

ofstreamoutput;

ifstreaminput;

charnamef1[max2];

input.open(L.namef);

if(input.fail()){

cout<<"该文件不存在!

"<

return0;

}

cout<<"请输入保存文章编码的文件名:

"<

cin>>namef1;

output.open(namef1);

charch;

while(!

input.eof()){

ch=input.get();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1