← 中文资源

简体中文版本

带权重的 Rust 前缀树补全

把单词与权重插入字符字典树,按前缀深度遍历收集候选,再按权重降序、单词升序排序并截断到指定数量。

阅读英文原文

功能说明

示例用 HashMap<char, Node> 构建前缀树,每个节点可携带一个 Option<u32> 权重。insert 逐字符向下创建节点,最后写入权重;complete 先走到前缀节点,再深度优先收集所有带权重的单词,按权重降序、单词升序排序,最后截断到 limit 条。

关键代码

let mut node = &self.root;
for character in prefix.chars() {
    match node.children.get(&character) {
        Some(next) => node = next,
        None => return Vec::new(),
    }
}

按 char 而不是字节遍历,中文、emoji 等多字节字符不会被拆开。

使用注意

  • 权重为 None 的中间节点不会出现在结果里,只作为路径存在。
  • 收集阶段会遍历整个前缀子树,前缀很短且词库很大时开销明显。
  • 排序使用稳定比较,同权重按单词字典序,输出可复现。
  • 插入不做去重计数,重复插入只会覆盖权重。
  • 结构非线程安全,并发读写需要 RwLock 或分片。

验证方式

示例插入 rust、runner、runtime、ruby、go 后,查询 ru 限制 3 条应返回 [("rust", 10), ("runner", 7), ("runtime", 5)];查询 xyz 返回空。把 limit 改为 0 可验证提前返回。