霍夫曼(Huffman)编码压缩问题现在我想应用霍夫曼编码对文件进行压缩.目的是实现对所有类型的文件进行压缩,以二进制形式读取文件.虽然知道霍夫曼编码的基本原理,但却无从下手.我想对
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/17 19:57:14
![霍夫曼(Huffman)编码压缩问题现在我想应用霍夫曼编码对文件进行压缩.目的是实现对所有类型的文件进行压缩,以二进制形式读取文件.虽然知道霍夫曼编码的基本原理,但却无从下手.我想对](/uploads/image/z/12672617-41-7.jpg?t=%E9%9C%8D%E5%A4%AB%E6%9B%BC%EF%BC%88Huffman%EF%BC%89%E7%BC%96%E7%A0%81%E5%8E%8B%E7%BC%A9%E9%97%AE%E9%A2%98%E7%8E%B0%E5%9C%A8%E6%88%91%E6%83%B3%E5%BA%94%E7%94%A8%E9%9C%8D%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81%E5%AF%B9%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E5%8E%8B%E7%BC%A9.%E7%9B%AE%E7%9A%84%E6%98%AF%E5%AE%9E%E7%8E%B0%E5%AF%B9%E6%89%80%E6%9C%89%E7%B1%BB%E5%9E%8B%E7%9A%84%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E5%8E%8B%E7%BC%A9%2C%E4%BB%A5%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%BD%A2%E5%BC%8F%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6.%E8%99%BD%E7%84%B6%E7%9F%A5%E9%81%93%E9%9C%8D%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86%2C%E4%BD%86%E5%8D%B4%E6%97%A0%E4%BB%8E%E4%B8%8B%E6%89%8B.%E6%88%91%E6%83%B3%E5%AF%B9)
霍夫曼(Huffman)编码压缩问题现在我想应用霍夫曼编码对文件进行压缩.目的是实现对所有类型的文件进行压缩,以二进制形式读取文件.虽然知道霍夫曼编码的基本原理,但却无从下手.我想对
霍夫曼(Huffman)编码压缩问题
现在我想应用霍夫曼编码对文件进行压缩.目的是实现对所有类型的文件进行压缩,以二进制形式读取文件.虽然知道霍夫曼编码的基本原理,但却无从下手.我想对每8位或者每4位进行压缩.请问应该如和建立霍夫曼树呢!或者大家有其他好的想法提供一下.
谁能帮我啊?
霍夫曼(Huffman)编码压缩问题现在我想应用霍夫曼编码对文件进行压缩.目的是实现对所有类型的文件进行压缩,以二进制形式读取文件.虽然知道霍夫曼编码的基本原理,但却无从下手.我想对
霍夫曼算法的实现
(通过对霍夫曼算法的实现,进一步了解霍夫曼算法进行数据压缩的原理及过程)
(用c++语言完成霍夫曼算法的实现)
1.算法的描述
1初始化,根据符号概率的大小按由大到小顺序对符号进行排序.
2把概率最小的两个符号组成一个节点,
3重复步骤2,得到节点P2,P3,P4,形成一棵树,其中p4称为根节点.
4从根节点开始到相应于每个符号的树叶.
5从根节点P4开始顺着树枝到每个叶子分别写出每个符号的代码
2.算法中主要功能函数的设计思想
compress_math函数进行数据的压缩操作
Huffman_c函数用Huffman编码压缩指定的文件,并将结果存为新的文件
Huffman_d函数进行Huffman解码
decompress_math函数进行数据的解压缩操作
3.算法的具体实现过程(代码)
/
int Huffman_c(char * infilename,char * outfilename) //用Huffman编码压缩指定的文件
{
if ((ifile = fopen (infilename,"rb")) != NULL)
{
fseek (ifile,0L,2);
file_size = (unsigned long) ftell (ifile);
fseek (ifile,0L,0);
get_frequency_count ();
build_initial_heap ();
build_code_tree ();
if (!generate_code_table ()) {
printf ("ERROR!Code Value Out of Range.Cannot Compress.\n");
return 0;
}
else
{
if ((ofile = fopen (outfilename,"wb")) != NULL)
{
fwrite (&file_size,sizeof (file_size),1,ofile);
fwrite (code,2,256,ofile);
fwrite (code_length,1,256,ofile);
fseek (ifile,0L,0);
compress_math ();
fclose (ofile);
}
else
{
printf("\nERROR:Couldn't create output file %s\n",outfilename);
return 0;
}
}
fclose (ifile);
}
else
{
printf ("\nERROR:%s -- File not found!\n",infilename);
return 0;
}
return 1;
}
void compress_math () // 进行数据的压缩操作
{
register unsigned int thebyte = 0;
register short loop1;
register unsigned short current_code;
register unsigned long loop;
unsigned short current_length,dvalue;
unsigned long curbyte = 0;
short curbit = 7;
for (loop = 0L; loop < file_size; loop++)
{
dvalue = (unsigned short) getc (ifile);
current_code = code[dvalue];
current_length = (unsigned short) code_length[dvalue];
for (loop1 = current_length-1; loop1 >= 0; --loop1)
{
if ((current_code >> loop1) & 1)
thebyte |= (char) (1 = 0; --bitshift)
{
cindex = (cindex > bitshift) & 1);
if (decomp_tree[cindex]