1、2019/4/25,1,基于字典编码的数据压缩算法的设计与实现,答辩人:指导教师:,2019/4/25,2,数据压缩的提出,信息的时代 解决方法 提高硬件的制造工艺 数据压缩 数据压缩在一定的数据存储空间要求下,将相对庞大的原始数据,重组为满足前述空间要求的数据集合,使得从该数据集合中恢复出来的信息,能够与原始数据相一致,或者能够获得与原始数据一样的使用品质。,2019/4/25,3,数据压缩理论基础,信息论 熵的提出一条信息中真正需要编码的信息量用 0 和 1 组成的二进制数码为含有 n 个符号的某条信息编码,假设符号 Fn 在整条信息中重复出现的概率为 Pn,则该符号的熵也即表示该符号所需
2、的二进制位数为:En = - log2( Pn )整条信息的熵也即表示整条信息所需的二进制位数为: E = knEn 信息压缩的极限,2019/4/25,4,数据压缩基本原理,信息存在冗余 用较少的位数表示较频繁出现的符号技术构成 模型 得到字符或单词在信息中出现的概率 编码 精确地用模型计算出来的位数表示某个符号压缩 = 模型 + 编码,2019/4/25,5,字典编码基本思想,数据本身包含有重复代码 根据字典创建方式不同分为两类: 隐式字典查找正在压缩的字符序列是否在以前输入的数据中出现过,然后用已经出现过的字符串替代重复的部分,它的输出仅仅是指向早期出现过的字符串的“指针” 显式字典从输
3、入的数据中创建一个“短语字典”,编码数据过程中当遇到已经在字典中出现的“短语”时,编码器就输出这个字典中的短语的“索引号”,2019/4/25,6,基于字典压缩算法简介,隐式字典 显示字典 ,2019/4/25,7,算法实现与改进,借鉴LZW for GIF 实现起来较容易实现方法的改进 使用面向对象编程技术技术的“改进” 零搜索动态编码长度,2019/4/25,8,实现技术的选择,Delphi Object Pascal语言面向对象的开发工具,完全可视化方便快捷RAD工具,2019/4/25,9,实现简介,以类的形式实现 编码类 解码类 使用 生成对象 主要流程 GetBegin Execu
4、te GetEnd,2019/4/25,10,类的定义,TLZWEncode = class(TObject)privateEncodeTable: array 0LZWTABLESIZE - 1 of Word; / 编码表EncodePointer: array 0LZWMAXCODES - 1 of LongWord; / 经过编码的缓存ExportBlock: Pointer; / 存放编码后的数据指针(输出缓存块指针)ExportBlockPtr: array of Byte; / 该指针指向 ExportBlock ,用于访问数组InitBits: Integer; / 压缩数据的
5、起始位数ClearCode: Integer; / 清除码EofCode: Integer; / 结束码PrefixCode: Integer; / 字头码SuffixCode: Integer; / 字尾码Encode: Integer; / 压缩编码RunBits: Integer; / 当前处理位MaxCodeSize: Integer; / 当前处理最大编码FBegin: Boolean; / 开始处理标志FExportSize: Integer; / 输出数据块大小FExportIndex: Integer; / 输出数据块索引FExportTotalSize: Integer; /
6、 记录输出缓存块大小ShiftBits: Integer; / 用于位处理,作临时位ShiftCode: Integer; / 用于位处理,作临时代码protectedprocedure ExportData(AData: Integer); virtual; / 输出数据(虚方法)publicfunction GetExportPointer: Pointer; / 返回输出指针function GetExportSize: Integer; / 返回输出大小procedure GetBegin; / 置开始编码标志procedure GetEnd; / 置结束编码标志procedure E
7、xecute(Data: array of Byte; DataSize: Integer); virtual; / 执行编码过程(虚方法)constructor Create;destructor Destroy; override;end;,2019/4/25,11,类的定义,TLZWUnencode = class(TObject)privateInitBits: Integer; / 压缩数据的起始位数ClearCode: Integer; / 清除码EofCode: Integer; / 结束码PrefixCode: Integer; / 字头码SuffixCode: Integer
8、; / 字尾码Encode: Integer; / 压缩编码RunBits: Integer; / 当前处理位MaxCodeSize: Integer; / 当前处理最大编码ExportBlock: Pointer; / 存放编码后的数据指针(输出缓存块指针)ExportBlockPtr: array of Byte; / 该指针指向 ExportBlock ,用于访问数组StackIndex: Integer; / 栈索引StackTable: array 0LZWSTACKBUFFERSIZE - 1 of Byte; / 栈表PrefixTable: array 0LZWMAXCODES
9、 - 1 of Word; / 字头表SuffixTable: array 0LZWMAXCODES - 1 of Byte; / 字尾表FExportSize: Integer; / 输出数据块大小FExportIndex: Integer; / 输出数据块索引FExportTotalSize: Integer; / 记录输出缓存块大小ShiftBits: Integer; / 用于位处理,作临时位ShiftCode: Integer; / 用于位处理,作临时代码protectedprocedure ExportData(AData: Integer); virtual; / 输出数据(虚方
10、法)publicfunction GetExportPointer: Pointer; / 返回输出指针function GetExportSize: Integer; / 返回输出大小procedure GetBegin; / 开始解码(分配输出内存空间)procedure GetEnd; / 结束解码(释放输出内存空间)procedure Execute(Data: array of Byte; DataSize: Integer); virtual; / 执行解码过程(虚方法)constructor Create;destructor Destroy; override;end;,2019/4/25,12,编码流程,2019/4/25,13,解码流程:,2019/4/25,14,收获与体会,数据压缩基本知识 字典编码原理与技术 PASCAL语言的学习 基本掌握elphi开发工具,2019/4/25,15,感谢指导老师的悉心指导 请各位老师批评指正,答辩人:,