本周总结(数据结构小学期2)
一:做的事情:完成了数据结构小学期第二阶段实验
二:遇到的问题:哈夫曼编码的原理没完全掌握
三:下周准备安装clion和弥补数据结构的知识
我选的题目是:压缩解压文件
要求压缩程序读入源文件,分析每种字符的频度,然后建立相应的哈夫曼树,再求出相应哈夫曼编码,根据编码对源文件进行压缩,得到源文件对应的压缩文件。解压程序读入压缩文件,根据相应的哈夫曼编码解压还原,得到对应的源文件。 求出压缩率。
关键词:数据结构; 压缩解压文件; 哈夫曼;
下面给出关键代码:
1.stdafx.h
#include <iostream> #include <fstream> #include <queue> using namespace std; const int leaf = 256; const long MAX = 99999999; //huffman树的结点结构体 typedef struct HTnode { long weight; int parent; int lchild; int rchild; int *code; int codelen; HTnode() { weight = MAX; parent = -1; lchild = -1; rchild = -1; codelen = 0; } }HTnode;
2.huffmanTree.h
#include"stdafx.h" class huffmanTree { public: huffmanTree(); virtual ~huffmanTree(); bool count(char *input); void create(); void code(); void printcode(); void addbit(int bit); void resetbyte(); bool compress(char *input, char *output); bool decompress(char *input, char *output); void compare(char *input, char *output); void compare2(char *input, char *output); private: int root; int leafnum; HTnode HT[leaf*2-1]; char byte; int bitsnum; int lacknum; };
个人体会:
感觉自己对数据结构掌握的还是比较差,很多算法都还不理解,写不明白;这个系统也是参考了前辈的代码才做完的,大致明白了huffman压缩解压文件的原理。主要思路是1:压缩函数 bool compress(char *input, char *output),2:恢复函数 bool decompress(char *input, char *output),3:恢复文件与原文件的对比函数 void compare2(char *input, char *output)并可在完成相应功能后安全退出,压缩或恢复的文件在同文件夹下生成。哈夫曼用于文件解压缩的基础是在压缩二进制代码的同时还必须存储相应的编码,这样就可以根据存储的哈夫曼编码对压缩代码进行压缩。总之,该系统的任务应该是首先要打开要压缩的文本文件并读出其字符出现的频率,以其为权值构建哈夫曼树。其次要找到构建压缩功能的方法,在构建哈夫曼树的基础上进行编码,改变字符原先的存储结构,以达到压缩文件的目的,以外还有存储相应的哈夫曼编码,为解压缩做准备。这个过程总的来说学到了很多东西,也确实理解了哈夫曼原理,不过还是有很多地方需要努力。