数据结构与算法实习报告

发布 2021-05-02 17:25:28 阅读 4695

课程设计报告。

学号: 2010100

班级序号: 114103

姓名: 刘洋

指导教师: 陈启浩

成绩。中国地质大学信息工程学院空间信息工程系。

2024年 2 月。

课程设计报告。

一、软件压缩/解压缩软件 szip(huffman算法及应用)

利用哈夫曼编码对一个现有文件进行重新编码行成新的文件,可以减小文件大小,减少存储空间,这也就是压缩。在文件使用时,再对压缩文件进行解压缩,也就是译码,复原原有文件。

即求解的问题是,根据哈夫曼编码的知识写一个压缩/解压缩软件。

主要的算法思想及其存储结构:采用课程实习已经写过的huffman编码程序对要压缩文件中字符进行读取,统计字符出现频率,并进行字符编码。将编码后的字符以链表形式存储其所编的huffman码,并以该字符建立链表的字典索引。

重新读取待压缩文件并根据链表搜索其huffman编码按顺序写入一暂存文件中保存。根据中的编码进行8个数字一压缩写入压缩文件中。(压缩文件头部首先要写入字典编码等重要信息,以方便解码需求)。

解码时首先以二进制形式读取压缩文件中存入的字典编码信息,根据其字符频率信息重新构造huffman树,与此同时将剩余压缩文件中每个字符解压缩成8个字符(与对应)写入暂存的文件中。再依次据暂存文件读取huffman编码数字,根据建立的huffman搜索树进行解码还原成带压缩文件。

具体的压缩实例部分**:

/主程序中void main()

/省略其统计字符出现频率的**。

cout<<"开始构建huffman树并压缩……"

binarytree d;

/hz *c=new hz[i+1]; hz是专门用来存储字典的类其中只包含私有变量char letter;字符。

int count;字符统计频率这俩个信息。及huffman每个节点均为hz类型。

d=huffmantree(c,e-1);/构建huffman树的函数,d为返回的huffman树。

sortedchain,char> cc;c=&cc;//定义链表用来存储字典编码信息。

co=-1;//变量初始化,用来初始p数组(p用来记录当前01编码)

树类的递归编码程序,压缩、解压缩重复利用此函数编码。

/该函数最后一个参数true表示是压缩时用,false表示是在解压时用

ofstream ofile(""ios_base::out|ios_base::binary);/建立暂存文件。

/……省略部分**。

binarytreenode ee;

for(int o=0;o}

if (r)

/huffman编码函数(类似前序遍历的递归函数)

template

void binarytree::hfbm(void(*visit)(binarytreenode *u,int co,bool a), binarytreenode *t,int co,bool a)

if (t)

if(t->rightchild)

p[co]='1';

hfbm(visit, t->rightchild,co,a);}

/具体将字符频率插入到链表的函数。

void hfleaf(binarytreenode *u,int co,bool a)

if (!u->leftchild &&u->rightchild &&co==-1)

else if(!u->leftchild &&u->rightchild)

最难解决的是将8个01字符压缩成8位的字符写入压缩文件中,由于所有编码和未必是8的整数个数,所以同时还要标记最后一个字符的二进制数字中有几位是真实有效的。

具体解决是首先包含头文件#include,然后调用bitset类将01字符串转换为二进制与其数值相等的长整数值,即以8位二进制数值为一个无符号字符型变量的值,再写入压缩文件中:bitset<8> cbit(str);unsigned long int io = oofile<对于解决标记最后一个字符的真实有效位数,可以根据暂存文件的信息算出最后一位的有效位数:r=(int(

使用说明:在程序运行时有字幕提示一步一步的操作,也可根据以下示例**来操作。程序运行结果如图所示:

程序首先对文件进行压缩生成压缩文件,再继续对文件压缩生成压缩文件;最后再将文件解压生成ly_文件与文件相同,实现了文件的无损压缩和解压。

改进设想及经验与体会:此程序用的是二进制流文件的读入和输出,且是用win32控制台,若要改进则应改用界面更优化的mfc来编写,同时改用cfile类来进行文件的读入写出。

时空复杂度:对于空间复杂度来说,由于压缩解压缩都借助了暂存文件来存储字符,因此在空间上得到了优化;但对于时间复杂度来说,由于要多写进去2个暂存文件中,因此降低了时间复杂性。

经验的话是把压缩的具体流程熟悉了一遍,以及处理输入压缩名,更改名字为。haf结尾的字符串用法:

string inputfile,outputfile;

cout<<"输入压缩文件名(带后缀):"

cin>>inputfile;

outputfile=outputfile+".haf";

cout<<"压缩后文件名为:"<这段**可为第二个题目做小部分铺垫。

《五号宋体》,具体内容:经验与体会,或需要改进的地方)

/前面省略的huffman树的函数以及结点hz类的**。

/类hz是huffman树构建的节点数据data的类型。

class hz

public:

hz()void add()

char letter()

bool operator ==char x)

数据结构与算法实习

对计算机和智能这两个计算机类专业的课程要求高于电子微电子的课程要求,单独设立实习课程,在同一个学期讲授。加强上机实践,强化算法能力,以及软件工程规范的训练。与理论课形成更好的互补。数据结构与算法实习配合 数据结构与算法 理论课程的学习,介绍一些程序风格 设计 测试和排错等软件工程的基本知识和方法 通...

数据结构与算法报告

合肥学院。计算机科学与技术系。课程设计报告。2011 2012 学年第二学期。20 12年 6 月。一,题目。1 名称 幸运数组。2 内容 doraemon有一个幸运数字k,并且对于一个数组,若其和能被k整除,则称该数组为幸运数组。现在他想知道,给定一个长度为n且由正整数构成的数组,它有多少个子数组...

数据结构与算法

本章知识要点 算法的基本概念 数据结构的定义 线性表的定义和存储 树 二叉树的定义和存储 查找与排序算法。算法 algorithm 是一组有穷的规则,规定了解决某一特定类型问题的一系列运算,是对解题方 与完整的描述。算法是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中...