哈夫曼编译码的设计与实现实验报告.docVIP

  • 44
  • 0
  • 约5.3千字
  • 约 10页
  • 2018-10-11 发布于重庆
  • 举报

哈夫曼编译码的设计与实现实验报告.doc

哈夫曼编译码的设计与实现实验报告

哈夫曼编/译码的设计与实现实验报告 问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发编写一个哈夫曼码的编/译码系统。 基本要求 (1)接收原始数据:从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmtree.dat中。 (2)编码:利用已建好的哈夫曼树(如不在内存,则从文件hfmtree.dat中读入),对文件中的正文进行编码,然后将结果存入文件codefile.dat中。 (3)译码:利用已建好的哈夫曼树将文件codefile.dat中的代码进行译码,结果存入文件textfile.dat中。 (4)打印编码规则:即字符与编码的一一对应关系。 运行与调试 (1)利用教科书中的数据调试程序。 (2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS-PROGRAM-IS-MY-FAVORITE”。 字符 A B C D E F G H I J K L M 频度 186 64 13 22 32 103 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 实验小结 通过这次实验,让我对于树的应用多了认识,在读取文件时,遇到的一些困难,不过在和同学交流的过程中,解决了这个问题,我觉的自己对于树及文件的应用又有了一些进步。通过这次实验,感觉收获很大。 源程序 // 哈夫曼编译码的设计与实现.cpp : 定义控制台应用程序的入口点。 // #include stdafx.h #includeiostream #includefstream #includestring #define Maxvalue 10000 #define MAXBIT 200 using namespace std; struct node { char letter; string num; }; typedef struct { char letter; int weight; //结点权值 int parent; int lchild; int rchild; }HnodeType; typedef struct { int bit[MAXBIT]; int start; }HcodeType; HnodeType *HaffmanTree(int n) { HnodeType *HuffNode; HuffNode=new HnodeType[2*n-1]; int i,j; int m1,m2,x1,x2; for(i=0;i2*n-1;i++) //数组HuffNode[]初始化 { HuffNode[i].weight=0; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1; } cout请输入每个叶子结点的字母和权值(形如A5):endl; for(i=0;in;i++) cinHuffNode[i].letterHuffNode[i].weight; //输入n个叶子结点的权值 for(i=0;in-1;i++) //构造哈夫曼树 { m1=m2=Maxvalue; x1=x2=0; for(j=0;jn+i;j++) //选取最和次小两个权值 { if(HuffNode[j].parent==-1HuffNode[j].weightm1) { m2=m1; x2=x1; m1=HuffNode[j].weight; x1=j; } else { if(HuffNode[j].parent==-1HuffNode[j].weightm2) { m2=HuffNode[j].weight; x2=j; } } } //将找出的两棵子树合并为一棵子树 HuffNode[x1].parent=n+i; HuffNode[x2].parent=n+i; HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].l

文档评论(0)

1亿VIP精品文档

相关文档