2 个版本
0.1.1 | 2021年7月29日 |
---|---|
0.1.0 | 2021年7月18日 |
#344 in 压缩
780KB
919 行
lzd-rs
此库提供了 LZ 双因子分解的 Rust 实现,这是一种高效的基于语法的压缩算法,由以下论文提出:
K Goto, H Bannai, S Inenaga, 和 M Takeda. LZD 分解:具有可变到固定编码的简单实用在线语法压缩。 在 CPM,2015。
示例
因子分解
use lzd::compressor::Compressor;
fn main() {
// Input text
let text = "abaaabababaabbabab".as_bytes();
// Factorization
let mut factors = Vec::new();
let defined_factors = Compressor::run(text, |id: usize| {
factors.push(id);
});
// Output factors
println!("factors: {:?}", factors);
// Statistics
println!("defined_factors: {:?}", defined_factors);
}
输出将为
factors: [97, 98, 97, 97, 256, 256, 256, 257, 98, 98, 258]
defined_factors: 261
注意:在此实现中,所有 256 个单字符都被预定义为目标,因此定义的目标数量将变为 261。
反因子分解
use lzd::decompressor::Decompressor;
fn main() {
// Input text
let factors = [97, 98, 97, 97, 256, 256, 256, 257, 98, 98, 258];
// Defactorization
let mut text = String::new();
Decompressor::run(&factors, |c: u8| {
text.push(c as char);
});
// Decoded text
println!("text: {:?}", text);
}
输出将为
text: "abaaabababaabbabab"
命令行工具
此库提供了两个命令行工具用于压缩和解压缩。通过指定参数 -h
,工具将打印命令行选项。
在工具中,LZ 目标以与 tudocomp 的 tdc::BitCorder
相同的方式序列化到二进制流中。
lzd
命令
它压缩输入数据并将结果写入扩展名为 lzd
的文件。在以下情况下,english.50MB.lzd
将作为压缩文件写入。
$ lzd english.50MB
Compressed filename will be /home/kampersanda/dataset/pizzachili/text/english/english.50MB.lzd
52428800 bytes were compressed into 16426243 bytes (31.33%)
52428800 characters were factorized into 6354129 LZD-factors (12.12%)
3177320 LZD-factors were defined
unlzd
命令
它解压缩压缩文件并将原始数据写入没有扩展名 lzd
的文件。在以下情况下,english.50MB
将作为解压缩文件写入。
$ ./target/release/unlzd english.50MB.lzd
许可证
此库是在 MIT 下提供的免费软件。
依赖项
~0.6–1MB
~10K SLoC