#permutations #lehmer

big_lehmer

big_lehmer是一个框架,用于将大数序列编码(压缩)和解码为Lehmer码

2个版本

0.1.1 2024年6月5日
0.1.0 2024年6月2日

#211 in 压缩

Download history 222/week @ 2024-05-30 96/week @ 2024-06-06 5/week @ 2024-06-13

每月60次下载

MIT/Apache

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