完整资料进入【数字空间】查看——搜索"writebug"
实验内容
ALPD 公司(爱乐普第)名下有一个网站 (ALPDOJ, 爱乐普第 Orange Juice) 用于在线预约橙汁。该公司的橙汁特别好喝而且十分畅销,导致网站访问量特别大,每天都有上百人登录网站预约橙汁,所以导致公司的日志记录非常的长。公司负责人 wws 在归档网站日志的时候发现公司服务器硬盘实在是太小导致不够存了,所以在考虑怎么压缩数据以保存这些一点也不重要的数据。可是 wws 实在是太菜了,思来想去也不知道这份文件该怎么压缩。随着日子渐渐推移服务器的硬盘空间越来越小,一旦空间到了 0 那么整个网站都会崩溃。这可急坏了 wws,于是他找到了你,希望你能帮帮他压缩这些文件。
设计思路与功能描述
项目思路说明
压缩算法的选择
通过对 OJ 网站上给出内容与要求的分析可知,本次大作业的主要目的是设计一套压缩与解压程序,实现文本内容(即题目给出 ser.log)的有效压缩。而正如 OJ 平台的介绍所述,压缩分为无损压缩与有损压缩,但考虑到有损压缩一般多用于视频、图片的压缩处理上。而且在正常情况下,人们对文本中缺字少字的敏感度要远高于对图片像素降低的敏感度。
所以基于上述的综合考量,本次大作业的目标可以细化为:使用某种无损压缩方式实现 ser.log 的压缩与解压。
而 OJ 平台上给出的示例程序采取的是有损压缩的方式,所以在本次大作业的编写过程中不对平台给出代码进行参考。通过在网络上查阅相关资料可以得知,目前常见的无损压缩方法主要有如下几类:
① 哈夫曼编码;
②Lempel-Ziv 压缩算法;
③ 算术编码;
哈夫曼编码主要是基于各个文字在待压缩文本中的出现频度,构建起一颗 huffman 树,该 huffman 树的主要特点是每一个叶结点都是一个文字,而每一个中间结点一定不包含文字,所以当我们想要表示某个文字时,只需要说明该文字是从根节点出发,每到一个新节点是向左还是向右即可——而这种表示方式可以用简单的 bool 变量 0-1 来完成。同时 huffman 树能够保证出现频度高的字母能够对应较短的编码,从而使压缩后的文本尽可能小。
LZ 算法主要分为 LZ77 算法及其变种与 LZ78 算法及其变种。LZ 算法的共同特征就是用前面出现过的文本来替换之后再次出现文本。而替换时只需要记录替换位置即可,从而达到压缩文本的目的。同时,由于被替换的内容一定可以从之前已经生成的文本中找到,所以不用像哈夫曼编码一样需要给出字母表。而 LZ 系列算法中的不同算法则给出了不同的替换方式,其中不乏有著名的 LZM、LZO 等应用广泛的压缩算法
算术编码的主要思想就是将文本文件转换为 0-1 的二进制编码,然后用一个一个相互独立的实数来表示 0 和 1 之间的距离,随着消息的逐渐变长,从而逐步形成更为紧密的压缩文本。
而在本次大作业中,考虑到本人在上学期的《数据结构》课程上已经对哈夫曼编码和 LZ77 编码有所了解掌握,故在本次大作业中,将选用这两种无损编码方式来进行 ser.log 的压缩处理。