《算法》笔记 17
读写二进制数据 基因组数据的压缩 游程编码 位图 霍夫曼压缩 前缀码和单词查找树 构造前缀码的单词查找树 写入和读取单词查找树 使用前缀码压缩 使用前缀码展开 LZW压缩 LZW的单词查找树 LZW的单词查找树 LZW压缩的展开 对数据进行压缩能够有效节省保存信息所需的空间和传输信息所需的时间。虽然计算机存储设备的成本在不断降低,但由于需要存储的数据在飞速膨胀,压缩算法仍有非常重要的意义,因为与以往相比,数据被压缩后节省的空间会更大。 ### 读写二进制数据 现代计算机系统中处理的所有类型的数据最终都是用二进制表示的,可以将它们都看作一串比特的序列。 数据压缩分为无损压缩和有损压缩,前者在压缩、展开后不会丢失任何信息,但后者不然。有损压缩常被用于图像、视频、音乐的压缩。对于无损压缩算法,评价的标准为压缩率,压缩率=压缩后体积/原始体积;对于有损压缩算法,评价标准除了压缩率外,还有主观的质量感受等。 接下来只讨论无损压缩算法。 之前的算法设计输入输出时,使用的都是基于java基础方法封装的StdIn和StdOut,它们处理的是由Unicode编码的字符流;但由于压缩算法会涉及到对比特流的操作,所以接下来使用BinaryStdIn和BinaryStdOut,BinaryStdIn.readBoolean()方法会从输入中读取一个比特并返回为布尔值,BinaryStdOut.write