美文网首页源码与文档分享
基于JAVA实现的Huffman哈夫曼树编码与解码

基于JAVA实现的Huffman哈夫曼树编码与解码

作者: UlricaLee | 来源:发表于2019-08-01 13:23 被阅读1次

    1 概述

    给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

    哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

    1.1 设计目的及意义

    《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的:

    了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力

    提高综合运用所学的理论知识和方法独立分析和解决问题的能力

    训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风

    那么在功能方面,Huffman编码处理的是字符以及字符对应的二进制的编码配对问题,分为编码和解码,目的是压字符对应的二进制数据长度。我们知道字符存贮和传输的时候都是二进制的(计算机只认识0/1),那么就有字符与二进制之间的mapping关系。字符属于字符集(Charset),字符需要通过编码(encode)为二进制进行存贮和传输,显示的时候需要解码(decode)回字符,字符集与编码方法是一对多关系(Unicode可以用UTF-8,UTF-16等编码)。理解了字符集,编码以及解码,满天飞的乱码问题也就游刃而解了。

    以英文字母小写a为例,ASCII编码中,十进制为97,二进制为01100001。ASCII的每一个字符都用8个Bit(1Byte)编码,假如有1000个字符要传输,那么就要传输8000个Bit。问题来了,英文中字母e的使用频率为12.702%,而z为0.074%,前者是后者的100多倍,但是确使用相同位数的二进制。可以做得更好,方法就是可变长度编码,指导原则就是频率高的用较短的位数编码,频率低的用较长位数编码。Huffman编码算法就是处理这样的问题。

    1.2 功能及要求

    1.2.1 功能方面

    我们首先根据要编码的文件中字符出现的频率生成对应的哈夫曼编码;然后得到采用哈夫曼编码后的目标文件,并保存;接下来根据要解码的文件对应的哈夫曼码表对文件进行解码;最终得到解码后的目标文件并保存。

    1.2.2 设计要求

    符合课题要求,实现相应功能

    要求界面友好美观,操作方便易行

    注意程序的实用性、安全性。

    2 需求分析及总体设计

    我们的需求是运用哈夫曼编码的相关知识对任意文本文件进行编码、解码。

    编解码:

    首先获取文本文件

    然后通过构建哈夫曼树得到一个字符-编码一一对应的HashMap,并保存至二进制文件

    最后按照该HashMap对读取的文件进行编码和解码,并分别进行保存

    界面使用Java的Swing和javafx来进行构架

    与本地内存交互是将解码的结果与Map压缩为.dat文件进行保存

    2.1 数据结构的设计

    2.1.1 哈夫曼树

    首先将所有字符看成是一个森林(每棵树仅有一个结点)。然后在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和。再从森林中删除选取的两棵树,并将新树加入森林。重复②、③步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

    2.1.2 哈夫曼编码算法

    首先获取文本文件中每个字符出现的次数。然后按照次数将字符对象进行排序。再进行哈夫曼树的构建。然后左0右1从root开始编码。最终得到字符-编码一一对应的一个数据集合。

    2.1.3 HashMap

    首先HashMap采用链式存储结果。然后每个链节点包含两个对象:Character(用

    来存字符),Sring(用来存对应的编码)。

    2.1.4 UI界面设计

    首先我们采用JavaSwing进行UI界面搭建。

    点击下载源码

    相关文章

      网友评论

        本文标题:基于JAVA实现的Huffman哈夫曼树编码与解码

        本文链接:https://www.haomeiwen.com/subject/toyqdctx.html