数据压缩算法
Page content
[TOC]
介绍经典的数据压缩算法
Data Compression
例子 基因组学
genomic data : ATCGATCGATCG…
如果用字符表示的话,一个字符是8bit。但实际一个基因片段中只有四个字母出现。使用2个bit就能表示这四个字母。
空字符为 ‘\0’, NUL
RunLength算法思想
算法介绍:
runs of data (that is, sequences in which the same data value occurs in many consecutive data elements) are stored as a single data value and count, rather than as the original run.
https://en.wikipedia.org/wiki/Run-length_encoding
算法实现
黑白图像素越高,压缩比例越高。
最早用于传播电视信号。
而图片压缩格式,例如JPEG,属于有损失的压缩。
https://en.wikipedia.org/wiki/JPEG
游程编码算法不明白的地方:
为什么要写一个重新计数0呢?
public static void compress() {
char run = 0;
boolean old = false;
while (!BinaryStdIn.isEmpty()) {
boolean b = BinaryStdIn.readBoolean();
if (b != old) {
BinaryStdOut.write(run, LG_R);
run = 1;
old = !old;
}
else {
if (run == R-1) {
BinaryStdOut.write(run, LG_R);
run = 0;
BinaryStdOut.write(run, LG_R); // 为什么要计数0呢?
}
run++;
}
}
BinaryStdOut.write(run, LG_R);
BinaryStdOut.close();
}
游程编码的问题
尽管游程编码算法很高效,但是在处理文本压缩就没那么高效了。我们需要其他的算法。
从图中可以看出 416 / 96 = 433% ,文件越压缩越大了。