projict---+--build
|---bin
|---include
|---lib
|---samples
|---src
build/:项目编译目录,各种编译的临时文件和最终的目标文件皆存于此,分为debug/和release/子目录
include/:公共头文件目录,可以按模块划分组织目录来保存模块相关头文件
samples/:样例程序目录
Makefile:项目构建配置文件,当然也有可能是其他类型的构建配置文件,比如bjam
README:项目的总体说明文件
src //存放源代码
运用数据结构:
压缩流程:读取文件进行统计每个字节的频率,用读取到的每个字节的频率建立哈弗曼树,用哈弗曼树对每个字节进行非等长编码。读入源文件对买个字节进行重新编码存入压缩文件,有一个标记位表示最后有几个有效字符。
解压流程:读取编码表,根据编码表建立哈弗曼树。读取压缩文件流式处理,将对应的压缩编码还原为原编码,存入压缩文件。
运用数据结构和作用:
Heap:存储每个字节的频率,用于哈弗曼树的建立
Huffman tree:作为压缩和解压的编码和翻译的数据结构。
bitqueue:在压缩中存储暂时存在于内存的翻译过的编码,当对了饱和度大于80%时进入进行压缩,分为字符串弹出和字节弹出,字符串弹出的作用就是用来处理饱和度过大时的压缩,字节弹出是为了当读取完文件时,最后一个不满一个字节的有效byte。并且连个函数都有传出参数分别表示压缩的字符串长度和字节有效位数。
Bignum:大数的加减,用于处理超大文件的频率统计,暂时未加入。
Queue:用于解压当中,将读入的字节按照二进制展开存入Queue中去,每次循环出队字节流失处理匹配。将匹配到的字符压入文件。直到Queue当中剩余几个无效字符为止。
程序不足和改进:
处理时间有待改进,因为我是按照字节读入和存入的,每次读入I/O都有可能将程序挂起,程序就中断了,可以进行块式读取I/O,运用多线程操作,比如压缩和解压的时的读取编码和压入文件的操作。