6 个版本

0.2.0 2022 年 7 月 25 日
0.1.4 2021 年 10 月 20 日
0.1.3 2019 年 12 月 6 日
0.1.2 2019 年 11 月 21 日
0.1.0 2018 年 10 月 17 日

#1243 in 数据结构

Download history 2025/week @ 2024-04-08 2951/week @ 2024-04-15 3219/week @ 2024-04-22 2201/week @ 2024-04-29 3105/week @ 2024-05-06 3291/week @ 2024-05-13 3440/week @ 2024-05-20 3706/week @ 2024-05-27 3731/week @ 2024-06-03 3472/week @ 2024-06-10 2768/week @ 2024-06-17 4793/week @ 2024-06-24 4013/week @ 2024-07-01 3569/week @ 2024-07-08 3219/week @ 2024-07-15 3364/week @ 2024-07-22

14,568 每月下载量
9 个软件包中使用(通过 lrtable

Apache-2.0/MIT

15KB
210

Build Status Latest version Documentation

稀疏向量 (SparseVec)

SparseVec 高效地编码一个整数二维矩阵。输入矩阵必须编码为一个带有行长的一维整数向量。给定一个空值,SparseVec 使用 [1] 中描述的行位移进行压缩,并进一步使用 PackedVec 编码结果。

[1] Tarjan, Robert Endre, and Andrew Chi-Chih Yao. "Storing a sparse table." Communications of the ACM 22.11 (1979): 606-611.

用法

extern crate sparsevec;
use sparsevec::SparseVec;

fn main() {
    use sparsevec::SparseVec;
    let v:Vec<usize> = vec![1,0,0,0,
                            0,0,7,8,
                            9,0,0,3];
    let sv = SparseVec::from(&v, 0, 4);
    assert_eq!(sv.get(0,0).unwrap(), 1);
    assert_eq!(sv.get(1,2).unwrap(), 7);
    assert_eq!(sv.get(2,3).unwrap(), 3);
}

工作原理

以下描述了稀疏向量的行位移的一般概念,不包括实现中的某些额外优化。以下以二维向量为例

1 0 0
2 0 0
3 0 0
0 0 4

表示为一个行长为 3 的一维向量 v = [1,0,0,2,0,0,3,0,0,0,0,4]。将此向量存储在内存中是浪费的,因为其大部分元素是 0。我们可以使用行位移压缩此向量,将所有行合并到一个向量中,使得没有两个非零条目映射到同一个位置。对于上述示例,这将产生压缩向量 c = [1,2,3,0,4]

1 0 0
  2 0 0
    3 0 0
    0 0 4
---------
1 2 3 0 4

要从压缩向量中检索值,我们需要一个位移向量,它描述了在压缩过程中每行移动了多少。对于上面的例子,位移向量将是 d = [0, 1, 2, 2]。为了检索位置(2, 0)的值,我们可以使用 pos = d[row] + col 来计算它的压缩位置。

pos = d[2] + 0 // =2
value = c[pos] // =3

依赖项

~0.6–1.2MB
~26K SLoC