哈夫曼编码译码文档格式.docx
- 文档编号:15244975
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:16
- 大小:21.04KB
哈夫曼编码译码文档格式.docx
《哈夫曼编码译码文档格式.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码译码文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
频数1866413223210321154757153220
字符NOPQRSTUVWXYZ
频数5763151485180238181161
二、实验目的
树型结构是一种应用极为广泛的非线性数据结构,也是本课程的重点内容,哈夫曼树(最
优二叉树)是树型结构的典型应用,本次实验突出了数据结构加操作的程序设计观点,希望能根据树型结构的非线性特点,熟悉各种存储结构的特性,达到如何应用树型结构的非线性特点,熟悉各种存储结构的特性,达到如何应用树型结构解决具体问题的目的.
三、实验文档:
哈夫曼编码/译码
一、需求分析
1、利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时
间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
本次设计就是为这样的信息收发站写的一个哈夫曼的编/译码器。
本实验要求:
2、本演示程序中,用户可以输入键盘中的任意字符,长度为任意长,字符输入顺序不限,且允许出现重码
3、演示程序以用户与计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,相应的输入数据(可虑去输入中的非法字符)和运算结果显示在其后。
4、本演示程序中,当用户选择的功能错误时,系统会输出相应的提示。
5、在本系统中,用户可以对任意长的字符串可进行编码/译码。
6、程序执行的命令包括:
1)初始化(I)2)编码(E)3)译码(D)
4)印代码文件(P)5)印哈夫曼树(T)6)退出(Q)
、测试数据:
(,)利用教科书例6-2中的数据调试程序。
(,)用下表给出的字符集和频度的计数据建立哈曼树,并实现以下报文的
编码和译码:
二、概要设计
为实现上述程序功能,应以指针存储结点。
为此,需要定义一个抽象数据类型。
1.抽象数据类型定义为:
ADTHuffmanTree{
数据对象:
D={ai|ai?
CharSet,i=1,2,„„,n,n?
0}
数据关系:
R={<
ai-1,ai>
ai-1,ai?
D,ai-1<
ai,i=2,3,„„,n}
基本操作P:
HuffmanTree();
构造函数
~HuffmanTree();
析构函数
Initialization(intWeightNum);
操作结果:
构造哈夫曼树。
Encoder()
初始条件:
哈夫曼树已存在或者哈夫曼树已存到文件中。
对字符串进行编码
Decoder();
哈夫曼树已存在且已编码。
对二进制串进行译码
Print()
编码文件已存在。
操作结果:
把已保存好的编码文件显示在屏幕
TreePrinting()
哈夫曼树已存在。
将已在内存中的哈夫曼树以直观的方式显示在终端上
2.本程序包含三个模块:
1)主程序模块:
voidmain(){
初始化;
do{
接受命令;
处理命令;
}while(“命令”=”退出”)
}
2)、建树模块——实现定义的抽象数据类型
3)、编/译码模块——实现字符串的编/译码各模块之间的调用关系如下:
主程序模块
建树模块
编/译码模块
三、详细设计
程序代码如下
//程序名:
HuffmanTree.h
//程序功能:
哈夫曼树类的头文件(并用其来实现编/译码)
//作者:
刘伟高
//日期:
2006.11.27
//版本:
1.0
//对应类实现文件:
HuffmanTree.cpp
//对应主程序文件:
main.cpp
#include<
iostream>
fstream>
string>
usingnamespacestd;
structHuffmanNode//定义哈夫曼树各结点
{
intweight;
//存放结点的权值,假设只考虑处理权值为整数的情况
intparent;
//记录结点父亲位置,-1表示为根结点,否则表示为非根结点
intlchild,rchild;
//分别存放该结点的左、右孩子的所在单元的编号
};
classHuffmanTree//建立哈夫曼树类
private:
HuffmanNode*Node;
//哈夫曼树中结点的存储结构
char*Info;
//用来保存各字符信息
intLeafNum;
//树中的叶子结点总数
public:
//构造函数
~HuffmanTree();
//析构函数
voidInitialization(intWeightNum);
//初始化函数:
根据WeightNum个权值建立一棵哈夫曼树
voidEncoder();
//编码函数:
利用构造好的哈夫曼树对字符进行编码
voidDecoder();
//译码函数:
voidPrint();
//印文件函数:
voidTreePrinting();
//印哈夫曼树函数:
HuffmanTree.cpp
实现哈夫曼树类的源文件(并用其来实现编/译码)
刘伟高//日期:
#include"
HuffmanTree.h"
//////////////////////////////////////////////////
////////////////////////////
//构造函数
//函数功能:
将结点指针初始化为NULL
//函数参数:
无
//参数返回值:
HuffmanTree:
:
HuffmanTree()
Node=NULL;
//将树结点初始化为空
Info=NULL;
//将字符数组初始化为空
LeafNum=0;
//将叶子数初始化为0
//析构函数
将所有结点的空间释放
~HuffmanTree()
delete[]Node;
//释放结点空间
delete[]Info;
//释放字符存储空间
//初始化函数
从终端读入字符集大小n,以及n个字符和n个权值,
//建立哈夫曼树,并将它存放在文件hfmTree中.
intWeightNum表示代码个数
voidHuffmanTree:
Initialization(intWeightNum)//初始化
inti,j,pos1,pos2,max1,max2;
//
Node=newHuffmanNode[2*WeightNum-1];
//WeightNum权值对应的哈夫曼树中的结点总数为2*WeightNum-1个
Info=newchar[2*WeightNum-1];
for(i=0;
i<
WeightNum;
i++)
cout<
<
"
请输入第"
i+1<
个字符值"
;
getchar();
//丢弃字符'
\t'
与'
\n'
Info[i]=getchar();
//输入一个字符,主要是考虑输入空格而采用这种形式的
请输入该字符的权值或频度"
cin>
>
Node[i].weight;
//输入权值
Node[i].parent=-1;
//为根结点
Node[i].lchild=-1;
//无左孩子
Node[i].rchild=-1;
//无右孩子
for(i=WeightNum;
2*WeightNum-1;
i++)//表示需做WeightNum-1次合并
pos1=-1;
pos2=-1;
//分别用来存放当前最小值和次小值的所在单元编号
max1=32767;
//32767为整型数的最大值
max2=32767;
//分别用来存放当前找到的最小值和次小值
for(j=0;
j<
i;
j++)//在跟节点中选出权值最小的两个
if(Node[j].parent==-1)//是否为根结点
if(Node[j].weight<
max1)//是否比最小值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼 编码 译码