2个版本
0.1.1 | 2024年6月5日 |
---|---|
0.1.0 | 2024年6月2日 |
#211 in 压缩
每月60次下载
21KB
416 行
Big Lehmer
Big Lehmer是一个库,用于在任意大小的序列排列之间进行紧凑的Lehmer码转换,以及转换回未压缩的表示形式。
数字序列必须具有类似[0.N].shuffle
的性质。基本上是随机顺序的连续数字,从零开始。该库在技术上支持高达u32::MAX
的数字,但性能将是主要问题。
用法
fn main() {
let sequence = [7, 2, 0, 6, 5, 1, 4, 3];
let lehmer_code = big_lehmer::encode(&sequence).unwrap();
let mut roundtrip = [0; 8];
big_lehmer::decode(&lehmer_code, &mut roundtrip).unwrap();
assert_eq!(sequence, roundtrip);
}
基准测试
在我的“旧系统”上测量(i7-6700k)。不太准确,只是为了展示性能预期。
序列长度 | Lehmer码大小 | 编码时间 | 解码时间 |
---|---|---|---|
512 | 4485字节 | 470.70µs | 107.40µs |
10_000 | 14808字节 = 15 KB | 2.40ms | 4.11ms |
100_000 | 2311111字节 = ~2.2 MiB | 61.21ms | 205.44ms |
1_000_000 | 2311111字节 = ~2.2 MiB | 2.15s | 11.39s |
该包主要针对大型序列进行优化。
对于大型序列的性能主要由大整数数学决定。一个可能的优化是用rug替换Dashu。显然rug(=GMP)优化得非常好,但不是原生Rust,并且不是那么容易就能工作。
依赖项
~2.5MB
~53K SLoC