1、外,短语式压缩后的结果:那些剩下的未被匹配的单、双字节和得到匹配的距离、长度值仍然具有取值分布不均匀性,因此,两种压缩方式的顺序不能变。本程序设计只做了编码式压缩,采用Huffman编码进行压缩和解压缩。编码是一种可变长编码方式,是二叉树的一种特殊转化形式。编码的原理是:将使用次数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。根据 ascii 码文件中各 ascii 字符出现的频率情况创建Huffman 树,再将各字符对应的哈夫曼编码写入文件中。同时,亦可根据对应的哈夫曼树,将哈夫曼编码文件解压成字符文件.二、概要设计:主程序流程图:主函数统计字符,
2、得退出测试输入测试字符串统计字符信息,建立Huffman曼树根据Huffman树,求得对应字符的Huffman编码输入Huffman编码,求得解码出统计出的字符的权值n根据权值进行建立Huffman树输出Huffman树编码输出编码压缩编码生成压缩文件扫描压缩文件,载入字符信息解码解压生成新的文本文档压缩过程的实现:压缩过程的流程是清晰而简单的:1. 创建2. 打开需压缩文件3. 将需压缩文件中的每个ascii码对应的huffman编码按bit单位输出生成压缩文件压缩结束。其中,步骤1和步骤3是压缩过程的关键。 步骤1:这里所要做工作是得到数中各叶子结点字符出现的频率并进行创建.统计字符出现的
3、频率可以有很多方法:如每次创建前扫描被创建的文件,“实时”的生成各字符的出现频率;或者是创建前即做好统计.这里采用的是前一种方法。3:将需压缩文件中的每个单位输出.这是本压缩程序中最关键的部分:这里涉及“转换”和“输出”两个关键步骤: “转换”部分大可不必去通过遍历树来找到每个字符对应的哈夫曼编码,可以将每个码值及其对应的码存放于如下所示的结构体中:解压缩过程的实现:如果说,压缩的过程可以通过查找codeList来加速实现的话,而解压缩则必须通过查找树才能加以实现.查找的过程是简单的,可以根据树的性质来做,当haffCode的当前位为0时,则向左枝展开搜索;当前bit 位为时,则向右枝展开搜索
4、,当遇到叶子结点时,则输出对应的asciiCode。三、详细设计:核心算法源程序:树建立源程序:/-/huffmantree.h/霍夫曼树#ifndefHUFFMANTREE#defineDefaultsize300#includebintree.hheap.hclassCodepublic:intcode;Code*link;Code(intc=0,Code*l=NULL):code(c),link(l);CharNameNodeunsignedcharcharname;/要这样才行CharNameNode(unsignedcharname(c),link(l);templateTypeHu
5、ffmanTree:publicBinaryTreekey;HuffmanTree();HuffmanTree(HuffmanTree&ht1,HuffmanTreeht2)Typetemp=0;/可能有变key=ht1.key+ht2.key;root=newBinTreeNode(0,Copy(ht1.root),Copy(ht2.root);voidBuild(int*fr,Type*value,intn,HuffmanTreenewtree);Path(BinTreeNode*start,Code*first,Code*last,CharNameNode*Node,inti);/一个数
6、组HuffmanTree:newtree) /fr为value(值)对应的权i;first,second;NodeDefaultsize;MinHeaphp;assert(n=0&n=Defaultsize);for(i=0;in;i+)Nodei.root=new(valuei,NULL,NULL);Nodei.key=fri;hp=MinHeap(Node,n);n-1;hp.RemoveMin(first);hp.RemoveMin(second);*temp=new(first,second);hp.Insert(*temp);hp.RemoveMin(newtree);templat
7、evoid HuffmanTreeGetData()!=0)/是叶结点严重错误,可能叶结点也是0!if(start-GetLeft()=NULL&start-GetRight()=NULL)Nodei.charname=start-GetData();Nodei.link=NULL;if(first=NULL)Nodei.link=newCode(first-code);*p=first-link,*q=Nodei.link;while(p!=NULL)q-link=newCode(p-q=q-link;p=p-link=NULL;i+;*temp=newCode;/进入左子树assert(t
8、emp);first=last=temp;elselast-link=temp;last=last-Path(start-GetLeft(),first,last,Node,i);code=1;GetRight(),first,last,Node,i);temp=first;if(first=last)deletelast;first=last=NULL;while(temp-link!=last)temp=temp-temp-last=temp;#endif实现二叉树的算法源程序:/-/bintree.h/用指针实现的二叉树/Type类型必须有重载及运算BINTREEassert.hMax(inta,intb)returnab?a:b;BinaryTree;BinTreeNodefriend;BinTreeNode():leftchild(NULL),rightchild(NULL);BinTreeNode(Typeitem,BinTreeNode*left=NULL,BinTreeNode*right=NULL)data(item),leftchild(left),rightchild(right);GetData()constdata;*GetLeft()constleftchild;*GetRight()constrightchild;vo
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1