多语言展示
当前在线:1375今日阅读:61今日分享:18

哈夫曼码的编/译码系统

哈夫曼编译系统是为了实现一个利用哈夫曼算法的编码和译码系统。比如,再利用电报进行通讯时,需要将文字转换成由二进制的字符组成的字符串。但是在传送过程中,总希望长度能够尽可能的短,于是我们想采用长度不等的编码。但是这种编码必须遵循:任何一个字符的编码都不是另一个字符编码的前缀。因此哈夫曼编译系统能够正确的使得对于输入的字符进行编码以及译码,并且是的在译码过程中不会出错,同时能够将编码以及译码的结果正确的存入文件当中。
工具/原料
1

VC++6.0

2

Dev-C++

方法/步骤
1

1.采用类语言定义相关的数据类型哈夫曼码的编/译系统主要采用的数据结构为树和链表和数组。其中链表是一种物理存储单元上非连续、非顺序的存储结构,它既可以表示线性结构,也可以用于表示非线性结构,结点可以动态生成。而树是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:(1)有且仅有一个结点 K0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根。(2)除K0外,K中的每个结点,对于关系N来说有且仅有一个前驱。(3)K中各结点,对关系N来说可以有m个后继(m>=0)

2

2.算法设计 构造哈夫曼树的算法在哈夫曼树中,没有度为1的结点,这类二叉树称为严格二叉树。那么对于一颗含有n个结点的哈弗曼树共有2n-1个结点所以哈夫曼算法可以用一维数组实现。显然每个结点的存储结构都应该有一个域存放权值;构成Huffman树之后,为求编码需从叶子结点出发走一条从叶子到根的路径,而为译码需从根出发走一条从根到叶子的路径。对每个结点而言,既需知双亲的消息,又需知孩子结点的消息。因此,可设定一个静态三叉链表来实现。

3

3.函数的调用关系图

4

4.调试分析(1) 问题1l    问题描述:编码过程中字符串编码总是缺少很多位,甚至不能编码一些字符。l    问题分析:字符串编码总是缺少很多位,说明导致这种情况的可能是节点不够多,致使编码没空间存储。l    解决方法:初始化霍夫曼链表的节点不够,如果假设字符串有n个,那链表节点至少得有2n-1个,比如对4个字符串编码,先在4个字符里选2个权值最小的字符,2个字符权值相加,生成新的一个节点存储,现在还剩3个节点,同理3选2,生成新节点,剩余一个节点最后与上一步生成的节点配对,因此共需要生成3个新节点来存储。

5

5.测试结果(1)打开源文件统计各字符及权值信息并存入data.txt文件中

6

(2)将统计出的权值信息进行哈夫曼编码

7

(3)将编码内容存入CodeFile.txt文件中

8

(3)将CodeFile.txt文件中的内容译码

9

(5)成功译码把原字符信息存入DeCodeFile.txt文件中

推荐信息