算法设计与分析课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档