11 个版本

0.1.10 2023 年 10 月 5 日
0.1.9 2023 年 10 月 5 日
0.1.8 2022 年 6 月 6 日
0.1.7 2021 年 9 月 2 日
0.1.1 2020 年 6 月 6 日

#91 in 数据结构

Download history 35818/week @ 2024-04-12 42924/week @ 2024-04-19 41744/week @ 2024-04-26 43230/week @ 2024-05-03 41486/week @ 2024-05-10 55611/week @ 2024-05-17 53034/week @ 2024-05-24 56266/week @ 2024-05-31 62931/week @ 2024-06-07 53945/week @ 2024-06-14 60277/week @ 2024-06-21 49899/week @ 2024-06-28 40371/week @ 2024-07-05 34849/week @ 2024-07-12 39923/week @ 2024-07-19 30080/week @ 2024-07-26

151,122 每月下载量
用于 93 个crate (2 直接)

Apache-2.0

175KB
857

esaxx-rs

此代码实现了一个快速的后缀树/后缀数组。

此代码来自 sentencepiece 并由 hugging face 使用。

对 sentencepiece 的 esaxx 后缀数组 C++ 库的简单封装。用法

let string = "abracadabra";
let suffix = esaxx_rs::suffix(string).unwrap();
let chars: Vec<_> = string.chars().collect();
let mut iter = suffix.iter();
assert_eq!(iter.next().unwrap(), (&chars[..4], 2)); // abra
assert_eq!(iter.next(), Some((&chars[..1], 5))); // a
assert_eq!(iter.next(), Some((&chars[1..4], 2))); // bra
assert_eq!(iter.next(), Some((&chars[2..4], 2))); // ra
assert_eq!(iter.next(), Some((&chars[..0], 11))); // ''
assert_eq!(iter.next(), None);

lib.rs:

对 sentencepiece 的 esaxx 后缀数组 C++ 库的简单封装。用法

#[cfg(feature="cpp")]
{
let string = "abracadabra";
let suffix = esaxx_rs::suffix(string).unwrap();
let chars: Vec<_> = string.chars().collect();
let mut iter = suffix.iter();
assert_eq!(iter.next().unwrap(), (&chars[..4], 2)); // abra
assert_eq!(iter.next(), Some((&chars[..1], 5))); // a
assert_eq!(iter.next(), Some((&chars[1..4], 2))); // bra
assert_eq!(iter.next(), Some((&chars[2..4], 2))); // ra
assert_eq!(iter.next(), Some((&chars[..0], 11))); // ''
assert_eq!(iter.next(), None);
}

前一个版本使用未经验证的优化 C++ 代码。存在另一个稍慢一些的实现(大约慢 2 倍),它使用安全的 Rust。它稍慢是因为它使用 usize(通常是 64 位)而不是 i32(32 位)。但它似乎解决了 cpp 版本中的一些 OOB 问题(在测试中似乎从未引起真正的问题,但仍然。)

let string = "abracadabra";
let suffix = esaxx_rs::suffix_rs(string).unwrap();
let chars: Vec<_> = string.chars().collect();
let mut iter = suffix.iter();
assert_eq!(iter.next().unwrap(), (&chars[..4], 2)); // abra
assert_eq!(iter.next(), Some((&chars[..1], 5))); // a
assert_eq!(iter.next(), Some((&chars[1..4], 2))); // bra
assert_eq!(iter.next(), Some((&chars[2..4], 2))); // ra
assert_eq!(iter.next(), Some((&chars[..0], 11))); // ''
assert_eq!(iter.next(), None);

无运行时依赖