软件课程设计Huffman编码Word文件下载.docx
- 文档编号:19258019
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:19
- 大小:50.64KB
软件课程设计Huffman编码Word文件下载.docx
《软件课程设计Huffman编码Word文件下载.docx》由会员分享,可在线阅读,更多相关《软件课程设计Huffman编码Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
A:
调用静态链接库生成的EXE执行文件。
B:
调用动态链接库生成的EXE执行文件。
C:
直接调用函数生成的EXE执行文件。
5:
假设简单马尔可夫信源A={a,b,c},某符号输出与它之前的1个字母相关,信源输出序列为:
a,b,b,c,c,b,a,a,b,b,b,c,c,c,c,a,b,a,b,a,b,c,a,b,a,b
总计26个字符,因为总计只有3个字母,所以未压缩时,每个字母由2bit组成,回答下列问题:
(1)未压缩时,求序列总计的编码长度。
(2)采用通常的Huffman编码(也叫0次序Huffman编码)压缩后,求序列总计的编码长度。
(3)若考虑某符号输出与它之前的1个字母相关,这在日常中是经常见到的,例如英语字母q之后出现字母u的概率接近于1,而其它字母出现的概率近似于0。
若采用这种Huffman编码(也叫1次序Huffman编码)压缩后,求序列总计的编码长度。
(提示:
此时是否只有一棵Huffman树?
)
(4)以上3种编码长度是否相同,为什么?
仪器
设备
计算机一台,安装WindowsXP操作系统、MicrosoftVisualC++6.0、MSDNLibrary。
参考
文献
[1]侯俊杰.深入浅出MFC(第二版)[M].武汉:
华中科技大学出版社,2001.
[2]谭浩强.C程序设计(第二版)[M].北京:
清华大学出版社,1999..
[3]孟彩霞.计算机软件基础[M].陕西:
西安电子科技大学出版社,2003.
[4]严蔚敏,吴伟民.数据结构[M].北京:
清华大学出版社,2005.
课程设计进度计划(起止时间、工作内容)
选做Huffman数据压缩题目的同学,2人1组,1人做编码,1人做解码,整个课程设计共20学时,具体进度如下:
4学时了解课题背景,选题,学习DLL,学习文件读写。
4学时读文件、初始化Huffman树,计算权重。
4学时构建Huffman树。
4学时根据Huffman树,生成代码。
4学时调试程序,答辩。
课程设计开始日期
2012-9-17
课程设计完成日期
2012-10-15
课程设计实验室名称
计算中心机房
地点
健翔桥校区
摘要
Huffman编码
霍夫曼编码是可变字长编码的一种。
它是由Huffman于1952年提出的一种编码方法,该方法完全依据字符出现概率来构造异字头平均长度最短的码字,称之为最佳编码。
在数据通信中,需要将传送的文字转换成二进制的字符,用0、1码的不同排列来表示字符。
如果采用等长编码,编码的长度取决于报文中不同字符的个数。
如果报文中可能出现26个不同字符,则固定编码长度为5。
然而,传送报文时总是希望总长度尽可能短。
在实际应用中,各个字符的出现频度或使用次数是不同的,如果让使用平频率高的用短码,使用频率低的用长码,就可以优化整个报文编码。
关键字:
Huffman编码最优二叉树数据压缩动态链接库
目录
1、Huffman算法----------------------------------------------------------------------------5
2、Huffman编码流程----------------------------------------------------------------------5
3、build_tree函数流程图--------------------------------------------------------------------6
4、问题解答-----------------------------------------------------------------------------------7
5、参考文献-----------------------------------------------------------------------------------8
6、源代码--------------------------------------------------------------------------------------9
一、Huffman算法
Huffman算法关键是建立Huffman树。
建立Huffman树的过程很简单,各个符号作为由二叉树连接的一串叶结点展开,每个结点有一个权,它只是符号出现的频率或概率。
然后按下列步骤建立Huffman树:
(1)、确定权最低的两个自由结点。
(2)、建立这两个结点的父结点,赋给它的权等于这两个结点的权之和。
(3)、父节点被增加到自由结点的序列中,而两个子结点则从序列中去掉。
(4)、每对组合中将权值较小的边(左子树)制定为0,权值较大的边(右子树)为1。
(理论上可以任意指定,但为了易于编程,需要指定二叉树中左子树为0,右子树为1,或者相反)。
(5)、重复前面的步骤,直到只剩下一个自由结点,这个自由结点作为树的根。
Huffman树建立完毕后,将从根节点出发到叶子结点的路径上各左、右分支的编码顺序排列,最后得到该叶子结点所对应的字符二进制唯一可译编码,该编码成为Huffman编码(霍夫曼编码)。
二、Huffman编码流程
(1)、typedefstructtree_node
{
…
}NODE;
定义二叉树数据类型
(2)、typedefstructcodetype
}CODE;
定义字符编码数据类型
(3)、FILE*read_file_chou(char*p);
打开带压缩文件,返回指向文件的指针
(4)、FILE*write_file_chou(char*p);
创建以压缩目标文件,返回指向文件的指针
(5)、voidInitHuffman_chou(NODEnodes[],intn);
初始化二叉树结点,把每个结点的flag成员置0,parent成员置0,weight成员置0,Lchild成员置-1,Rchild置-1,总计有2×
n-1个结点
(6)、voidcount_bytes_chou(FILE*input,NODEnodes[]);
统计文件中每个字符出现的次数(对应于叶子结点权重),等价于求出信源的概率分布,对于结束符,则假设其出现的次数为1。
(7)、voidscale_counts_chou(NODEnodes[]);
对叶子结点权重进行同比例缩小,使缩小后的权值≤255。
(8)、voidoutput_counts_chou(FILE*output,NODEnodes[]);
把权重写入已压缩文件中,每个权重占用1个字节。
(9)、voidfind_min2_chou(NODEnodes[],int&
min1,int&
min2)
查找树中权值最小的两个结点,该函数在build_tree_chou函数中调用。
(10)、intbuild_tree_chou(NODEnodes[]);
对nodes数组赋值,构建Huffman树,并返回Huffman树的根节点位置。
(11)、voidconvert_tree_to_code_chou(CODEcodes[],NODEnodes[]);
(此函数源自互联网)
对codes数组赋值,完成Huffman编码。
(12)、voidprintf_model_chou(NODEnodes[],CODEcodes[]);
依次输出nodes数组0,1,…,256个叶子结点中weight≠0的叶子结点编码,即输出符号编码。
(13)、voidcompress_data_chou(FILE*input,FILE*output,CODEcodes[]);
按字节依次读入待压缩文件字符,并参照codes数组中的编码值,把每个字符的编码写入输出文件中。
(14)、voidoutput_counts_chou(FILE*output,CODEcodes,int*pbyte_length);
把codes表示的编码写入output所指向的输出文件中,该函数在compress_data_chou函数中调用。
(15)、voidprint_ratios_chou(FILE*input,FILE*output);
利用fseek和ftell函数求出待压缩文件和输出文件的文件大小。
然后求出压缩比。
最后使用fclose函数关闭待压缩和输出文件。
三、build_tree函数流程图
四、问题解答
(1)、传奇王菲
(2)、对于给定的待压缩文件,Huffman编码不唯一。
因为我们在编码时可以将权值较大的作为左子树,也可以将权值较小的作为左子树;
并且左子树的编码可为0、亦可为1。
这些都是在编码时人为规定的,所以Huffman编码不唯一。
(3)、Huffman编码能进行无限次数压缩,但压缩次数越多,压缩比就越小,甚至小于1。
因为压缩时,是以ASCII码(8位二进制)输出到压缩文件的,这些字符可以重新进行Huffman编码。
(4)、A:
调用静态链接库生成的EXE执行文件大小为:
31.5KB
B:
调用动态链接库生成的EXE执行文件大小为:
31.0KB
C:
直接调用函数生成的EXE执行文件大小为:
(5)、未压缩时,序列总计编码长度是:
52bit
(6)、采用通常的Huffman编码压缩后,序列总计的编码长度是:
41bit
(7)、若采用1次序Huffman编码压缩后,求序列总计的编码长度是:
(8)、这三种编码的长度是不相同的。
因为第一种是等长编码,每个符号的编码长度相同,需要的编码的字符数越多,编码就越长。
Huffman编码是不等长编码,它会按照字符出现的频率对编码长度进行优化,使编码长度最短。
参考文献
[1]孟彩霞.计算机软件基础[M].陕西:
[2]严蔚敏.数据结构(C语言版)[M].北京:
清华大学出版社,2007.
[3]任哲.MFCWindows应用程序设计[M].北京:
六、源代码
/*
MicrosoftVisualStudioExpress2012forWindowsDesktop
CompilerVersion6.2.9200.16384
*/
#include<
stdio.h>
stdlib.h>
math.h>
string.h>
#defineMax_code_length256//共257个字符,可能的最长代码二进制位数为256个,假设第257个字符为结束符
#defineMax_number257//加上结束符,共257个字符
typedefstructtree_node
doubleweight;
//权重
intflag;
//标识是否为待构建结点,是的话用0表示,否则用1表示
intparent;
//父节点
intLchild;
//左节点
intRchild;
//右节点
typedefstructcodetype
intcode[Max_code_length];
//共257个字符,可能的最长代码二进制位数为256个,假设第257个字符为结束符
intcode_length;
若A(对应ASCII码是65)对应的编码为110
则:
codes[65].code[0]=1;
codes[65].code[1]=1;
codes[65].code[2]=0;
codes[65].code_length=3;
FILE*read_file_chou(char*p);
FILE*write_file_chou(char*p);
voidInitHuffman_chou(NODEnodes[],intn);
voidcount_bytes_chou(FILE*input,NODEnodes[]);
voidscale_counts_chou(NODEnodes[]);
voidoutput_counts_chou(FILE*output,NODEnodes[]);
intbuild_tree_chou(NODEnodes[]);
voidconvert_tree_to_code_chou(CODEcodes[],NODEnodes[]);
voidprintf_model_chou(NODEnodes[],CODEcodes[]);
voidcompress_data_chou(FILE*input,FILE*output,CODEcodes[]);
voidoutput_counts_chou(FILE*output,CODEcodes,int*pbyte_length);
voidprint_ratios_chou(FILE*input,FILE*output);
intmain(intargc,char*argv[])
FILE*input=read_file_chou(argv[1]);
FILE*output=write_file_chou(argv[2]);
CODEcodes[Max_number];
//共257个字符,假设存在一个结束符,其ascii码为257
NODEnodes[2*Max_number-1];
//共257个字符,所以存在2*257-1=513个结点
printf("
\nCompressing%sto%s\n"
argv[1],argv[2]);
input=read_file_chou(argv[1]);
//打开原始文件,读文件
output=write_file_chou(argv[2]);
//创建一个新文件,准备写入
InitHuffman_chou(nodes,Max_number);
//初始化dLL和exe两者都行
count_bytes_chou(input,nodes);
//计算每个ascii码出现的次数,即求权重
scale_counts_chou(nodes);
//dLL和exe两者都行,对权重进行伸缩,使最大权重max'
不超过255,当然也可不进行伸缩,若不伸缩,则存储空间加大,而output_counts中的字符也要换成fwrite
output_counts_chou(output,nodes);
//把每个字符的权值输出到输出文件中
build_tree_chou(nodes);
//dLL和exe两者都行,构建huffman树build_tree(nodes);
返回根结点的位置,但压缩时无需返回根结点,还原程序需要返回值
convert_tree_to_code_chou(codes,nodes);
//dLL和exe两者都行,把huffman树转化成二进制代码,即编码,左孩子(最小)编码为0,右孩子(次小)编码为1
if(argc>
3&
&
strcmp(argv[3],"
-d"
)==0)//argc>
3必须要有,否则出错,没有第3个参数,就不能进行strcmp操作
printf_model_chou(nodes,codes);
//dLL和exe两者都行,可选函数,该函数不是必须的,若有第3个参数"
,则打印输出编码模型
compress_data_chou(input,output,codes);
//准备压缩文件,里面调用OutputBits函数
print_ratios_chou(input,output);
//可选函数打印压缩比,注意文件指针要定位到末尾,并关闭文件
compressionfinish\n"
);
/*charch;
while((ch=getc(input))!
=EOF)
putchar(ch);
*/
return0;
}
FILE*read_file_chou(char*filename)
FILE*fp=fopen(filename,"
rb"
//以读写方式打开文件,允许读数据
if(fp==NULL)
{
printf("
打开失败,请检查文件是否存在!
\n"
exit(0);
}
else
returnfp;
FILE*write_file_chou(char*filename)
wb"
//以只写方式打开或新建一个文件,允许写数据
新建文件失败!
voidInitHuffman_chou(NODEnodes[],intn)
inti;
for(i=0;
i<
2*n-1;
i++)
nodes[i].flag=0;
nodes[i].parent=0;
nodes[i].weight=0;
nodes[i].Lchild=-1;
nodes[i].Rchild=-1;
voidcount_bytes_chou(FILE*filename,NODEnodes[])
nodes[256].weight=1;
//结束符的权值为1
Max_number-1;
intch;
intj=0;
while((ch=fgetc(filename))!
=EOF)//如果没有遇到文件结束符,一直读取,每次读取一个字符
{
if(i==ch)
{
j++;
}
}
nodes[i].weight=j;
//将指针返回到文件头
fseek(filename,0,SEEK_SET);
//第二个参数表示“偏移量”,"
SEEK_SET"
表示从文件头开始偏移
/*for(i=0;
Max_number;
if(nodes[i].weight!
=0)
%c\t"
i);
%f\n"
nodes[i].weight);
}*/
voidscale_counts_chou(NODEnodes[])
doubleMax_weight=0;
inti=0;
if(Max_weight<
nodes[i].weight)
Max_weight=nodes[i].weight;
//printf("
max_weight-->
%f\n"
Max_weight);
doubleG=floor(Max_weight/256)+1;
G-->
G);
if(nodes[i].weight!
nodes[i].weight=int(nodes[i].weight/G);
//可用floor()函数代替强制类型转换
if(nodes[i].weight==0)
nodes[i].weight=1;
//当权值为0时,设权值为1
//printf("
%c,weight-->
i,nodes[i].weight);
voidoutput_counts_chou(FILE*filename,NODEnodes[])
intt=nodes[i].weight;
fputc(t,filename);
voidfind_min2_chou(NODEnodes[],int&
min2)//查找树中权值最小的两个结点
inti=0,j=0;
inttmp=min2;
intt=1;
2*Max_number-1;
if(nodes[i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件课程设计 Huffman编码 软件 课程设计 Huffman 编码
![提示](https://static.bdocx.com/images/bang_tan.gif)