常见无损压缩算法
Huffman coding
这种编码方式就是需要知道每个字符(symbol)出现的频率(需要扫描所有数据一次),然后构建哈夫曼二叉树。构建过程就是每次挑选出现频率最低的两个节点作为树的左右子节点,并且将它们合并成新的节点,新节点频率是它两之和。构建好huffman树后,就可以进行huffman编码,从根节点开始,左边支路编码为0,右边支路编码为1。然后再扫描一次数据,得到最优编码。缺点是耗时长,需要扫描两遍数据。因此有相关动态的huffman编码工作来提升它的性能,可能压缩率会有所下降。
Arithmetic Coding
信息压缩是有极限的,使用信息熵就可以得到这个极限。和哈夫曼编码一样,算数编码是熵编码的一种,是基于数据中字符出现的概率,给不同字符以不同的编码。但是huffman编码只能使用整数来表示,而算术编码最终得到的是一个小数,能更加接近理论最优,当然也是很耗时的。具体算法原理参考 算数编码原理解析 - SegmentFault 思否
Lempel-Ziv Code
例如 LZ77、LZ78
还有其它常见算法如PPM、BWT等,短时间没法理解
它们各自的性能如下:
上表是现有的工具以及使用的算法,算法的性能和具体的实现是很相关的。有时间还是要弄懂的,毕竟用的比较多。
参考文献
- Barr, Kenneth C., and Krste Asanović. “Energy-aware lossless data compression.” ACM Transactions on Computer Systems (TOCS) 24.3 (2006): 250-291.