#double-array #search #trie #multiple-values #heap-allocation

yada

Yada 是一个旨在实现快速搜索和紧凑数据表示的另一种双数组 trie 库

每月 9 个不稳定版本

0.5.1 2024 年 2 月 25 日
0.5.0 2021 年 11 月 1 日
0.4.1 2021 年 11 月 1 日
0.4.0 2020 年 10 月 10 日
0.1.0 2020 年 9 月 20 日

#38算法

Download history 124240/week @ 2024-04-23 213097/week @ 2024-04-30 234121/week @ 2024-05-07 208673/week @ 2024-05-14 210409/week @ 2024-05-21 100820/week @ 2024-05-28 58468/week @ 2024-06-04 228853/week @ 2024-06-11 111682/week @ 2024-06-18 93344/week @ 2024-06-25 49467/week @ 2024-07-02 73331/week @ 2024-07-09 99694/week @ 2024-07-16 89106/week @ 2024-07-23 170118/week @ 2024-07-30 275276/week @ 2024-08-06

638,108 次每月下载
46 个 crate (8 个直接使用) 中使用

MIT/Apache 许可

36KB
768

Yada: 另一种双数组

crate-name at crates.io crate-name at docs.rs

Yada 是一个旨在实现快速搜索和紧凑数据表示的另一种双数组 trie 库。

特性

  • 构建静态双数组 trie
    • Yada 采用类似 Darts-clone 的双数组节点的紧凑二进制表示。
  • 公共前缀搜索
    • 该方法返回一个 Iterator,这是一种有效的方法,可以在不进行堆分配的情况下找到多个值。
  • 精确匹配搜索
    • 该方法通过 Option 找到与精确匹配键关联的值。

要求

  • Rust 版本 >= 1.46.0

用法

有关详细信息,请参阅 示例代码

构建双数组 trie

use yada::builder::DoubleArrayBuilder;

// make a keyset which have key-value pairs
let keyset = &[
    ("a".as_bytes(), 0),
    ("ab".as_bytes(), 1),
    ("abc".as_bytes(), 2),
    ("b".as_bytes(), 3),
    ("bc".as_bytes(), 4),
    ("c".as_bytes(), 5),
];

// build a double-array trie binary
let da_bytes: Option<Vec<u8>> = DoubleArrayBuilder::build(keyset);

通过键搜索条目

use yada::DoubleArray;

// create a double-array trie instance
let da = DoubleArray::new(da_bytes.unwrap());

// exact match search
for (key, value) in keyset {
    assert_eq!(da.exact_match_search(key), Some(*value as u32));
}
assert_eq!(da.exact_match_search("abc".as_bytes()), Some(2));
assert_eq!(da.exact_match_search("abcd".as_bytes()), None);

// common prefix search
assert_eq!(
    da.common_prefix_search("abcd".as_bytes())
        .collect::<Vec<_>>(),
    vec![(0, 1), (1, 2), (2, 3)] // match "a", "ab", "abc", value and key length
);
assert_eq!(
    da.common_prefix_search("d".as_bytes()).collect::<Vec<_>>(),
    vec![] // don't match
);

限制

  • 值必须表示为 31 位无符号整数,类型为 u32
    • Yada 使用最高位(MSB)作为标志来区分值节点和其他节点。
  • 双数组节点的偏移量为 29 位宽,因此可以表示高达 ~536M 个节点。
    • 这意味着这个限制导致双数组的最大大小约为 ~2GB。

许可

许可方式之一

任选其一。

贡献

除非您明确声明,否则您提交给工作的任何有意贡献,根据 Apache-2.0 许可证的定义,应按上述方式双许可,不得添加任何额外的条款或条件。

参考文献

无运行时依赖项