12个版本

0.3.1 2022年1月23日
0.3.0 2022年1月23日
0.2.4 2022年1月22日
0.2.3 2021年8月11日
0.1.2 2021年5月27日

1486 in 数据结构

31 monthly downloads

MIT 许可协议

2.5MB
4K SLoC

Docs Matrix CI Discussions

SDSL-RS

紧凑数据结构库的Rust接口 (SDSL-lite)。

简介

SDSL-lite 是一个C++11库,它实现了紧凑数据结构。例如结构包括:任意宽度的整数向量、小波树和压缩后缀数组。该库在生物信息学等领域中得到广泛应用。

该库提供的许多数据结构都是使用C++ 模板 定义的。当从非C++语言与库进行接口时,这提出了挑战。SDSL-RS的主要目标是从Rust语言中与库进行接口的繁重工作!

进展

以下列表包括所有将要支持的结构。该列表是从这里找到的cheatsheet中派生出来的。

列表中已勾选的项目目前已被支持。近期目标是支持每个部分的每个数据结构。

请联系聊天频道以进行优先级请求。

完整结构状态列表

整数向量

  • IntVector

位向量

  • BitVector (普通位向量)
  • BitVectorIl (交错位向量)
  • RrrVector (H0压缩位向量)
  • SdVector (稀疏位向量)
  • HybVector (混合位向量)

排名支持

  • RankSupportV
  • RankSupportV5
  • RankSupportScan
  • RankSupportIl
  • RankSupportRrr
  • RankSupportSd
  • RankSupportHyb

选择支持

  • SelectSupportMcl
  • SelectSupportScan
  • SelectSupportIl
  • SelectSupportRrr
  • SelectSupportSd

小波树

  • WtHuff
  • WtInt
  • WtRlmn
  • WtGmr
  • WtAp
  • WmInt
  • WtBlcd
  • WtHutu

压缩后缀数组

  • CsaBitcompressed
  • CsaSada
  • CsaWt

最长公共前缀数组

  • LcpBitcompressed
  • LcpDac
  • LcpByte
  • LcpWt
  • LcpVlc
  • LcpSupportSada
  • LcpSupportTree
  • LcpSupportTree2

平衡括号支持

  • BpSupportG
  • BpSupportGg
  • BpSupportSada

压缩后缀树

  • CstSada
  • CstSct3

范围最小/最大查询

  • 支持稀疏表(RmqSupportSparseTable)
  • 简明RmqSuccintSada
  • 简明RmqSuccintSct

需求

SDSL-lite

SDSL-lite必须在开发环境中可编译。需求信息请参阅此处

常见的缺失依赖包括libdivsufsort-dev

SDSL-RS

SDSL-RS使用了const generics,因此可能需要Rust 工具链的beta版本。

使用SDSL-RS的项目必须包含一个构建脚本build.rs),内容如下

// build.rs
fn main() {
    match sdsl::build() {
        Ok(_) => {}
        Err(e) => panic!("Error: {}", e),
    };
}

因此,项目的Cargo.toml文件必须包含一个build-dependencies部分,例如

[dependencies]
sdsl = "0.3.0"
# ... other dependencies ...

[build-dependencies]
sdsl = "0.3.0"

sdsl::build()函数调用允许SDSL-RS分析当前项目的代码库(通过MIR)并在顶级target目录中构建适当的接口。添加SDSL-RS后的项目初始编译需要一些时间,因为SDSL-lite作为依赖项进行编译。后续编译应该很快。

示例

一个示例项目可以在此处找到。它包含所有支持的数据结构的示例。

此示例展示了如何构建一个H0压缩位向量(sdsl::bit_vectors::RrrVector

let bv = sdsl::bit_vector! {1, 1, 0, 1};
let rv = sdsl::bit_vectors::RrrVector::<sdsl::int_vectors::IntVector<0>, 10, 2>::new(&bv)?;

let result = rv.get_bv_element(2);
let expected = 0;
assert_eq!(result, expected);

依赖

~7–17MB
~215K SLoC