18个版本
0.8.1 | 2021年7月24日 |
---|---|
0.7.3 | 2020年9月12日 |
0.7.0 | 2020年7月2日 |
0.5.3 | 2020年3月25日 |
#938 in 数据结构
在4个crate中使用(通过mop-blocks)
76KB
1.5K SLoC
ndsparse
用于存储和检索N维稀疏数据的结构。好吧,不是任何 N ∈ ℕ
,而是任何适合您所使用机器指针大小的自然数。例如,一个8位微控制器可以操作多达255维的任何稀疏结构。
对于可能想知道为什么应该使用这个crate的人来说,它通常归结为空间效率、性能和检索速度。以下代码片段展示了使用 _cube_of_vecs
作为最不高效的所有潜在用例。
let _vec_of_options: Vec<Option<i32>> = Default::default();
let _matrix_of_options: [Option<[Option<i32>; 8]>; 16] = Default::default();
let _cube_of_vecs: Vec<Vec<Vec<i32>>> = Default::default();
// The list worsens exponentially for higher dimensions
有关更多信息,请参阅这篇博客文章。
示例
use ndsparse::{coo::CooArray, csl::CslVec};
fn main() -> ndsparse::Result<()> {
// A CSL and COO cube.
//
// ___ ___
// / / /\
// /___/___/ /\
// / 1 / /\/2/
// /_1_/___/ /\/
// \_1_\___\/ /
// \___\___\/
let coo = CooArray::new([2, 2, 2], [([0, 0, 0], 1.0), ([1, 1, 1], 2.0)])?;
let mut csl = CslVec::default();
csl
.constructor()?
.next_outermost_dim(2)?
.push_line([(0, 1.0)].iter().copied())?
.next_outermost_dim(2)?
.push_empty_line()?
.next_outermost_dim(2)?
.push_empty_line()?
.push_line([(1, 2.0)].iter().copied())?;
assert_eq!(coo.value([0, 0, 0]), csl.value([0, 0, 0]));
assert_eq!(coo.value([1, 1, 1]), csl.value([1, 1, 1]));
Ok(())
}
支持的结构
- 压缩稀疏行(CSL)
- 坐标格式(COO)
特性
no_std
无退出标志- 不同的存储(数组、Vec、Slice等)
- 完全文档化
- 模糊测试
- 无不安全
可选特性
alloc
和std
- 绑定(Py03,wasm-bindgen)
- 反序列化/序列化(serde)
- 并行迭代器(rayon)
- 随机实例(rand)
未来
尽管CSR和COO是通用的稀疏结构,但它们在特定情况下并不足够好,因此存在DIA、JDS、ELL、LIL、DOK等许多其他结构。
如果对此有足够的兴趣,提到的稀疏存储可能会在未来的某个时候添加。
代数库
由于该项目自身的自包含责任和复杂性,该项目不是也不会成为一个稀疏代数库。此外,此类库的良好实现需要大量关于不同算法、操作、分解、求解器和硬件的工作和研究。
替代方案
以下库中的任何一个可能更适合您
依赖关系
~99–610KB
~13K SLoC