java 哈夫曼压缩算法的分析与实现[源码][附图]

一、需求分析:
在日常的工作生活中,出于文件存储、传输的要求,需要对文件进行压缩。Huffman压缩是基于哈夫曼树而进行压缩的一种无损压缩算法。
Huffman算法是一种基于统计的压缩方法。它的本质就是对文本文件中的字符进行重新编码,对于使用频率越高的字符,其编码也越短。
二、概要设计:
要设计一套压缩软件,最核心的部分即是算法,具体在于建树与生成编码的过程。
同时,还需要制定一套合理,完善的存储规则。
自然,软件必须分为两部分:压缩部分与解压缩部分。
于是软件整体框架即设计为:

[img]http://dl.iteye.com/upload/attachment/325689/6cdd31d7-8228-3378-8bdc-a45256ee022c.png[/img]


三、详细设计:
1、建哈夫曼树
针对哈夫曼建树的算法,本程序使用了有序链表的数据结构来存储各个哈夫曼节点,并通过二叉树的数据结构来完成建树的过程。 通过中序遍历来完成对编码的读取。
其中,哈夫曼节点的数据结构为:
名称、哈夫曼编码长度、哈夫曼编码(String)
2、文件存储的规则
(1)四个字节:
文件的验证属性码:h m r q 。
(2)一个字节
原文件名的长度n
(3)n个字节
文件名(仅考虑文件名为英文名的情况)
(4)256个字节
0-255这256个数对应的哈夫曼编码的长度
(5)n个字节
存诸256个数据的哈夫曼编码
(6)n个字节
文件数据对应的哈夫曼编码
(7)最后一个字节
前一字节有多少个位是无效的。
四、程序结构
1、程序结构说明:
本程序采用模块化设计方法,各个功能的实现都有具体的方法,在主函数调用相应的方法即可实现程序的要求。程序的整体性很强。
2、重要数据说明:
哈夫曼结点:
public class HuffmanNode {
public int data;//用来存放数据
public int times;//用来存放该数据出现次数
public HuffmanNode lChild;//左孩子
public HuffmanNode rChild;//右孩子
}
链表结点:
public class UserLineNode {
public E data;//存放数据
public UserLineNode next;//存放下一个结点
}

3、函数清单:
建哈夫曼树部分:
/*
*util the frist node
*/
public void uNode()
/*
* 按大小顺序插入
*/
public void shuxuIn()
/*
* 定义一个遍历及生成哈夫曼编码的方法
*/
public void traverSal()
压缩部分:
//定义一个方法,读取数据并记录各个字节数出现频次
public void readFile()
//定义一个方法,将压缩的编码写入
public void writeFile(String fileName)
//将一个八位的字符串转成一个整数
public int changeString(String s)
解压缩部分:
/*
* 定义一个将int 转为8位的String 的方法
*/
public String changeint(int n)
/*
* 定义一个找点合适分开点n 的方法
*/
public int search(String s)
/**
* 定义一个译码的方法
*/
public void Decode()
五、调试分析:
1、程序截图:
[img]http://dl.iteye.com/upload/attachment/325683/4d9f8a18-8fd0-356f-9e6c-75264bde7edd.png[/img]

[img]http://dl.iteye.com/upload/attachment/325685/9fa68cdf-eec1-3f34-96b2-45efefc6b7b5.png[/img]


[img]http://dl.iteye.com/upload/attachment/325687/8afed394-7eba-3b29-a4e6-ed4d0ec47aa0.png[/img]



2、程序调试
在建立一个进度条的过程中发现由于压缩(或解压缩)在运行中占用了构建进度条的资源,导致进度条不能正常显示,使用线程后问题得到解决。
遇到解压缩后文件少写一个字节的问题,对压缩部分中重新检查排错后问题得到解决。

六、总结:
1、程序设计难点:
本程序的难点在于建哈夫曼树及生成文件规则的制定。
2、程序设计中的不足:
本程序功能上实现了哈夫曼压缩,但是在物理、及时间复杂性上还有待优化。
3、训练体会:
这次训练使我加深了对软件设计的理解。
设计一个软件必须首先有一个总体的十分明确的构架,构架设计好后再根据构架一步步完成设计这样设计效率会很高也会避免许多错误出现。

你可能感兴趣的:(算法,Java,数据结构,生活,框架)