算法设计与分析课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
压缩软件课程设计书
一、问题描述:
建立一个文本文件,统计该文件中各字符频率,对各字符进行Huffman编码,将该文件至翻译成Huffman编码文件,再将Huffman编码文件翻译成原文件。
二、算法分析及思路:
对于该问题,我们做如下分析:
(1)首先得构造出哈弗曼树,我们用函数HuffmanTree(int w[],int s[],int n)设计;(2)在构建哈弗曼树的基础上,进一步实现哈弗曼编码问题,我们用函数Huffmancode(char wen[])设计;
(3)实现哈弗曼编码后再进一步实现哈弗曼译码问题,我们用函数Huffmandecode()设计;
(4)其中编码问题中,得进一步统计出各个字符在文件中的频率,并进行一些必要的标记,我们用函数runhuffman(char wen[])设计;
(5)在译码过程中,还有必要的一步是比较原文件与译码后的文件是否相同,我们用函数compare(char wen[])设计;
(6)其中的文件输入我们用到类”fstream.h”中的输入输出流,并在运行的文件夹中建立一个文件名为逍遥游的文本文件,且在逍遥游文件中输入需要编码的数据。
三、主要解决的设计问题:
1.写一个对txt文件压缩和解压的程序,使用动态编码。
2.使用Huffman编码压缩和解压时,Huffman树的存储可以直接存储树结构,也可以存储所有字符的频度或权值,然后读取时建立Huffman树;
3.使用Huffman编码压缩和解压时,注意定义压缩码的结束标记,可以使用一个特殊的字符作为结束标记,也可以在压缩码之前存储其比特长度;如果使用一个特殊字符作为结束标记,则其频度为1,需要在建立Huffman树时把它看作一个独立的字符进行建树。
4.使用Huffman编码压缩和解压时,在一个缓冲区里面收集压缩码比特流,每当收集的比特数满8时,可以把这8比特通过位操作合并成一个字节写入文件(当然也可以收集满一定数目的字节后再写入文件)。写入文件的最小信息单位为字节。
四、程序设计的流程图:
五、输入和输出说明:
1、数据输入:由文件input.txt提供输入需要压缩的内容;
2、结果输出:将压缩好的文件内容输出到《编码后的文件.txt》中,再由《编码后的文件.txt》解压到《译码后的文件.txt》中。
六、程序及其注解:
1、数据结构设计(即类的设计,包括类的数据成员、函数成员)
类的设计用HuffmanTree.h保存如下:
#include
#include
using namespace std;
const int MaxSize=512;
//--------------------------------------------------------------
struct element //哈夫曼树的结点
{
int str; //记录字符在数组中的位置
int weight; //字符出现频率(权值)
int lchild,rchild,parent; //哈夫曼树各个指针变量
char bits[30]; //存储哈夫曼编码的数组
};
//--------------------------------------------------------------
class HuffmanTree
{
element hufftree[MaxSize]; //存放哈夫曼树结点的数组
int num; //结点数
public:
HuffmanTree(int w[],int s[],int n);
void Select(int n,int &s1,int &s2);
void Huffmancode(char wen[]); //哈夫曼编码
void Huffmandecode(); //哈夫曼译码
};
//--------------------------------------------------------------
class Run
{
public:
void huffman(char wen[]); //将编码后的文件译成原文件
void runhuffman(char wen[]); //统计各字符频率
void compare(char wen[]); //比较逍遥游文件和译码后的文件
};
//--------------------------------------------------------------
2、算法设计(类的函数成员的具体设计)
(1)算法一设计用HuffmanTree.cpp保存如下:
#include
#include"HuffmanTree.h"
using namespace std;
//-------------------------------------------------------------------
void HuffmanTree::Select(int n,int &s1,int &s2)
{
s1=-1;
s2=-1;
for(int i=0;i<=n;i++)
{
if(hufftree[i].parent==-1)
{
if(s1==-1) {s1=i;continue;}
if(s2==-1) {s2=i;continue;}
if(hufftree[i].weight s1=i; else if(hufftree[i].weight s2=i; } } } //------------------------------------------------------------------- HuffmanTree::HuffmanTree(int w[],int s[],int n) { num=n; int i1,i2; i1=i2=0; for(int i=0;i<2*num-1;i++)//外部叶子结点数为num个时,内部结点数为n-1,整个哈夫曼树的需要的结点数为2*num-1. { hufftree[i].parent=-1; hufftree[i].lchild=-1; hufftree[i].rchild=-1; }