项目背景
一、技术需求背景
数据存储与传输压力:随着信息技术的迅猛发展,人们需要存储和传输大量的数据,如文档、图片、音频、视频等。这些数据占用大量的存储空间和传输带宽,为了更高效地利用存储资源和降低传输成本,对数据进行压缩成为迫切需求。在网络传输中,较小的文件可以更快地发送和接收,节省时间和带宽;在存储设备中,压缩后的文件可以节省存储空间,让用户能够存储更多的数据。
二、算法优势背景
高效压缩:哈夫曼编码作为一种有效的数据压缩技术,通过构建最优的前缀码,为高频字符分配较短的码字,低频字符分配较长的码字,以此达到数据压缩的目的。这种基于字符频率的编码方式,使得压缩效率显著提高。
无损压缩:哈夫曼编码是一种无损数据压缩算法,它在保证数据完整性的同时,实现了高效的压缩。这对于需要保留原始数据信息的场景尤为重要。
广泛应用:哈夫曼编码不仅适用于文本数据,还可以应用于图像、音频和视频等多种类型的数据,具有广泛的应用范围。在文件压缩、网络通信、多媒体处理等领域都得到了广泛应用。
项目简介
-
基本原理:依据字符出现的概率来构建平均长度最短的码字。具体为,统计文件中每个字符出现的频率,频率高的字符用较短的编码表示,频率低的字符用较长的编码表示。例如,在一篇英文文章中,字母“e”出现频率很高,可能被赋予较短的编码,如“01”;而像“z”这样出现频率较低的字母,则可能被赋予较长的编码,如“1100”。
-
步骤如下:
(1) 统计字符频率:读取文件,统计其中所有不同字符的出现次数。比如对于文本文件,统计每个字母、数字、标点符号等的出现次数。
(2) 构建哈夫曼树:利用小堆(优先队列)根据字符频率构建哈夫曼树。在构建过程中,每次从堆中取出频率最小的两个节点,将它们合并为一个新节点,新节点的频率为这两个节点频率之和,新节点作为这两个节点的父节点,再将新节点放回堆中,重复此操作,直到堆中只剩下一个节点,即哈夫曼树的根节点。
(3) 生成哈夫曼编码:根据构建好的哈夫曼树,为每个字符生成对应的哈夫曼编码。从根节点开始,往左走编码为“0”,往右走编码为“1”,到达每个字符的叶子节点时,所经过的路径上的“0”和“1”序列就构成了该字符的哈夫曼编码。
(4)文件压缩:再次遍历文件,将每个字符替换为它的哈夫曼编码,并按字节写入压缩文件。如果编码不足一个字节,可进行适当的位填充。同时,还需将字符频率等信息保存到配置文件中,用于解压缩时重构哈夫曼树。
(5)文件解压缩:读取压缩文件和配置文件,根据配置文件中的字符频率信息重构哈夫曼树。然后逐位读取压缩文件中的编码,根据哈夫曼树进行解码,将解码后的字符依次写入解压缩文件,直到压缩文件读取完毕。
-
项目优缺点
优点:哈夫曼编码是一种无损压缩算法,能有效减少文件存储空间占用,对于数据量较大的文件,压缩效果通常较为显著。例如,对于包含大量重复字符或具有特定模式的文本文件、图像文件等,都能实现较高的压缩比。
缺点:压缩和解压缩过程需要一定的计算时间和资源,特别是对于非常大的文件,构建哈夫曼树和进行编码转换可能会耗费较长时间;另外,哈夫曼编码是基于字符出现频率的统计,如果文件中字符的分布情况与统计情况不符,或者文件较小,可能无法达到很好的压缩效果。
测试工具和相关技术
测试工具:Beyond Compare、VS2022
相关技术:Huffman树、优先级队列、文件流提取和写入、位操作、哈夫曼编码
测试用例
测试计划
测试 | 后端开发 | 前端开发 | 提测日期 | 测试 | 测试日期 | 测试结果 |
---|---|---|---|---|---|---|
压缩功能 | 何宛容 | 何宛容 | 8.13 | 何宛容 | 8.14 | 压缩文件含有中文字符有bug |
解压功能 | 何宛容 | 何宛容 | 8.13 | 何宛容 | 8.14 | 通过 |
界面 | 何宛容 | 何宛容 | 8.13 | 何宛容 | 8.14 | 通过 |
兼容性 | 何宛容 | 何宛容 | 8.13 | 何宛容 | 8.14 | 通过 |
易用性 | 何宛容 | 何宛容 | 8.13 | 何宛容 | 8.14 | 通过 |
安全性 | 何宛容 | 何宛容 | 8.13 | 何宛容 | 8.14 | 通过 |
执行测试过程
功能测试:覆盖了压缩、解压、退出功能,发现了2个问题。
界面测试:覆盖了菜单页、压缩界面、解压界面,发现0个问题。
兼容性测试:覆盖了常见的文件类型:word、excel、ppt、txt、pdf、png、md、log、音频文件、视频文件,发现0个问题
安全性测试:覆盖了压缩、解压是否会丢失数据,发现1个问题
项目测试bug简述
出现越界问题
问题文件:压缩文件包含中文字符
问题出现环境:
电脑系统:win10,编译器环境:VS2022,问题出现条件:压缩文件中存在中文字符
问题原因:
char类型的取值范围是:-128~127,而中文字符需要两个字符表示的。而这两个字符不在ASCII码表的范围内。使用char类型的readBuff接收,就超过char类型的范围了,所以readBuff[i]可能是负数导致数组越界报错。
测试结论
- 哈夫曼文件压缩算法在处理文本文件时具有较高的压缩比和较好的压缩效果,但对于图像和音频文件的压缩效果有限。
- 该算法的压缩时间较长,尤其是对于较大的文件。因此,在对时间要求较高的场合,可能需要考虑其他更快速的压缩算法。
- 哈夫曼算法的解压时间较短,适用于需要频繁解压文件的场合。
- 哈夫曼文件压缩算法在特定的应用场景下具有一定的价值,但在实际使用中需要根据具体情况进行选择和优化。