#trie #search #word #node #weight #algorithm

autocomplete

使用 Trie 数据结构的 Rust 自动完成功能

4 个版本

0.1.3 2023 年 10 月 26 日
0.1.2 2023 年 10 月 23 日
0.1.1 2023 年 10 月 23 日
0.1.0 2023 年 10 月 23 日

#1450数据结构

21 每月下载量

MIT 许可证

8KB
60

自动完成

github crates.io docs.rs build status

描述

Dictionary 结构存储一组单词,每个单词都有其对应的权重。在这个结构中,每个单词都表示为树中的路径,路径上的每个节点对应单词中的一个字符。终端节点同时保存单词及其权重。

这些终端节点存储完整的单词以加速查找,消除了回溯和从单个字符重建单词的需要。权重用于对结果向量中的条目进行排序,其中权重更大的单词将位于开头。

pub struct Dictionary<T> {
    entries: BTreeMap<char, Dictionary<T>>,
    terminal: Option<Terminal<T>>,
}

struct Terminal<T> {
    weight: T,
    word: String,
}

例如,单词

A, 1
AA, 5
ABC, 3

将表示为

Dictionary {
    terminal: None,
    entries: {
        'A': Dictionary {
            terminal: Some({
                weight: 1,
                word: "A",
            })
            entries: {
                'A': Dictionary {
                    terminal: Some({
                        weight: 5,
                        word: "AA"
                    }),
                    entries: {},
                },
                'B': Dictionary {
                    terminal: None,
                    entries: {
                        'C': Dictionary {
                            termainal: Some({
                                weight: 3,
                                word: "ABC",
                            })
                            entries: {},
                        },
                    },
                },
            },
        },
    },
}

用法

buildbuild_without_weights 方法提供了一种方便的方式来从单词列表初始化和构建 Dictionary 对象,带有或不带权重。这些方法抽象掉了手动将每个单词插入字典的细节,使您在代码中创建和使用 Dictionary 对象变得更容易。

// Example using build method
let words_with_weights = vec![
    ("A".to_string(), 1),
    ("AA".to_string(), 5),
    ("ABC".to_string(), 3),
];

let dictionary = Dictionary::<usize>::build(words_with_weights);

// Example using build_without_weights method
let words = vec![
    "A".to_string(),
    "AA".to_string(),
    "ABC".to_string(),
];

let dictionary_unweighted = Dictionary::<usize>::build_without_weights(words);

要按前缀查询 Dictionary,请使用 words 方法。

// Example using words
dictionary.words("A")
// [
//     ("AA", 5), 
//     ("ABC", 3), 
//     ("A", 1), 
// ]

安装

该软件包可在 crates.io 获取

许可证

本项目采用 MIT 许可证。有关详细信息,请参阅 LICENSE 文件。

无运行时依赖