java哈夫曼编码压缩文件的思想 30
要把一个文件用哈夫曼编码成另一个文件我已经得到了哈夫曼树和表示字符编码的数组String[]codes那解决问题的思路是什么,我只是要思路,不要乱贴代码...
要把一个文件用哈夫曼编码成另一个文件
我已经得到了哈夫曼树和表示字符编码的数组 String[] codes
那解决问题的思路是什么,我只是要思路,不要乱贴代码 展开
我已经得到了哈夫曼树和表示字符编码的数组 String[] codes
那解决问题的思路是什么,我只是要思路,不要乱贴代码 展开
2个回答
展开全部
一.模型表示:
计算机使用数字代码来存储字符,ASC II码是最常用的编码。一个ASC II码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位,共128个。要对一个文本文件进行压缩,就是要对文件内的字符重新编码,使出现次数较多的字符用较短的编码存储,而出现次数少的字符则采用相对较长的编码存储,最终使压缩后整个文件的大小小于原文件。
这里采用哈夫曼编码方式来对每个字符重新编码,因为哈夫曼树具有最小带权路径长度的性质,能够生成用于压缩的二进制前缀码。程序使用的 “静态统计模型”,也就是说在编码前统计要编码的信息中所有字符的出现频率,字符的出现频率即为字符的权,然后根据统计出的信息建立编码树,进行编码。利用所得的编码生成压缩文件。由于采用的是“静态统计模型”,在压缩文件里必须保存统计出的结果以便解码时构造相同的编码树,或者直接保存编码树本身。
在解压缩时,首先从文件头读入保存的编码信息,从而对后续的编码解码,还原成ASCII的形式,生成与原文相同的文件。
二.概要设计:
由于一棵有n个叶子结点的哈夫曼树共有2n-1个结点,考虑到程序的执行效率,可以将二叉树存放在连续空间里(静态链表),空间的每个结点内仍有左子树、右子树、双亲等指针,以便译码和解码。即存储在一个大小为2n-1的一维数组中,每个结点的结构为:
struct HNode
{
char elem; //保存结点所表示的字符(主要用于译码时)
unsigned long weight; //保存结点的权值,对于叶子,即为字符的出现次数
int parent, lchild, rchild; //保存结点的双亲,左右孩子的位置
计算机使用数字代码来存储字符,ASC II码是最常用的编码。一个ASC II码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位,共128个。要对一个文本文件进行压缩,就是要对文件内的字符重新编码,使出现次数较多的字符用较短的编码存储,而出现次数少的字符则采用相对较长的编码存储,最终使压缩后整个文件的大小小于原文件。
这里采用哈夫曼编码方式来对每个字符重新编码,因为哈夫曼树具有最小带权路径长度的性质,能够生成用于压缩的二进制前缀码。程序使用的 “静态统计模型”,也就是说在编码前统计要编码的信息中所有字符的出现频率,字符的出现频率即为字符的权,然后根据统计出的信息建立编码树,进行编码。利用所得的编码生成压缩文件。由于采用的是“静态统计模型”,在压缩文件里必须保存统计出的结果以便解码时构造相同的编码树,或者直接保存编码树本身。
在解压缩时,首先从文件头读入保存的编码信息,从而对后续的编码解码,还原成ASCII的形式,生成与原文相同的文件。
二.概要设计:
由于一棵有n个叶子结点的哈夫曼树共有2n-1个结点,考虑到程序的执行效率,可以将二叉树存放在连续空间里(静态链表),空间的每个结点内仍有左子树、右子树、双亲等指针,以便译码和解码。即存储在一个大小为2n-1的一维数组中,每个结点的结构为:
struct HNode
{
char elem; //保存结点所表示的字符(主要用于译码时)
unsigned long weight; //保存结点的权值,对于叶子,即为字符的出现次数
int parent, lchild, rchild; //保存结点的双亲,左右孩子的位置
2013-11-18
展开全部
将最常出现的内容用较短的字符编码,不常出现的内容用较长的编码;如100个字符A占用100*8bit,编码后用010二进制存储只用100*3bit,既然你已经得到了哈夫曼编码数组,只要将文件内容替换为编码即可;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询