哈夫曼编码译码文档格式.docx

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

哈夫曼编码译码文档格式.docx

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

哈夫曼编码译码文档格式.docx

频数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)//是否比最小值

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

当前位置:首页 > 教学研究 > 教学案例设计

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

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