文件压缩程序设计报告Word文档下载推荐.docx
- 文档编号:13930391
- 上传时间:2022-10-15
- 格式:DOCX
- 页数:26
- 大小:25.66KB
文件压缩程序设计报告Word文档下载推荐.docx
《文件压缩程序设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《文件压缩程序设计报告Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
外,短语式压缩后的结果:
那些剩下的未被匹配的单、双字节和得到匹配的距离、长
度值仍然具有取值分布不均匀性,因此,两种压缩方式的顺序不能变。
本程序设计只做了编码式压缩,采用
Huffman
编码进行压缩和解压缩。
编
码是一种可变长编码方式,是二叉树的一种特殊转化形式。
编码的原理是:
将使用次
数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持
编码的唯一可解性。
根据ascii码文件中各ascii字符出现的频率情况创建
Huffman树,再将各字符对应的哈夫曼编码写入文件中。
同时,亦可根据对应的哈夫
曼树,将哈夫曼编码文件解压成字符文件.
二、
概要设计:
主程序流程图:
主函数
统计字符,得
退出
测试
输入测试字符
串
统计字符信息,
建立Huffman曼
树
根据Huffman树,
求得对应字符的
Huffman编码
输入Huffman编
码,求得解码
出统计出的字
符的权值n
根据权值进行
建立Huffman树
输出Huffman树
编码
输出编码
压缩编码
生成压缩文件
扫描压缩文件,
载入字符信息
解码
解压
生成新的文本
文档
压缩过程的实现:
压缩过程的流程是清晰而简单的:
1.创建
2.打开需压缩文件
3.将需压缩文件中的每个
ascii
码对应的
huffman
编码按
bit
单位输出生成压缩文
件压缩结束。
其中,步骤
1
和步骤
3
是压缩过程的关键。
步骤
1:
这里所要做工作是得到
数中各叶子结点字符出现的频率并进行创
建.统计字符出现的频率可以有很多方法:
如每次创建前扫描被创建的文件,“实时”的
生成各字符的出现频率;
或者是创建前即做好统计.这里采用的是前一种方法。
3:
将需压缩文件中的每个
单位输出.
这是本压缩程序中最关键的部分:
这里涉及“转换”和“输出”两个关键步骤:
“转换”部分大可不必去通过遍历
树来找到每个字符对应的哈夫曼编码,可以将每个
码值及其对应的
码存放于如下所示的结
构体中:
解压缩过程的实现:
如果说,压缩的过程可以通过查找
codeList
来加速实现的话,而解压缩则必须通过查找
树才能加以实现.查找的过程是简单的,可以根据
树的性质来做,当
haffCode
的当前
位为
0
时,则向左枝展开搜索;
当前
bit位为
时,则向右枝展开搜索,当遇到叶子结点时,则输出
对应的
asciiCode。
三、
详细设计:
核心算法源程序:
树建立源程序:
//-------------------------------------------------------------
//huffmantree.h
//霍夫曼树
#ifndef
HUFFMANTREE
#define
Defaultsize
300
#include
<
iostream.h>
"
bintree.h"
heap.h"
class
Code
{
public:
int
code;
Code
*link;
Code(int
c=0,Code
*l=NULL):
code(c),link(l){};
};
CharNameNode
unsigned
char
charname;
//要这样才行
CharNameNode(unsigned
charname(c),link(l){};
template
Type>
HuffmanTree:
public
BinaryTree<
key;
HuffmanTree(){};
HuffmanTree(HuffmanTree<
&
ht1,HuffmanTree<
ht2)
Type
temp=0;
//可能有变
key=ht1.key+ht2.key;
root=
new
BinTreeNode<
(0,Copy(ht1.root),Copy(ht2.root));
}
void
Build(int
*fr,Type
*value,int
n,HuffmanTree<
newtree);
Path(BinTreeNode<
*start,Code
*first,Code
*last,CharNameNode
*Node,int
i);
//一个数组
HuffmanTree<
:
newtree)
{//fr
为 value(值) 对应的权
i;
first,second;
Node[Defaultsize];
MinHeap<
>
hp;
assert(n>
=0&
n<
=Defaultsize);
for(i=0;
i<
n;
i++)
Node[i].root=new
(value[i],NULL,NULL);
Node[i].key=fr[i];
hp=MinHeap<
(Node,n);
n-1;
hp.RemoveMin(first);
hp.RemoveMin(second);
*
temp=new
(first,second);
hp.Insert(*temp);
hp.RemoveMin(newtree);
template<
voidHuffmanTree<
*start,Code*first,Code
*Node,int
i)
if(start==NULL)
return;
//if(start->
GetData()!
=0)
//是叶结点
严重错误,可能叶结点也是
0!
!
if(start->
GetLeft()==NULL&
start->
GetRight()==NULL)
Node[i].charname=start->
GetData();
Node[i].link=NULL;
if(first==NULL)
Node[i].link=new
Code(first->
code);
*p=first->
link,*q=Node[i].link;
while(p!
=NULL)
q->
link=new
Code(p->
q=q->
link;
p=p->
link=NULL;
i++;
*temp=new
Code;
//进入左子树
assert(temp);
first=last=temp;
else
last->
link=temp;
last=last->
Path(start->
GetLeft(),first,last,Node,i);
code=1;
GetRight(),first,last,Node,i);
temp=first;
if(first==last)
delete
last;
first=last=NULL;
while(temp->
link!
=last)
temp=temp->
temp->
last=temp;
#endif
实现二叉树的算法源程序:
//---------------------------------------------------------------------
//bintree.h
//用指针实现的二叉树
//Type
类型必须有重载<
与>
及=运算
BINTREE
assert.h>
Max(int
a,int
b)
return
a>
b?
a:
b;
BinaryTree;
BinTreeNode
friend
;
BinTreeNode():
leftchild(NULL),rightchild(NULL){};
BinTreeNode(Type
item,BinTreeNode<
*left
=
NULL,BinTreeNode<
*right=NULL)
data(item),leftchild(left),rightchild(right){};
GetData()const
{
data;
*GetLeft()const
leftchild;
*GetRight()const
rightchild;
vo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 压缩 程序设计 报告