%\document{article} \documentclass[UTF8]{ctexart} \usepackage{amsmath} \usepackage{graphicx} \usepackage{fancyhdr} \usepackage{float} \usepackage{listings} \title{Huffman编码压缩} \author{朱河勤 PB16030899} \pagestyle{fancy} \lfoot{朱河勤 PB16030899} \chead{Huffman编码压缩} \rfoot{2017/11/11} \begin{document} \maketitle \tableofcontents \section{需求分析} \paragraph{1} 正确创建huffman 树,并得到huffman编码 \paragraph{2} 压缩编码文件,使一般的文本文件变小,二进制文件可能不会变小 \paragraph{3} 解压文件,注意生成的文件要考虑同名,所以要考虑文件名的操作 \paragraph{4} 压缩解压时显示进度条 \paragraph{5} 解压完毕,统计文件数,压缩率,压缩时间等等 \section{概要设计} \subsection{结点node} ADT linkList\{\\ \paragraph{数据对象}:key , val, visited ,left,right \\ \paragraph{数据关系}:属性集合\\ \paragraph{基本操作}: \subparagraph{node()} 新建一个结点 \subparagraph{node( const node\& nd} 复制一个结点 \subparagraph{operator<}重载操作符< \} \subsection{huffman树} ADT linkList\{\\ \paragraph{数据对象}:root , encode\_map, total\\ \paragraph{数据关系}:属性集合\\ \paragraph{基本操作}: \subparagraph{huffman( map)}传递字符的频率信息以map形式, 然后建立huffman树 \subparagraph{encode(string)} 传递文件名,压缩 \subparagraph{decode(string)} 传递文件名,解压缩 \subparagraph{preorder()}先序遍历,获得huffman编码 \subparagraph{display}显示所有信息,包括结点信息,以及huffman编码 \} \section{详细设计} \subsection{编码,解码算法} \begin{lstlisting}[language=c++] template void huffman::preOrder(node* nd,string s) { if(nd->left == NULL){ encode_map[nd->key] =s; decode_map[s] = nd->key; delete nd; return ; } preOrder(nd->left,s+'0'); preOrder(nd->right,s+'1'); delete nd; } template string huffman::decode(string zipfile_name) { string uniFileName(string); FILE * src = fopen(zipfile_name.c_str(),"rb"); char file_name[nameLength]; fgets(file_name,nameLength,src); int ct=-1; while(file_name[++ct]!='\n'); int pos = zipfile_name.find('.'); if(pos==string::npos)pos=zipfile_name.size(); string name(zipfile_name.substr(0,pos)) ,suffix(file_name,file_name+ct),file(name+suffix); file=uniFileName(file); cout<<"extracting compressed file :"< mp; int idx=0; for(int i =0;i string huffman::encode(string file_name) { string uniFileName(string); int pos =file_name.rfind('.'); if(pos==string::npos)pos=file_name.size(); string zipfile = file_name.substr(0,pos)+string(".zzip"); zipfile = uniFileName(zipfile); cout<<"generating zip file :"<::iterator i=decode_map.begin();i!=decode_map.end() ;++i ){ data.append((i->first)); data.append(" "); data+=(i->second); } cout<