4 个版本
0.1.3 | 2021年5月15日 |
---|---|
0.1.2 | 2021年2月11日 |
0.1.1 | 2021年1月30日 |
0.1.0 | 2021年1月30日 |
在 压缩 中排名 273
56KB
587 行
rscompress
一个以科学数据为重点的 Rust 压缩库。
免责声明
这是在我作为博士生期间开发的一些压缩算法的重写和合并。
- https://github.com/ucyo/huffman
- https://github.com/ucyo/pzip-cli
- https://github.com/ucyo/pzip-bwt
- https://github.com/ucyo/pzip-redux
- https://github.com/ucyo/pzip-huffman
- https://github.com/ucyo/pzip
- https://github.com/ucyo/rust-compress
- https://github.com/ucyo/adaptive-lossy-compression
- https://github.com/ucyo/information-spaces
- https://github.com/ucyo/cframework
- https://github.com/ucyo/xor-and-residual-calculation
- https://github.com/ucyo/climate-data-analysis
论文可以从 https://doi.org/10.5445/IR/1000105055 下载。
架构
该库分为一个基础库和四个支持库。基础库负责协调支持库。所有压缩算法都遵循相同的基本结构。
- 使用转换来解相关数据
- 如果需要有损压缩,则逼近数据
- 编码数据
此外,检查每一步是否按预期执行。
+----------------+ lossless +----------+
| | | |
Start +------> | Transformation | +------------> | Coding | +------> End
| | | |
+----------------+ +----------+
+ ^
| |
| lossy |
| |
v |
|
+---------------+ |
| | |
| Approximation | +------------------------+
| |
+---------------+
此库将遵循相同的原理。
转换
转换是使用不同的字母表表示相同信息的算法。好的转换算法可以消除数据中的冗余信息。数学函数可以看作是一系列数据的转换。这个系列 1 1 2 3 5 8 13 21 ..
可以表示为 f(x) = f(x-1) + f(x-2)
。我们将字母表 A(整数)中表示的信息映射到字母表 B(字母和整数)上,这使得信息更加紧凑。需要注意的是,所有转换都必须有两个属性
- 将转换算法应用于数据,不会丢失信息。
- 所有转换算法都是可逆的,可以从新的字母表重新构建原始表示。
逼近
近似算法是牺牲信息以获得更好压缩的算法。给定一个阈值theta
(这可以是绝对值或相对值),算法将数据从字母表A映射到B,信息损失在预期的阈值范围内。一个近似算法的例子是来自小学的~=
运算符,例如1/3 ~= 0.3
。近似算法具有以下特性
- 将近似算法应用于数据会导致信息损失。
- 近似算法是不可逆的。
- 信息损失保证在阈值
theta
内。
编码
编码是在实际压缩发生的地方的算法。信息以尽可能紧凑的方式保存到磁盘上。例如,有Huffman或算术编码。
校验和
校验和是检查数据在每个步骤中完整性的算法,例如Adler-32。
依赖关系
~330–610KB
~12K SLoC