功能说明
示例用 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 可验证提前返回。