哈夫曼编码和译码的设计与实现.docx

上传人:b****3 文档编号:24743584 上传时间:2023-06-01 格式:DOCX 页数:15 大小:66.20KB
下载 相关 举报
哈夫曼编码和译码的设计与实现.docx_第1页
第1页 / 共15页
哈夫曼编码和译码的设计与实现.docx_第2页
第2页 / 共15页
哈夫曼编码和译码的设计与实现.docx_第3页
第3页 / 共15页
哈夫曼编码和译码的设计与实现.docx_第4页
第4页 / 共15页
哈夫曼编码和译码的设计与实现.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

哈夫曼编码和译码的设计与实现.docx

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

哈夫曼编码和译码的设计与实现.docx

哈夫曼编码和译码的设计与实现

算法与数据结构课程设计

 

哈夫曼编码和译码的设计与实现

 

1。

问题描述

利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原).对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站设计一个哈夫曼码的编/译码系统。

2.基本要求

a。

编/译码系统应具有以下功能:

(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)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式或广义表)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

b.测试数据

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

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

29,0.07,0.08,0。

14,0。

23,0。

03,0。

11,试设计哈夫曼编码。

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

“THIS PROGRAMISMYFAVORITE”。

字符 空格 A  B  C  D  E   F   G  H  I   J  K  L   M

频度  186  64 13 22 32103 21 15  47 57 1   5  32  20

字符 N    O  P  Q   R   S  T  U  V  W  X  Y  Z

频度  57  63 15 1  48 51 80 23 8  18  1   16 1

3.需求分析

3。

1程序的基本功能

本程序可以对任何大小的字符型文件进行Huffman编码,生成一个编码文件。

并可以在程序运行结束后的任意时间对它解码还原生成字符文件。

即:

先对一条电文进行输入,并实现Huffman编码,然后对Huffman编码生成的代码串进行译码,最后输出电文数字

3。

2输入/输出形式

当进行编码时输入为原字符文件文件名,当程序运行编码完成之后输入编码文件名(默认名为code。

dll)。

当进行译码时输入为编码文件名(默认名为code。

dll),从文件中读取Huffman编码树后输入字符文件的文件名。

3。

3测试数据要求

本程序中测试数据主要为字符型文件.

4.概要设计

1.系统结构图(功能模块图)

哈弗曼树编码译码器

编码

译码

退出

 

2.功能模块说明

(1).编码:

提示要编码的文件文件名→读取文件→以字母出现次数为权值建立哈弗曼树→对文本进行哈弗曼编码并输出编码→提示将编码保存的文件名→保存编码文件;

(2).译码:

提示输入要译码的文件名→利用建立好的哈弗曼树进行译码→将译码输出→提示保存译码文件的文件名→保存译码文件;

(3)。

退出:

退出系统,程序运行结束.

5.详细设计

创建哈弗曼树

开始

初始化哈夫曼链表且有2n-1个节点

i=1

I

p->weight=count[i]

p=p->next

for(i=n;i<2*n-1;i++)

HT1->Parent=HT2->Parent=p

p->LChild=HT1

p->RChild=HT2

p->weight=HT1->weight+HT2->weight

结束

 

编码

开始

将字符存入哈夫曼编码结构体数组的字符单元中

if(q==q->Parent->LChild)

HC[i].code[--HC[i].start]='0'

HC[i].code[--HC[i].start]='1'

p=p->next

I=n时结束

 

译码

开始

Root指向根节点

P!

=root

code[i]=='0'

p=p->LChild

p=p->Rchild

p->LChild==NULL&&p->RChild==NULL

s[k++]=str[j]

p=root

结束

6.调试分析

1.从叶子节点开始向上遍历二叉树,获得哈夫曼编码;ﻫ2。

根据哈夫曼编码遍历哈夫曼树直到叶子节点,获得译码

3。

算法的时间复杂度分析:

程序部分用双循环嵌套结构,时间复杂度为O(n2)。

 4.算法的空间复杂度分析:

算法的空间复杂度为O(n)

5。

程序需要反复调试,并且调试过程比较慢,需要有一个比较正确的调试方法,更需要我们有耐心

7.用户使用说明

1.输入字符的个数n 

2输入n个字符和n个权值

3 选择(1—5)操作可对huffman树进行编码和译码以及huffman树表的打印

4退出系统

8.测试结果

9.附录

#include"stdio。

h"

#include ”stdlib。

h"

#include"string。

h”

#defineMAX100

structHafNode

{

int weight;

intparent;

charch;

intlchild;

intrchild;

}*myHaffTree;

structCoding

charbit[MAX];

 charch;

int weight;

}*myHaffCode;

voidHaffman(int n)/*构造哈弗曼树*/

