#abbreviation #trie-node #correct #retrieval #aliases #capabilities #daily

alias_trie

支持别名节点的 trie。它可以轻松快速地处理由于缩写、缩写或日常语法中的缩写引起的语法歧义,并提供正确快速的检索能力。

2 个版本

0.9.1 2020 年 9 月 19 日
0.9.0 2020 年 9 月 19 日

#4#trie-node

MIT 许可证

16KB
321

alias_trie

支持别名节点的 trie。它可以轻松快速地处理由于缩写、缩写或日常语法中的缩写引起的语法歧义,并提供正确快速的检索能力。


lib.rs:

alias_trie 是一个支持别名节点的 trie。可以为每个节点设置一个或多个别名,以便可以通过别名检索存储的值。不幸的是,搜索路径中的别名可能冲突,使得无法定位特定的节点。这种情况称为语法歧义,搜索无法使用歧义语法完成。

alias_trie 可以轻松快速地处理由于缩写、缩写或日常语法中的缩写引起的语法歧义,并提供正确快速的检索能力。

ROOT
↙        ↘
A(a): 1        G: 5
↙      ↓     ↘                // The alias "f" conflicts.
B       C: 4    D(d,dd): 2       // The path "A->d->f" is an ambiguous grammar.
↓              ↙       ↘
E(eee): 2     F1(f): 3    F2(f,f2): 4

用法

这个crate在crates.io上,可以通过将 alias_trie 添加到你的项目的 Cargo.toml 依赖中来实现。

[dependencies]
alias_trie = "0.9"

示例

use alias_trie::Trie;
use alias_trie::UniqueOption;

let mut trie = Trie::new();

trie.insert(&["A"], 1);
trie.insert(&["A", "B", "E"], 2);
trie.insert(&["A", "C"], 4);
trie.insert(&["A", "D"], 2);
trie.insert(&["A", "D", "F1"], 3);
trie.insert(&["A", "D", "F2"], 4);
trie.insert(&["G"], 5);

trie.update_aliases(&["A", "B", "E"], &[&["a"], &[], &["eee"]]);
trie.update_aliases(&["A", "D", "F1"], &[&[], &["d", "dd"], &["f"]]);
trie.update_aliases(&["A", "D", "F2"], &[&[], &[], &["f", "f2"]]);

assert_eq!(trie.get(&["a", "d", "F1"]), UniqueOption::Some(&3));
assert_eq!(trie.get(&["a", "d", "f2"]), UniqueOption::Some(&4));
assert_eq!(trie.get(&["a", "d", "f"]), UniqueOption::NonUnique);
assert_eq!(trie.get(&["a", "d", "g"]), UniqueOption::None);

!

依赖

~2.2–3MB
~53K SLoC