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 数据结构
151,122 每月下载量
用于 93 个crate (2 直接)
175KB
857 行
esaxx-rs
此代码实现了一个快速的后缀树/后缀数组。
此代码来自 并由
使用。
对 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);