{

int i,j,x1,x2,s1,s2;

for(i=n+1;i〈=2*n—1;i++)

{

s1=s2=10000;

x1=x2=0;

for (j=1;j<=i—1;j++)

 {

  if(myHaffTree[j]。

parent==0&&myHaffTree[j]。

weight〈s1)

 {

s2=s1;

 x2=x1;

  s1=myHaffTree[j].weight;

  x1=j;

}

  else if(myHaffTree[j].parent==0&&myHaffTree[j].weight〈s2)

 s2=myHaffTree[j].weight;

x2=j;

}

}

 myHaffTree[x1]。

parent=i;

 myHaffTree[x2]。

parent=i;

myHaffTree[i].weight=s1+s2;

myHaffTree[i]。

lchild=x1;

  myHaffTree[i]。

rchild=x2;

 }

voidHaffmanCode(intn)

intstart,c,f,i,j,k;

char*cd;

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

myHaffCode=(structCoding*)malloc((n+1)*sizeof(struct Coding));

cd[n—1]=’\0’;

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

{

start=n-1;

for(c=i,f=myHaffTree[i]。

parent;f!

=0;c=f,f=myHaffTree[f]。

parent)

 if(myHaffTree[f]。

lchild==c)cd[—-start]=’0';

elsecd[——start]='1';

for(j=start,k=0;j<n;j++)

 {

myHaffCode[i]。

bit[k]=cd[j];

 k++;

 myHaffCode[i]。

ch=myHaffTree[i].ch;

  myHaffCode[i]。

weight=myHaffTree[i].weight;

}

free(cd);

}

void print()

{

printf("*******************************************************************************\n”);

printf("**********\n");

printf("***** *****\n");

 printf(”***** welcometo huffman coding andcodeprinting*****\n”);

 printf("**********\n");

printf(”**********\n");

printf(”*****1.init2.coding 3。

codeprinting4。

printthehuffman  5。

exit*****\n”);

printf(”**********\n”);

printf(”*******************************************************************************\n");

}

Init()

inti,n,m;

printf("nowinit\n”);

printf("pleaseinputthenumber ofwords:

\n");

scanf("%d”,&n);

 m=2*n-1;

myHaffTree=(struct HafNode*)malloc(sizeof(struct HafNode)*(m+1));

for(i=1;i〈=n;i++)

 {

 printf(”pleaseinputthewordandtheequal:

\n”);

scanf("%s%d”,&myHaffTree[i].ch,&myHaffTree[i]。

weight);

myHaffTree[i]。

parent=0;

myHaffTree[i].lchild=0;

myHaffTree[i]。

rchild=0;

}

for(i=n+1;i〈=m;i++)

 {

myHaffTree[i]。

ch =’#';

myHaffTree[i].lchild=0;

 myHaffTree[i]。

parent=0;

 myHaffTree[i]。

rchild=0;

myHaffTree[i].weight=0;

Haffman(n);

HaffmanCode(n);

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

 printf("%c%d",myHaffCode[i]。

ch,myHaffCode[i]。

weight);

 printf(”\n");

 }

 printf(”initsuccess!

\n");

 returnn;

voidCaozuo_C(intm)/*对字符进行编码*/

{

int n,i,j;

char string[50],*p;

printf(”pleaseinput thewords:

\n”);

scanf(”%s”,string);

n=strlen(string);

for(i=1,p=string;i<=n;i++,p++)

 {

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

 if(myHaffCode[j]。

ch==*p)

 printf("%s\n”,myHaffCode[j].bit);

}

}

voidCaozuo_D(intn)

{

inti,c;

charcode[1000],*p;

printf("pleaseinputthecoding:

\n”);

scanf(”%s",code);

for(p=code,c=2*n-1;*p!

='\0';p++)

 {

 if(*p=='0')

 {

 c=myHaffTree[c].lchild;

 if(myHaffTree[c]。

lchild==0) 

 {

  printf(”%c",myHaffTree[c].ch);

 c=2*n—1;

 continue;

 }

 }

else if(*p==’1’)

{

 c=myHaffTree[c].rchild;

 if(myHaffTree[c]。

lchild==0)

 printf("%c",myHaffTree[c].ch);

 c=2*n-1;

  continue;

  }

}

 printf("\n”);

  

}

void Caozuo_T(intn)

{

inti;

printf(”wordequalleftchildrightchildprents\n");

for(i=1;i<=2*n-1;i++)

printf(”%c%d %d%d%d\n",myHaffTree[i]。

ch,myHaffTree[i].weight,myHaffTree[i]。

lchild,myHaffTree[i].rchild,myHaffTree[i]。

parent);

main()

{

int n;

charchar1;

print();

n=Init();

while

(1)

{

printf(”A.coding B。

codeprinting  C。

print thehuffman  D.exit\npleaseinputtheprocess:

\n”);

scanf("%s",&char1);

 if(char1==’D’)

  break;

switch(char1)

 {case’A’:

Caozuo_C(n);break;/*执行编码操作*/

case'B':

Caozuo_D(n);break;/* 执行译码操作*/

 case’C’:

Caozuo_T(n);break;/*打印哈弗曼树*/

} 

 }

}

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

当前位置:首页 > PPT模板 > 动态背景

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

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