#dictionary #prefix #search #character #tree-structure #data-structure

prefix_dictionary

类似于字典的数据结构,但允许按前缀进行搜索

2 个版本

0.0.2 2024 年 5 月 30 日
0.0.1 2024 年 5 月 30 日

#890数据结构

MIT 许可证

7KB
102

PrefixDictionary

PrefixDictionary 类似于字典,但允许通过前缀进行搜索。它的底层结构是 n 叉树。

它是关于数据的泛型(模板),但最常见的使用是与字符一起。

伪代码

a = PrefixDictionary("dictionary", "lapin", "lapins", "lapine")

  • a.contains("dict") -> as_prefix 因为 "dict" 不在单词列表中,但仅是一个前缀
  • a.contains("dictionary") -> as_word 因为 "dictionary" 是一个实际的单词,且不再有单词存在
  • a.contains("lapin") -> as_prefix | as_word 因为 "lapin" 既是单词也是前缀(对于 "lapins" 和 "lapine")
  • a.contains("tutu") -> None 因为 tutu 不在字典中

注意

在上述示例中,只读取单词 "tutu" 的第一个字母 t,因为我们知道(从字典的结构中),没有单词以字母 t 开头。

示例

pub fn test_simple_1() {
    let mut dict = PrefixDictionary::new();
    dict.feed(&["dictionary", "lapin", "lapins", "lapine"]);
    assert_eq!(4, dict.len());

    let mut result = dict.contains("dict");
    assert!(result.is_some());
    assert_eq!(result.unwrap(), SearchResult::AS_PREFIX);

    result = dict.contains("lapin");
    assert!(result.is_some());
    assert_eq!(result.unwrap(), SearchResult::AS_PREFIX | SearchResult::AS_WORD);

    result = dict.contains("dictionary");
    assert!(result.is_some());
    assert_eq!(result.unwrap(), SearchResult::AS_WORD);

    result = dict.contains("tutu");
    assert!(result.is_none());
}

依赖项

~110KB